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

是否可在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:09:04