「PowerShell Advent Calendar 2012」向け第3弾!!
グループとユーザーの管理といえば、Forefront Identity Managerでスマートに処理するとかVBScriptでゴリゴリ書いていたりしました。今の時代、サクっと作るのならPowerShellが楽ちんです。ということで、以下の要件で遊んでみます。
【要件】CSVでグループのメンバーを管理する
【テスト環境】
・OU:Osakaに以下の二人のユーザーが所属する。
・ユーザー:ChukiTestはou内のグループには入っていない
・ユーザー:hogehogeはadminグループとuserグループに所属している
【目標】
ユーザー:ChukiTestをOsakaのdirectorとuserグループに所属させ、hogehogeはuserグループのみとする
【方針】
CSV一行を読んだ後、そのユーザーが所属するグループすべて方一旦削除して、その後それぞれのグループへ所属させる
【CSV】
test.csv
name,group1,group2,group3
ChukiTest,”CN=director,OU=Osaka,OU=wankuma,DC=chukitest,DC=local”," CN=user,OU=Osaka,OU=wankuma,DC=chukitest,DC=local”
hogehoge,"CN=user,OU=Osaka,OU=wankuma,DC=chukitest,DC=local”
1、まず初めに困ること:CSVの取り込み
通常はユーザーごとに所属するグループ数が違うため、CSVの列も可変長になります。さて、ここで困るのがCSVが基本的には列の数が固定なので微妙に扱えない。可変長の場合、Excelを使って突っ込むなんてのが楽です。今回はActive Directoryの話に絞りたいので読み込みに関しては以下のリンク先などをご覧ください。
ご参考⇒フォルダー内にあるエクセルのデータをPowershell で取得する。 ≪ Windows Server 2012 Essentials と Windows SBS を中心とした雑記
http://wsbs.wordpress.com/2012/02/25/folder/
ということで、まずは読み込んだデータを突っ込むための変数を作ってみましょう。{名前、グループの配列}というオブジェクトを作ってみます
$objRow = New-Object PSObject| select Name,Groups
$objRow.Groups = New-Object System.Collections.ArrayList
とりあえず、オブジェクトには直接値を突っ込んでおきます。
$objRow.Name = "ChukiTest"
$objRow.Groups = @("CN=user,OU=Osaka,OU=wankuma,DC=chukitest,DC=local"
,"CN=director,OU=Osaka,OU=wankuma,DC=chukitest,DC=local")
2、現在所属しているグループから外す
ユーザーが入っているグループのうち、OUに所属するものだけを取得して削除しましょう。BUILTINなどから外すと後々面倒なので……
あと、-confirm:$falseをつけておかないと、毎行確認が表示されます。
$objUser = Get-ADUser hogehoge -Properties memberof
$objMemberGroup = $objUser | select MemberOf -ExpandProperty MemberOf | ? {$_ -like "*,OU=wankuma,*"}
$objMemberGroup | foreach { Remove-ADGroupMember $_ $objUser.Name -Confirm:$false }
3、Groupsに読み込まれた新しいグループへユーザーを追加する
ここは、単にforeachで回すだけです。
$objRow.Groups | foreach { Add-ADGroupMember $_ $objRow.Name}
4、あとは、これをCSVの行数分を繰り返すだけ
以上、さっくり出来上がり^^
従来のVBSと比べて楽になった点は、リダイレクトが多様できるため、いちいち変数に保存する必要がないため行数は短くなりました。
個人的な感想ではVBSとくらべて2/3位は減っていると思います。
また、VBSでゴリゴリ書くよりもITProに見やすくなっていると感じます。
ということで、是非ADの管理にはPowerShellを使いましょう^^/