是否可在Spark代码中获取Azure AAD的用户与用户组信息?
Azure Synapse PySpark Notebook 获取AAD组及成员方案
方案1:调用Microsoft Graph API(推荐)
前置准备
- 为Synapse工作区的系统分配托管身份授予Microsoft Graph的应用权限:
Group.Read.All、User.Read.All,配置完成后需要点击「授予管理员同意」才会生效。
实现代码
import requests # 1. 获取托管身份的Graph API访问令牌 graph_token = mssparkutils.credentials.getToken("https://graph.microsoft.com") req_headers = {"Authorization": f"Bearer {graph_token}"} # 2. 拉取全租户AAD用户组 all_groups = [] groups_url = "https://graph.microsoft.com/v1.0/groups?$select=id,displayName" while groups_url: resp = requests.get(groups_url, headers=req_headers) resp.raise_for_status() resp_data = resp.json() all_groups.extend(resp_data.get("value", [])) # 处理分页数据 groups_url = resp_data.get("@odata.nextLink") # 3. 遍历组拉取组成员(仅保留用户类型成员,过滤组、服务主体等其他类型成员) group_user_mapping = [] for group in all_groups: group_id = group["id"] group_name = group["displayName"] members_url = f"https://graph.microsoft.com/v1.0/groups/{group_id}/members?$select=id,displayName,userPrincipalName" while members_url: member_resp = requests.get(members_url, headers=req_headers) member_resp.raise_for_status() member_data = member_resp.json() for member in member_data.get("value", []): if member.get("@odata.type") == "#microsoft.graph.user": group_user_mapping.append({ "组ID": group_id, "组名称": group_name, "用户ID": member["id"], "用户显示名": member["displayName"], "用户主体名": member["userPrincipalName"] }) members_url = member_data.get("@odata.nextLink") # 4. 转为Spark DataFrame供后续分析使用 group_user_df = spark.createDataFrame(group_user_mapping) group_user_df.show(truncate=False)
方案2:读取预同步的AAD数据(可选)
如果你的租户已经通过Azure AD Connect等工具将AAD组、用户数据同步到了关联的Azure SQL Database/ADLS存储中,可以直接在PySpark中连接对应的存储/数据库读取同步后的数据,无需调用Graph API。
注意事项
- 遇到Graph API限流报错时,可添加指数退避重试逻辑避免请求失败
- 如果需要获取嵌套组的所有层级成员,将请求路径中的
/members替换为/transitiveMembers即可 - 不要使用委托权限配置,仅应用权限支持拉取全租户的AAD组和用户数据
内容的提问来源于stack exchange,提问作者WhoamI
相关产品推荐
相关产品推荐

