如何通过Microsoft Graph delta查询获取组的所有传递成员
问题背景
现有组层级结构如下:
- GROUP 1:包含1个直接用户USER 1、1个嵌套组GROUP 2
- GROUP 2:包含2个用户USER 2、USER 3
调用Microsoft Graph delta查询接口,请求地址为graph.microsoft.com/v1.0/groups/delta?$filter=id eq 'GROUP 1'时,接口响应仅返回直接成员USER 1和GROUP 2,无法返回嵌套组下的USER 2、USER 3。
待解决问题
是否有方法可通过delta查询直接获取包含所有嵌套层级用户在内的组传递成员,即返回结果覆盖USER 1、USER 2、USER 3?
当前实现代码
var a = await grapgClient .Groups .Delta() .Request() .Filter($"id eq '{groupId}'") .Top(MaxResultCount) .GetAsync();
解答
/groups/delta 接口原生不支持直接返回递归展开的多层嵌套传递成员,默认设计就只会返回目标组的直接成员对象:直接关联的用户、嵌套组都会正常返回,但接口不会自动递归展开嵌套组下的成员,你当前拿到的返回结果完全符合接口的默认行为。
不存在单接口一步到位获取全量传递成员的方案,要拿到所有层级的用户成员,可按以下逻辑实现:
- 调用现有groups delta接口拿到目标组的直接成员列表,将其中的直接用户存入最终结果集,同时筛选出所有直接嵌套组的ID
- 对筛选出的每个嵌套组,调用对应组的members delta接口拉取成员,遇到用户就加入最终结果集,遇到新的嵌套组就继续递归拉取对应组的成员,直到遍历完所有层级的嵌套组为止,最后对结果集做去重即可得到包含USER 1、USER 2、USER 3在内的全量传递成员
实现时注意两个要点:
- 不要尝试在delta请求中添加
$expand=members参数实现递归展开,delta查询场景下该参数不支持多层嵌套展开,最多仅能返回第一层直接成员,无法达到获取传递成员的效果 - 如果要长期做增量成员跟踪,需要为每个涉及到的组单独维护对应的delta令牌,后续拉取变更时直接使用对应组的delta令牌即可,不用每次全量递归遍历所有组,能大幅降低请求开销
内容的提问来源于stack exchange,提问作者user989988
相关产品推荐
相关产品推荐

