循环调用Get-MgUser返回结果重复问题求助
问题:Get-MgUser查询返回重复结果
我有一个包含9个唯一DisplayName的TXT文件,读取到数组后循环调用Get-MgUser cmdlet查询,结果每个用户ID都返回了两次。
相关代码
#Display names list path $DnPath = "C:\dirname\filname.txt" #Display names array $DnArr = get-content -path $DnPath $DnArr | Foreach-Object { Get-Mguser -search displayname:$_ -ConsistencyLevel eventual -Property id | Select-Object -Property id }
执行结果(每个ID均重复)
0eaba174-fab6-4cda-bf09-92391d586d48 15fb3a43-d8a1-4348-8e31-8f5814a38a69 1f08022d-85ba-40ba-9b79-c201c8f477b0 30792149-52da-44ec-9709-1911244bb183 6a4290f2-6397-4d58-9d20-e0b46a7d5d3d 714d794c-3e43-40a8-b752-ed04b2748016 a032dc91-28e6-49f4-bcea-1bbacf2f1a00 cfcf7c8a-5cfa-4362-ae7f-bad6bb1f4b66 e9704b2c-dbdd-4654-89a0-defe38bcadb7 6a4290f2-6397-4d58-9d20-e0b46a7d5d3d cfcf7c8a-5cfa-4362-ae7f-bad6bb1f4b66 e9704b2c-dbdd-4654-89a0-defe38bcadb7 714d794c-3e43-40a8-b752-ed04b2748016 30792149-52da-44ec-9709-1911244bb183 15fb3a43-d8a1-4348-8e31-8f5814a38a69 1f08022d-85ba-40ba-9b79-c201c8f477b0 0eaba174-fab6-4cda-bf09-92391d586d48 a032dc91-28e6-49f4-bcea-1bbacf2f1a00
解决方案
原因分析
用-search参数时,Graph API是部分匹配逻辑,可能有多个用户的DisplayName包含当前搜索字符串(比如大小写差异、简称与全名的包含关系),或者API的分页机制导致重复返回。既然你确认TXT文件是9个唯一值,核心问题大概率出在搜索匹配逻辑上。
解决办法
- 精确匹配DisplayName
改用-Filter参数做精确匹配,彻底避免部分匹配带来的冗余结果:
$DnArr | Foreach-Object { Get-MgUser -Filter "DisplayName eq '$_'" -Property id | Select-Object -Property id }
如果DisplayName包含单引号,需要提前转义:
$DnArr = Get-Content -Path $DnPath | ForEach-Object { $_.Replace("'", "''") }
- 结果去重处理
如果必须使用-Search,在最终结果后添加去重步骤:
$DnArr | Foreach-Object { Get-Mguser -search "displayname:$_" -ConsistencyLevel eventual -Property id | Select-Object -Property id } | Select-Object -Property id -Unique
- 验证数组内容
确认读取的数组没有隐形重复(比如空行、空格差异):
$DnArr | Get-Unique
如果输出不是9个值,清理TXT文件或读取时过滤:
$DnArr = Get-Content -Path $DnPath | Where-Object { $_ -ne '' } | Get-Unique
内容的提问来源于stack exchange,提问作者aJ-47
相关产品推荐
相关产品推荐

