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

无法通过Microsoft Graph Python SDK获取用户ID与邮箱,求解决方案

问题描述

我需要获取用户的邮箱和ID(以便通过邮箱识别用户)。根据微软文档编写了代码尝试检索用户信息,但运行时报错,代码及错误信息如下:

原代码

import asyncio
import configparser

from azure.identity.aio import ClientSecretCredential
from msgraph import GraphServiceClient
from msgraph.generated.users.item.user_item_request_builder import UserItemRequestBuilder

def main():
    # Load settings
    config = configparser.ConfigParser()
    config.read(['config.cfg', 'config.dev.cfg'])
    azure_settings = config['azure']

    credentials = ClientSecretCredential(
        azure_settings['tenantId'],
        azure_settings['clientId'],
        azure_settings['clientSecret'],
    )
    scopes = ['https://graph.microsoft.com/.default']
    client = GraphServiceClient(credentials=credentials, scopes=scopes)
    query_params = UserItemRequestBuilder.UserItemRequestBuilderGetQueryParameters(select=['id', 'mail', ])

    request_config = UserItemRequestBuilder.UserItemRequestBuilderGetRequestConfiguration(query_parameters=query_params)
    users = asyncio.run(client.users.get(request_config))
    print(users)

报错信息

Traceback (most recent call last):
  File "C:\Users\PycharmProjects\ProcessEmailReceipts\microsoft_graph.py", line 35, in <module>
    main()
  File "C:\Users\PycharmProjects\ProcessEmailReceipts\microsoft_graph.py", line 28, in main
    request_config = UserItemRequestBuilder.UserItemRequestBuilderGetRequestConfiguration(query_parameters=query_params)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: type object 'UserItemRequestBuilder' has no attribute 'UserItemRequestBuilderGetRequestConfiguration'

确认SDK仓库中不存在该类,求问如何用Python SDK获取所有用户的ID和邮箱?

解决方案

问题根源是错误使用了针对单个用户的UserItemRequestBuilder,而获取用户列表需要使用针对用户集合的构建器类。以下是修正后的完整代码:

import asyncio
import configparser

from azure.identity.aio import ClientSecretCredential
from msgraph import GraphServiceClient
from msgraph.generated.users.users_request_builder import UsersRequestBuilder

async def get_users():
    # 加载配置
    config = configparser.ConfigParser()
    config.read(['config.cfg', 'config.dev.cfg'])
    azure_settings = config['azure']

    # 初始化凭证与Graph客户端
    credentials = ClientSecretCredential(
        azure_settings['tenantId'],
        azure_settings['clientId'],
        azure_settings['clientSecret'],
    )
    scopes = ['https://graph.microsoft.com/.default']
    client = GraphServiceClient(credentials=credentials, scopes=scopes)
    
    # 构建用户列表查询参数,指定返回id和mail字段
    query_params = UsersRequestBuilder.UsersRequestBuilderGetQueryParameters(
        select=['id', 'mail']
    )
    
    # 配置请求参数
    request_config = UsersRequestBuilder.UsersRequestBuilderGetRequestConfiguration(
        query_parameters=query_params
    )
    
    # 发送请求并遍历结果
    users = await client.users.get(request_config=request_config)
    for user in users.value:
        print(f"用户ID: {user.id}, 邮箱: {user.mail}")

if __name__ == "__main__":
    asyncio.run(get_users())

核心修正说明

  • 替换导入类:将UserItemRequestBuilder改为UsersRequestBuilder,前者用于单个用户的操作,后者专门处理用户集合的查询
  • 使用正确的配置类:用UsersRequestBuilderGetQueryParameters和UsersRequestBuilderGetRequestConfiguration替代原代码中的错误类,这两个是用户列表查询的标准配置类
  • 优化异步写法:将业务逻辑封装为异步函数,更贴合SDK的异步设计规范

额外注意事项

确保Azure AD应用已配置应用权限中的User.Read.All,并完成管理员权限同意,否则会触发权限不足的错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:18:09