ひょっとしたら使うかもしれないので、 久々に PowerShell を使用して ADのユーザーを検索したり、存在チェックをするスクリプトを書いてみました。
今回作成するスクリプトは次のものです。
- listsamaccount.ps1 指定されたADのパス配下のユーザーの一覧のsAMAccountName を取得します
- listunexistuser.ps1 パイプラインで入力されたsAMAccountName を引数で指定されたADのパス配下から検索し、存在しないsAMAccountの一覧を返します
1. listsamaccount.ps1
ユーザーのsAMAccountNameの一覧を取得します。引数で検索するルートのパスを指定できるようになっています。
####################################################### # $path配下のユーザーのsAMAccount の一覧を取得する # パラメータ # $path : 検索のルートとなるLDAP接続文字列を指定する # 例 - LDAP://OU=DCRM,DC=dcrm01,DC=local ####################################################### param($path=$null) #$searchRoot = New-Object System.DirectoryServices.DirectoryEntry($path) $searchRoot = [adsi] $path $ds = New-Object System.DirectoryServices.DirectorySearcher $searchRoot $ds.PageSize = 1000 $filter = "(objectCategory=User)" $ds.Filter = $filter $result = $ds.FindAll() $result | %{ $_.Properties.samaccountname } exit
使う場合は、 .\listunexistuser.ps1 "LDAP://OU=DCRM,DC=dcrm01,DC=LOCAL" のように使用します。
2. listunexistuser.ps1
パイプラインから入力されたsAMAccountName に一致するユーザーがいない場合にそのユーザーをパイプラインの出力に返します。
####################################################### # $path配下のユーザーを sAMAccountNameをフィルタ条件 # と指定検索し、存在しないsAMAcountName の一覧を出力する # パラメータ # $path : 検索のルートとなるLDAP接続文字列を指定する # 例 - LDAP://OU=DCRM,DC=dcrm01,DC=local ####################################################### param($path=$null) $searchRoot = [adsi] $path foreach($name = in $input){ $ds = [ADSISearcher] "(&(objectClass=User)(sAMAccountName=$($name)))" $ds.SearchRoot = $searchRoot $result = $ds.FindOne() if($result -eq $null){ $name } }
使用する場合は、次のように実行します。
$a = .\listsamaccount.ps1
$a | .\listunexistuser.ps1 "LDAP://OU=DCRM,DC=dcrm01,DC=LOCAL"
簡単ですが、以上です。