雑記+備忘録

OS中心の技術情報と趣味について(最近は主に将棋)。備忘録なのでここに書かれたことを試すのは自己責任でお願いします。

PowerShellでADのグループメンバーを追加、削除

(2017/3/15追記)もっとシンプルにできました。
 コメントいただいた「素敵なおひげ」さんありがとうございました。

$user = Get-ADUser -Filter {(Name -like "*山田*") -And (Name -like "*太郎*")}

Remove-ADGroupMember "千葉支店_課長" -Members $user.DistinguishedName -Confirm:$false

Add-ADGroupMember "千葉支店_部長" -Members $user.DistinguishedName -Confirm:$false

最初うまくいかなかったのは「-Members」の引数に「Select-Object」で抽出したオブジェクトをもってきていたのが良くなくて、
「素敵なおひげ」さんのアドバイス通り、Get-ADUserで得たオブジェクトの「DistinguishedName」プロパティをもってきたらうまくいきました。
(追記ここまで)

基本的には「Add-ADGroupMember」「Remove-ADGroupMember」を使えばよいのですが、
メンバーの指定方法で苦戦したのでメモ。

これも要点だけ先に記載すると「-Members」の引数としては以下の4種類が指定可能とのことです。
MicrosoftTechNetコマンドリファレンスによる)
・識別名
  例:CN=山田 太郎,OU=東京本社,OU=スーパーさ部,DC=test,DC=local
・GUID(ObjectGUID)
・セキュリティ識別子(するObjectSID)
・セキュリティアカウントマネージャ(SAM)アカウント名(sAMAccountName)

で、SamAccountNameを指定してコマンドを実行すると、
ドメイン下にユーザーが存在しない」といった意味のメッセージが表示されます。

間にOUが挟まっているせいか、と識別名で指定することにします。
識別名を呼び出すために、

Get-ADUser -Filter {(Name -like "*山田*") -And (Name -like "*太郎*")} | Select DistinguishedName

フィルターの条件は「Name -eq “山田 太郎"」でも良かったのですが、
今回のシステムでユーザーを作る際に姓と名の間のスペースが半角か全角か統一されていない可能性があったので、
少しひねってみました。(こういうAnd条件が使えるということも見たかった)
→ただこれだと「小山田 太郎」さんとかいたらひっかかるか。要再考。
で、普通にこれを実行すると、「DistinguishName」が「オブジェクトとして」出力されるので、
「-Members」の引数に指定すると「型が変換できません」とエラーメッセージが表示されます。

で、文字列変換するために、

Get-ADUser -Filter {(Name -like "*山田*") -And (Name -like "*太郎*")} | Select DistinguishedName | Out-String

今度は「ゼロ文字列行」「DistinguishedName」「—————–」「CN=~」の4行の文字列として認識され、
そんなメンバーいないとエラーメッセージ。

抽出した値だけを文字列にしたいんだ。
探すと、以下が使えるようです。
(参考(ありがとうございます):http://stknohg.hatenablog.jp/entry/2015/08/23/235304

Get-ADUser -Filter {(Name -like "*山田*") -And (Name -like "*太郎*")} | Select DistinguishedName | Out-String -Stream

画面上の出力は先ほどと同じですが、表示される4行が文字列の配列の形になっているので、
変数に格納した際に以下のように使えます。

$a = Get-ADUser -Filter {(Name -like "*山田*") -And (Name -like "*太郎*")} | Select DistinguishedName | Out-String -Stream

Remove-ADGroupMember "千葉支店_課長" -Members $a[3] -Confirm:$false

Add-ADGroupMember "千葉支店_部長" -Members $a[3] -Confirm:$false

「-Confirm:$false」は「-Confirm $false」ではないのでこれも注意するポイントです。