我需要导出我们域上所有用户的列表,但我不熟悉 DSQUERY 或 DSGET?

我需要导出我们域上所有用户的列表,但我不熟悉 DSQUERY 或 DSGET?

我真的很难创建导出以下内容的查询:帐户 FirstName LastName 用户所在的 OU

理想情况下,我希望将其作为 CSV。我无法访问域控制器,但可以从我的电脑运行 DSQUERY/DSGET/等。

答案1

根据您的工具,您可以这样做

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"

答案2

dsquery 可以工作,但通过一个或多个空格 (\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

相关内容