用户Get-ADUser列出所有属性并导出到.csv

时间:2014-11-21 18:00:46

标签: powershell

我试图查看我拥有的用户列表,并希望获得一些属性(DisplayName,Office)以在表格中显示,然后将表格转换为.csv。

我一直在与之合作:

$Users = gc "C:\scripts\Users.txt
foreach ($User in $Users) {
Get-ADUser -Identity $User -Properties DisplayName,Office
}

那很好,我可以将它与"选择DisplayName,Office"但如果我做了一个" Out-File -append"它看起来很可怕。我想我应该用数组或哈希表来做这个,但是我一直在阅读它们并且不太了解如何自动化可以导出的数据。感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:8)

这可以通过完全跳过where对象和$ users声明来简化。您所需要的只是:

<强>代码

get-content c:\scripts\users.txt | get-aduser -properties * | select displayname, office | export-csv c:\path\to\your.csv

答案 1 :(得分:4)

查询所有用户并按文本文件中的列表进行过滤:

$Users = Get-Content 'C:\scripts\Users.txt'
Get-ADUser -Filter '*' -Properties DisplayName,Office |
    Where-Object { $Users -contains $_.SamAccountName } |
    Select-Object DisplayName, Office |
    Export-Csv 'C:\path\to\your.csv' -NoType

Get-ADUser -Filter '*'返回所有AD用户帐户。然后将此用户对象流传送到Where-Object过滤器,如果其SamAccountName属性包含在输入文件($Users)的用户列表中,则会检查每个对象。只有具有匹配帐户名的对象才会传递到管道的下一步。在导出数据之前,输出可以受selecting相关属性的限制。

您可以使用hashtable lookups替换-contains运算符来进一步优化代码:

$Users = @{}
Get-Content 'C:\scripts\Users.txt' | ForEach-Object { $Users[$_] = $true }

Get-ADUser -Filter '*' -Properties DisplayName,Office |
    Where-Object { $Users.ContainsKey($_.SamAccountName) } |
    Select-Object DisplayName, Office |
    Export-Csv 'C:\path\to\your.csv' -NoType

答案 2 :(得分:0)

@AnsgarWiechers - 当您对目标帐户进行有针对性的搜索时,查询所有内容然后修剪结果并不是我的经验。虽然,是的,选择您需要返回的属性也更有效。

以下示例基于20,000个帐户对象范围内的域。

DEFINE VARIABLE mAmount AS DECIMAL FORMAT "zzz,zzz,zz9" NO-UNDO.
ASSIGN mAmount = 100000000.
DISPLAY mAmount WITH FRAME a.
DISPLAY mAmount FORMAT "zzzzzz,zz9" WITH FRAME b.

在第二个示例中,$ userlist包含368个帐户名称(只是字符串,而不是预先获取的帐户对象)。

请注意,如果我根据您的建议添加measure-command {Get-ADUser -Filter '*' -Properties DisplayName,st } ... Seconds : 16 Milliseconds : 208 measure-command {$userlist | get-aduser -Properties DisplayName,st} ... Seconds : 3 Milliseconds : 496 条款以修剪实际所需的结果,则会更加昂贵。

where

索引属性似乎具有相似的性能(我尝试返回measure-command {Get-ADUser -Filter '*' -Properties DisplayName,st |where {$userlist -Contains $_.samaccountname } } ... Seconds : 17 Milliseconds : 876 )。

即使我在集合中返回所有用户帐户属性,它也会更有效率。 (在下面添加一个select语句会使其缩短半秒)。

displayName

我无法找到一份关于AD查询链接的好文档,但是您在搜索范围内的每个帐户都会返回属性。这讨论了执行有效AD查询的基础知识 - 范围和过滤:https://msdn.microsoft.com/en-us/library/ms808539.aspx#efficientadapps_topic01

当您的搜索范围为&#34; *&#34;时,您仍然在构建一个(大)对象列表并迭代每个对象。 LDAP搜索过滤器总是更有效地首先构建列表(或者是一个狭窄的搜索库,它再次构建一个较小的列表来查询)。