PowerShell中Get-MgGroupMember数组匹配失败求助:类型不匹配问题
PowerShell数组匹配问题:字符串与PSCustomObject的比较错误
我在PowerShell中遇到数组成员匹配失败的问题,明明确认成员同时存在于两个数组中,但判断逻辑始终返回False,求指出逻辑错误。
背景与实现代码
需求是基于成员属性(如DisplayName和Surname)的搜索字符串,在Entra中筛选特定组内的成员。由于Get-Mg*的-Filter调用存在限制,采用了以下方法:
$groupName = 'staff' # 目标组为staff组 $userMatchString = 'Be' # 匹配字符串,比如匹配名字含Be的用户 $domainMatch = 'example.com' # 限定自定义域名,排除外部来宾 # 获取目标组信息 $group = Get-MgGroup -Filter "DisplayName eq '$($groupName)'" # 获取该组所有成员的ID $groupMemberIds = Get-MgGroupMember -GroupId $group.id -ConsistencyLevel eventual -All | Select-Object Id # 搜索符合条件的Entra用户 # 因Graph筛选限制,分属性单独查询 $userMatches = @(Get-MgUser -ConsistencyLevel eventual -Count userCount -Filter "startsWith(DisplayName, '$($userMatchString)')" | Where-Object { $_.Mail -like "*@$($domainMatch)" }) $userMatches += @(Get-MgUser -ConsistencyLevel eventual -Count userCount -Filter "startsWith(Surname, '$($userMatchString)')" | Where-Object { $_.Mail -like "*@$($domainMatch)" })
此时$groupMemberIds包含目标组的所有成员ID,$userMatches包含所有符合属性匹配的Entra用户(可能在组内或组外)。
已确认$userMatches的第一条记录确实存在于$groupMemberIds中:
$groupMemberIds | Where-Object { $_.Id -eq $userMatches[0].Id }
但以下判断逻辑始终返回全False,无法正确匹配:
$userMatches | ForEach-Object { $($_.Id -in $groupMemberIds) }
问题排查更新
通过类型检查发现问题根源:我在拿字符串和PSCustomObject做比较。
$userMatches[0].Id.gettype() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object $groupMemberIds[0].gettype() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False PSCustomObject System.Object
解决思路
方法1:将
$groupMemberIds转换为纯字符串数组
修改获取组成员ID的代码,用Select-Object -ExpandProperty Id直接提取ID字符串,而非保留PSCustomObject结构:$groupMemberIds = Get-MgGroupMember -GroupId $group.id -ConsistencyLevel eventual -All | Select-Object -ExpandProperty Id之后原判断逻辑即可正常工作:
$userMatches | ForEach-Object { $_.Id -in $groupMemberIds }方法2:在判断时指定PSCustomObject的Id属性
如果需要保留$groupMemberIds的PSCustomObject结构,可在比较时明确引用属性:$userMatches | ForEach-Object { $_.Id -in $groupMemberIds.Id }方法3:直接筛选组内用户
也可以一步筛选出$userMatches中属于目标组的用户:$userMatchesInGroup = $userMatches | Where-Object { $_.Id -in $groupMemberIds.Id }
内容的提问来源于stack exchange,提问作者tb1
相关产品推荐
相关产品推荐

