ひょっとしたら使うかもしれないので、 久々に 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"
簡単ですが、以上です。