使用Python调用Azure DevOps API获取用户列表遇注册错误求助
解决Azure DevOps Python SDK获取用户列表的错误及扩展需求
一、解决ValueError: API resource location ... is not registered错误
你遇到的这个错误是因为用错了客户端类型:get_accounts_client()是用来管理Azure DevOps账户级资源的(比如创建/删除组织、管理账户订阅),根本不是用来获取单个组织内用户列表的工具。要拿到组织内的用户数据,你得用Graph Client。
修正后的代码:
from azure.devops.connection import Connection from msrest.authentication import BasicAuthentication # 替换成你的PAT和组织URL personal_access_token = 'your_personal_access_token' organization_url = 'https://dev.azure.com/your_organization_name' credentials = BasicAuthentication('', personal_access_token) connection = Connection(base_url=organization_url, creds=credentials) # 使用Graph Client获取组织内所有用户 graph_client = connection.clients_v5_1.get_graph_client() users = graph_client.list_users() # 遍历输出用户基础信息 for user in users: print(f"用户ID: {user.id}, 显示名称: {user.display_name}, 邮箱: {user.mail_address}")
为什么之前的代码会报错?
Accounts Client的接口是针对https://aex.dev.azure.com(账户管理专用域名)设计的,而你用的是组织级域名https://dev.azure.com/your_org。你的PAT权限通常只覆盖单个组织,调用账户级接口自然会触发“资源未注册”的错误。
二、获取用户创建日期和最后访问信息
1. 获取用户创建日期
用户的创建日期可以通过User Entitlements Client获取,它返回的用户权限对象里包含created_date字段:
# 获取用户权限信息(包含创建日期) entitlements_client = connection.clients_v5_1.get_user_entitlements_client() user_entitlements = entitlements_client.list_user_entitlements() for ent in user_entitlements: print(f"用户: {ent.user.display_name}, 创建日期: {ent.created_date}")
2. 获取用户最后访问日期
Azure DevOps没有直接返回用户最后访问时间的Graph API,但可以通过Audit Log Client查询用户的登录事件来间接获取:
from azure.devops.v5_1.audit.models import AuditLogQueryOptions audit_client = connection.clients_v5_1.get_audit_client() # 根据需要调整查询的时间范围 query_options = AuditLogQueryOptions(start_time="2023-01-01T00:00:00", end_time="2024-01-01T00:00:00") audit_events = audit_client.query_audit_log(query_options) # 整理用户的最新登录时间 user_last_access = {} for event in audit_events: # 筛选出用户登录事件 if event.category == "Authentication" and event.action == "UserLoggedIn": user_id = event.actor.id event_time = event.timestamp # 只保留该用户最新的登录记录 if user_id not in user_last_access or event_time > user_last_access[user_id]: user_last_access[user_id] = event_time # 结合用户基础信息输出最后访问时间 for user in users: last_access = user_last_access.get(user.id, "无访问记录") print(f"用户: {user.display_name}, 最后访问时间: {last_access}")
注意事项
确保你的PAT拥有以下权限:
- User Profile (Read):用于读取用户基础信息和权限数据
- Audit Log (Read):用于查询登录审计事件
内容的提问来源于stack exchange,提问作者riloth
相关产品推荐
相关产品推荐

