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

如何通过Azure AD差异查询检测用户目录角色分配变更?

如何通过Azure AD Graph API检测用户目录角色分配变更

嗨,这个问题我熟!你当前用的directoryObjects delta查询之所以拿不到目录角色分配的变更数据,核心原因是目录角色分配(directoryRoleAssignments)是Azure AD Graph中独立的关联资源,不属于directoryObjects覆盖的核心对象范围(用户、组、设备这类),所以得单独针对它发起delta查询才行。

下面是具体的实现步骤:

1. 初始化目录角色分配的delta基线查询

首先你需要发起一次初始请求,获取当前所有的角色分配基线数据,同时拿到后续轮询变更要用的deltaLink:

GET https://graph.windows.net/{org}/directoryRoleAssignments/delta?api-version=1.5

这个请求会返回租户内所有生效的目录角色分配记录,响应体里的@odata.deltaLink就是你后续同步变更的关键链接,一定要保存好。

2. 轮询变更:复用deltaLink获取增量数据

和你之前查询directoryObjects的逻辑完全一致,每次同步时直接用上次拿到的deltaLink发起请求,就能获取自上次同步以来所有的角色分配变更(包括新增、删除):

GET https://graph.windows.net/{org}/directoryRoleAssignments/delta?api-version=1.5&deltaLink={你的deltaLink值}

3. 解析变更数据,关联用户与角色

返回的每条变更记录会包含几个核心字段,帮你定位具体的角色变更:

  • principalId: 被分配/移除角色的用户(或组、服务主体)ID,你可以用这个ID关联你从directoryObjects拿到的用户数据
  • roleId: 对应的目录角色ID(比如计费管理员、SharePoint管理员的唯一标识)
  • id: 角色分配记录的唯一ID,用来区分不同的分配操作

如果需要把roleId转换成用户友好的角色名称(比如“计费管理员”),你可以提前调用一次directoryRoles接口获取所有目录角色的映射关系:

GET https://graph.windows.net/{org}/directoryRoles?api-version=1.5

把返回的id和displayName存成一个映射表,后续直接匹配就行。

几个注意点

  • 权限要求:你的应用需要申请Directory.Read.All或Directory.ReadWrite.All的应用权限(委托权限不适用于后台同步场景),否则会被拒绝访问
  • 变更类型:目录角色分配的变更通常只有新增和删除两种,很少有修改场景——因为角色分配是直接的关联关系,变更就是重新分配或移除
  • 迁移提示:Azure AD Graph已经处于退役阶段,微软官方推荐迁移到Microsoft Graph API。如果后续有计划升级,Microsoft Graph的delta查询对角色分配的支持更完善,还会直接返回变更类型标识,不过你现在用Azure AD Graph的话,上面的方法完全能满足需求。

内容的提问来源于stack exchange,提问作者Pritesh Mandowara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:22:15