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

簡単ですが、以上です。