我有一个如下所示的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
...
答案 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不要求它们是唯一的,因此它不会对该属性编制索引,并且必须搜索每个用户对象,以查找在其代理地址集合中具有该电子邮件地址的用户对象。