我遇到了 PowerShell 语法问题:我似乎无法将一个数组的成员与另一个数组匹配,但我可以确认这两个数组中都存在这些成员。有人可以指出我的逻辑错误吗?
背景:
我想根据成员属性的搜索字符串(例如 DisplayName 和 Surname)在 Entra 中搜索特定组的所有成员。考虑到 Get-Mg* -filter 调用的限制,我想出了这种方法:
$groupName = 'staff' # all results should be in staff group
$userMatchString = 'Be' # e.g. [Be]n Smith, Jim [Be]am...
$domainMatch = 'example.com' # custom domain - no Entra guests
## choose a central M365 group filter
$group = get-mggroup -Filter "DisplayName eq '$($groupName)'"
$groupMemberIds=Get-MgGroupMember -GroupId $group.id -ConsistencyLevel eventual -All | select Id
## find Entra users matching a search string
## Due to graph filter limitations we do separate calls per attribute
$userMatches=@(Get-MgUser -ConsistencyLevel eventual -Count userCount -Filter "startsWith(DisplayName, '$($userMatchString)')" | where { $_.Mail -like "*@$($domainMatch)"})
$userMatches+=@(Get-MgUser -ConsistencyLevel eventual -Count userCount -Filter "startsWith(Surname, '$($userMatchString)')" | where { $_.Mail -like "*@$($domainMatch)" })
此时
$groupMemberIds
包含每个符合条件的要搜索的人,$userMatches
包含每个 Entra 搜索结果(可能在组中,也可能不在组中)。
这确认(对于我的结果集)第一条记录已经是匹配项:
$groupMemberIds | where { $_.Id -eq $userMatches[0].Id }
有人可以帮我解决(groupMemberIds)中(任何 userMatches )的语法吗?
这不起作用 - 它对所有这些都返回“false”:
$userMatches | ForEach-Object { $($_.Id -in $groupMemberIds) }
有什么想法吗?谢谢!
我不确定您指的是哪个限制,但您想要实现的目标肯定可以通过 OData 过滤器实现。我不确定您是否可以使用
Get-MgGroupMember
cmdlet 执行此操作,但使用 Invoke-MgGraphRequest
您可以执行以下操作:
$groupName = 'staff' # all results should be in staff group
$userMatchString = 'Be' # e.g. [Be]n Smith, Jim [Be]am...
$domainMatch = 'example.com' # custom domain - no Entra guests
$group = Invoke-MgGraphRequest GET "v1.0/groups?$filter=displayName eq '$groupName'"
$groupId = $group.value.Id
$uri = "v1.0/groups/$groupId/members?`$filter=startsWith(displayName, '$userMatchString') and endsWith(mail, '$domainMatch')&`$count=true"
$result = do {
$response = Invoke-MgGraphRequest GET $uri -Headers @{
ConsistencyLevel = 'eventual'
}
$uri = $response.'@odata.nextLink'
if ($response.value) {
$response.value
}
}
while ($uri)