web-dev-qa-db-ja.com

ドメインのすべてのユーザーのリストをエクスポートする必要がありますが、DSQUERYまたはDSGETに精通していませんか?

以下をエクスポートするクエリを作成するのに本当に苦労しています。アカウントFirstName LastNameユーザーが存在するOU

理想的には、CSVとして希望します。ドメインコントローラーにアクセスできませんが、DSQUERY/DSGET/etcを実行できます。私のPCから。

6
Neil

ツールに応じて、次のことができます

dsquery user dc=contoso,dc=com | dsget user -samid -fn -ln -dn > names.csv 

これにより、スペースで区切られたアカウント名、名、姓、場所のリストが作成されます。

それを真のcsvに変換するには、もう少し作業が必要です。

$userList=dsquery user dc=contoso,dc=com | dsget user -samid -fn -ln -dn
foreach ($user in $userList) {
    $outstring=$user.trim(" ") -replace('\s+',',')
    write-Host  `"$outstring`"
}

次のような出力が得られます

"samid","fn","ln","dn"
"jarey.boe","jarey","boe","cn=jarey.boe,ou=users,dc=contoso,dc=com"
5
sysadmin1138

dsqueryは機能しますが、1つ以上のスペース(\ s +)で分割することによるCSVへの変換は微妙です。スペースが埋め込まれた属性値は、残りの値を右にシフトします。また、デフォルトでは、dsqueryは100個のオブジェクトを出力した後に停止します。 "-limit 0"はすべての結果を出力します。

コマンドラインからこれを行う正しい方法は、csvdeを使用することです。

csvde -f names.csv -r "(&(objectClass=user)(objectCategory=user))" -l samAccountName,givenName,sn

必須のPowerShellメソッドは次のとおりです。

$a = [adsisearcher]'(&(objectClass=user)(objectCategory=user))'
$a.PageSize = 1000
$a.PropertiesToLoad.AddRange(@('samAccountName','givenName','sn','distinguishedName'))
$a.FindAll() | ForEach-Object {
    $b = $_.properties
    $op = '' | select DN,sAMAccountName,sn,givenName
    $op.DN = $b.distinguishedname[0]
    if ($b.samaccountname) { $op.samAccountName = $b.samaccountname[0] }
    if ($b.givenname) { $op.givenName = $b.givenname[0] }
    if ($b.sn) { $op.sn = $b.sn[0] }
    $op
} | Export-Csv names3.csv -NoTypeInformation
6
charleswj81