Microsoft Graph:如何获取特定企业应用的应用角色分配用户
问题原因与解决方案
为什么/users?$filter=appRoleAssignments/any(a:a/resourceId eq {enterprise app obj id})会失败?
这是因为Microsoft Graph API对顶层集合(如/users)的跨层级筛选支持有限。虽然appRoleAssignments是用户的导航属性,但在/users集合层面,不允许通过any()筛选器跨实体查询嵌套的resourceId属性。而针对单个用户的/users/{id}/appRoleAssignments接口,是直接对该用户的appRoleAssignments集合进行筛选,属于同一层级的查询,因此语法是被支持的。
简单来说:Graph API不支持在顶层用户集合上,通过嵌套的应用角色分配属性来过滤用户。
替代解决方案
既然/servicePrincipal/{id}/appRoleAssignments(你提到的appRolesAssignedTo应为笔误,正确接口是这个)能获取分配记录,但存在重复用户和需手动处理组传递性的问题,可以这样优化:
去重用户记录
调用接口后,在客户端根据返回结果中的principalId(用户ID)进行去重——同一个用户可能被分配多个应用角色,会多次出现在结果里。处理组的传递性分配
接口返回的principalType会标记主体是User还是Group:- 若为
User,直接保留记录; - 若为
Group,调用/groups/{groupId}/transitiveMembers/microsoft.graph.user获取该组下的所有用户(含嵌套组的成员),再将这些用户合并到结果中去重。
- 若为
简化操作的PowerShell选项
借助Microsoft Graph PowerShell模块可以更高效处理:# 获取目标企业应用的所有角色分配记录 $assignments = Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId "{enterprise app obj id}" # 提取直接分配的用户ID并去重 $userIds = $assignments | Where-Object {$_.PrincipalType -eq "User"} | Select-Object -ExpandProperty PrincipalId -Unique # 处理组分配的传递性用户 $groupIds = $assignments | Where-Object {$_.PrincipalType -eq "Group"} | Select-Object -ExpandProperty PrincipalId -Unique foreach ($groupId in $groupIds) { $groupUsers = Get-MgGroupTransitiveMember -GroupId $groupId -Filter "Microsoft.Graph.User" | Select-Object -ExpandProperty Id $userIds += $groupUsers } # 最终去重并获取完整用户信息 $uniqueUserIds = $userIds | Select-Object -Unique $targetUsers = Get-MgUser -UserId $uniqueUserIds
这样就能得到所有分配了该企业应用任一角色的用户列表,且无重复。
内容的提问来源于stack exchange,提问作者Dino Prašo
相关产品推荐
相关产品推荐

