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

如何通过Azure AD服务主体用Graph API/Python查询企业应用权限用户/组?

当然可以实现!你已经通过服务主体完成登录,接下来用Microsoft Graph API就能轻松获取拥有Azure AD企业应用访问权限的用户和组,下面分两种方式给你详细说明:

一、直接调用Microsoft Graph REST API

首先你需要确认服务主体已经被授予Application.Read.All和Directory.Read.All的应用权限(注意是应用权限,不是委派权限),并且已经完成管理员同意。

步骤如下:

  1. 先获取目标企业应用的servicePrincipalId:
    你可以通过调用这个接口搜索企业应用:

    GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq '你的企业应用名称'
    

    从返回结果里提取id字段,这就是servicePrincipalId。

  2. 调用应用角色分配列表接口:
    用拿到的servicePrincipalId发起请求:

    GET https://graph.microsoft.com/v1.0/servicePrincipals/{servicePrincipalId}/appRoleAssignedTo
    

    这个接口会返回所有被分配了该企业应用角色的主体,包括用户和组。返回结果里的principalType字段可以用来区分:User代表用户,Group代表组。

二、用Python代码实现(借助Microsoft Graph SDK)

如果你更习惯用代码操作,可以用Microsoft Graph的Python SDK来实现,步骤如下:

  1. 先安装依赖包:

    pip install msgraph-core azure-identity
    
  2. 编写代码:

    from azure.identity import ClientSecretCredential
    from msgraph_core import GraphClient
    
    # 配置服务主体信息
    tenant_id = "你的租户ID"
    client_id = "服务主体的客户端ID"
    client_secret = "服务主体的客户端密码"
    
    # 创建凭据和Graph客户端
    credential = ClientSecretCredential(tenant_id, client_id, client_secret)
    graph_client = GraphClient(credential=credential)
    
    def get_app_role_assignments(service_principal_id):
        # 调用接口获取应用角色分配
        response = graph_client.get(f"/servicePrincipals/{service_principal_id}/appRoleAssignedTo")
        response.raise_for_status()
        assignments = response.json()['value']
    
        # 区分用户和组
        users = []
        groups = []
        for assignment in assignments:
            if assignment['principalType'] == 'User':
                users.append({
                    'id': assignment['principalId'],
                    'displayName': assignment['principalDisplayName'],
                    'appRole': assignment['appRoleId']
                })
            elif assignment['principalType'] == 'Group':
                groups.append({
                    'id': assignment['principalId'],
                    'displayName': assignment['principalDisplayName'],
                    'appRole': assignment['appRoleId']
                })
        return users, groups
    
    # 替换成你的企业应用servicePrincipalId
    target_app_id = "xxx-xxx-xxx-xxx"
    assigned_users, assigned_groups = get_app_role_assignments(target_app_id)
    
    print("拥有访问权限的用户:")
    for user in assigned_users:
        print(f"- {user['displayName']} (ID: {user['id']})")
    
    print("\n拥有访问权限的组:")
    for group in assigned_groups:
        print(f"- {group['displayName']} (ID: {group['id']})")
    

注意:运行代码前,确保服务主体已经被授予对应的应用权限并完成管理员同意,否则会出现权限不足的错误。

内容的提问来源于stack exchange,提问作者oglop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:16:12