无法通过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
相关产品推荐
相关产品推荐

