Import-CSV和Foreach使用Get-ADUser

时间:2015-01-23 14:52:14

标签: powershell csv active-directory

我有一个如下所示的CSV文件:

name    
fname1lname1@companyemail.com  
fname2lname2@companyemail.com  
...

我想遍历每个电子邮件地址并查询该地址的AD以获取用户对象ID。我已经能够使用脚本执行此操作,但我希望能够使用一行来完成此操作。

这是我到目前为止所做的:

import-csv -path .\csv_file.csv | foreach-object { get-aduser -filter { proxyaddresses -like "*$_.name*} | select name } | out-file .\results.csv

这显然不起作用,我知道它与我在foreach循环中处理$ _对象的方式有关。

我希望输出看起来像:

fname1lname1@companyemail.com,userID1  
fname2lname2@companyemail.com,userID2
...

2 个答案:

答案 0 :(得分:2)

您正在对属性proxyaddresses进行过滤,但这不是Get-AdUser返回的默认属性集的一部分。您的代码也有错误的",这可能是复制粘贴错误。

Import-CSV -Path .\csv_file.csv | ForEach-Object { 
    Get-ADUser -Filter "ProxyAddresses -like '*$($_.name)*'"  -Properties ProxyAddresses,EmailAddress | select EmailAddress,SamAccountName 
} | Export-CSV .\results.csv -NoTypeInformation

-Filter can be tricky有时候正在寻找字符串输入。将整个事物用引号括起来并使用子表达式来确保变量$_.Name被正确扩展并且具有围绕它的星号。

由于您还在寻找emailaddress,我们也将其添加到属性列表中。我假设第二列是samaccountname

我们也使用Export-CSV,因为这样可以获得漂亮的CSV输出。

答案 1 :(得分:2)

如果您使用的是Exchange,那么使用Exchange cmdlet会更加简单和快捷:

Import-CSV -Path .\csv_file.csv | ForEach-Object { 
Get-Recipient $_ |
Select PrimarySMTPAddress,SamAccountName 
} | Export-CSV .\results.csv -NoTypeInformation

Exchange要求所有电子邮件地址都是唯一的,并维护它自己的内部数据库,该数据库使用电子邮件地址作为主索引,因此它几乎可以立即返回与该电子邮件地址一起使用的DN和SamAccountName。

AD不要求它们是唯一的,因此它不会对该属性编制索引,并且必须搜索每个用户对象,以查找在其代理地址集合中具有该电子邮件地址的用户对象。