PowerShell使用姓名CSV执行Active Directory查询报错问题问询
问题解答
1. 报错代码的核心问题
- 文件读取逻辑错误:你使用的是无表头的单行文本文件,
Import-Csv会默认将第一行姓名识别为列名,你调用的$_.user/$_.users不存在对应字段,返回空值,直接触发-Identity参数的空值校验报错。 - 参数使用不符合规则:
Get-ADUser的-Identity参数仅支持传入AD用户的可分辨名称(DN)、GUID、安全标识符(SID)、SAM账户名四类值,不支持直接传入Name字段,就算你正确读取到姓名,直接传给-Identity也会报错。 - 姓名同时对应
Name、DisplayName等多个字段不是本次报错的直接原因,属于后续匹配逻辑需要处理的问题。
2. 以姓名为输入的代码调整方案
不需要修改CSV文件,直接调整查询逻辑即可:
- 替换文件读取命令:无表头的单行文本文件直接用
Get-Content读取,无需使用Import-Csv - 替换
-Identity参数为-Filter参数,指定按Name字段匹配 - 增加空值过滤、未匹配/重名场景的兼容逻辑
调整后的可运行代码如下:
# 读取姓名列表,过滤空行 Get-Content "C:\ps\users_list.csv" | Where-Object { $_ -match '\S' } | ForEach-Object { $currentName = $_.Trim() # 按AD的Name字段匹配查询,可根据需要修改为DisplayName $matchedUsers = Get-ADUser -Filter "Name -eq '$currentName'" -Properties UserPrincipalName, SamAccountName if ($null -eq $matchedUsers) { # 未匹配到用户的场景标记 [PSCustomObject]@{ Name = $currentName SamAccountName = "未匹配到AD用户" UserPrincipalName = "未匹配到AD用户" } } else { # 匹配到1个/多个用户都直接输出 $matchedUsers | Select-Object Name, SamAccountName, UserPrincipalName } } | Export-Csv "C:\ps\users_ad_list.csv" -NoTypeInformation -Encoding UTF8
如果需要同时匹配Name和DisplayName字段,将Filter条件修改为"Name -eq '$currentName' -or DisplayName -eq '$currentName'"即可。
内容的提问来源于stack exchange,提问作者Luca Sepe
相关产品推荐
相关产品推荐

