You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:07:22