📝
Active Directory:ユーザーの所属グループをCSV出力
オンプレAD環境でユーザーのアクセス権を整理するために所属グループをCSV出力するPowerShellを書いてみた。
前提条件
- ドメインコントローラーにコンソールかリモートデスクトップでログオンして操作する
- 管理者の PC から操作する場合は、Active Directory モジュールが使えること
処理の中身
- ステップ1:ユーザーの所属グループを3つまでCSV出力(アカウント名,所属グループ1,2,3)
Member.csv
"SamAccountName","MemberOf1","MemberOf2","MemberOf2"
"test-user01","CN=sec-member01,OU=testOU01,OU=User,DC=test,DC=com","CN=sec-member02,OU=group,DC=test,DC=com","CN=sec-member03,OU=group,DC=test,DC=com"
- ステップ2:CN(セキュリティグループ名)のみに置換
正規表現を使って、CNのみにする。これが最終的に出力されるCSVの中身になる。
Member.csv
"SamAccountName","MemberOf1","MemberOf2","MemberOf3"
"test-user01","sec-member01","sec-member02","sec-member03"
- MemberOf1,SamAccountNameで並び替え
- Shift_JISでCSV出力
完成したスクリプト
Import-Module ActiveDirectory
# 表示が切れる場合は、画面バッファサイズ変更
# $bufferSize = (Get-Host).UI.RawUI.BufferSize
# $windowSize = (Get-Host).UI.RawUI.WindowSize
# $bufferSize.Width = 1000
# $bufferSize.Height = 1000
# $windowSize.Width = 120
# $windowSize.Height = 50
# (Get-Host).UI.RawUI.BufferSize = $bufferSize
# (Get-Host).UI.RawUI.WindowSize = $windowSize
# 取得したいOUを指定
# 例:"OU=User,DC=test,DC=com"
$GetOU = "OU=〇〇,DC=〇〇,DC=〇〇"
# 出力するファイル名を指定
$OutFile = "Member.csv"
#OU配下のユーザーの所属グループを3つまで書き出し
#より多くの所属グループを書き出したい場合は、 @{L="MemberOf*"; E={$_.MemberOf[*]}} を追加する。
Get-ADUser -Filter * -SearchBase $GetOU -SearchScope Subtree -Properties MemberOf |
Select-Object SamAccountName,@{L="MemberOf1"; E={$_.MemberOf[0]}},`
@{L="MemberOf2"; E={$_.MemberOf[1]}},`
@{L="MemberOf3"; E={$_.MemberOf[2]}} |
Export-Csv $OutFile -Encoding Default -NoTypeInformation
# 不要な文字を削除 (CNのみに置換)
$(Get-Content $OutFile) |
ForEach-Object {$_ -replace("CN=(.*?),.*?(?=`")",'$1')} |
Out-File $OutFile -Encoding default
これも一旦CSVに出力して、不要な文字を削除してから並び替えしてるので、スマートじゃないけど、とりあえず欲しい情報をとれた。
参考
関連スクリプト
Discussion