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

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应为笔误,正确接口是这个)能获取分配记录,但存在重复用户和需手动处理组传递性的问题,可以这样优化:

  1. 去重用户记录
    调用接口后,在客户端根据返回结果中的principalId(用户ID)进行去重——同一个用户可能被分配多个应用角色,会多次出现在结果里。

  2. 处理组的传递性分配
    接口返回的principalType会标记主体是User还是Group:

    • 若为User,直接保留记录;
    • 若为Group,调用/groups/{groupId}/transitiveMembers/microsoft.graph.user获取该组下的所有用户(含嵌套组的成员),再将这些用户合并到结果中去重。
  3. 简化操作的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:25:05