如何通过Azure AD服务主体用Graph API/Python查询企业应用权限用户/组?
当然可以实现!你已经通过服务主体完成登录,接下来用Microsoft Graph API就能轻松获取拥有Azure AD企业应用访问权限的用户和组,下面分两种方式给你详细说明:
一、直接调用Microsoft Graph REST API
首先你需要确认服务主体已经被授予Application.Read.All和Directory.Read.All的应用权限(注意是应用权限,不是委派权限),并且已经完成管理员同意。
步骤如下:
先获取目标企业应用的
servicePrincipalId:
你可以通过调用这个接口搜索企业应用:GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq '你的企业应用名称'从返回结果里提取
id字段,这就是servicePrincipalId。调用应用角色分配列表接口:
用拿到的servicePrincipalId发起请求:GET https://graph.microsoft.com/v1.0/servicePrincipals/{servicePrincipalId}/appRoleAssignedTo这个接口会返回所有被分配了该企业应用角色的主体,包括用户和组。返回结果里的
principalType字段可以用来区分:User代表用户,Group代表组。
二、用Python代码实现(借助Microsoft Graph SDK)
如果你更习惯用代码操作,可以用Microsoft Graph的Python SDK来实现,步骤如下:
先安装依赖包:
pip install msgraph-core azure-identity编写代码:
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
相关产品推荐
相关产品推荐

