如何查询不属于名称含AVD的特定组的Azure AD用户主体名称
实现方案
你之前的接口调用不符合Microsoft Graph语法规范,memberOf为导航属性,无法直接通过基础筛选语法匹配关联组的名称,且涉及关联实体属性筛选的查询需要启用Azure AD高级查询能力,以下是两种可落地的实现方式:
方法1:单接口查询(中小租户适用)
调用v1.0版本Graph接口,使用lambda表达式做关联属性匹配,必须在请求头中添加ConsistencyLevel: eventual,同时携带$count=true参数触发高级查询能力,接口示例:
GET https://graph.microsoft.com/v1.0/users?$filter=not(memberOf/any(g:contains(g/displayName,'AVD')))&$select=userPrincipalName,displayName,id&$count=true
- 如果需要排除嵌套组场景下的用户(即用户通过组嵌套间接属于名称含AVD的组也需要排除),将查询语句中的
memberOf替换为transitiveMemberOf即可。 - 该方法在租户用户量超过10万时容易触发限流,大规模租户建议使用方法2。
方法2:分步查询(大规模租户适用,稳定性更高)
- 第一步拉取所有名称包含"AVD"的组ID:
GET https://graph.microsoft.com/v1.0/groups?$filter=contains(displayName,'AVD')&$select=id - 遍历拿到的所有组ID,调用组成员接口获取每个组的全量成员(需要查传递成员就调用transitiveMembers接口),将所有属于AVD相关组的用户ID去重汇总。
- 拉取租户全量用户列表,和上一步汇总的AVD组用户ID集合做差集,最终得到的就是不属于任何名称含AVD组的用户,直接提取对应
userPrincipalName字段即可。
之前调用失败的原因说明
https://graph.microsoft.com/v1.0/users/groups?$search="AVD"路径不合法,users资源下不存在groups子路由https://graph.microsoft.com/v1.0/users?$select=memberOf eq '%AVD%'语法错误:$select参数仅用于指定返回字段,不能传入筛选表达式,且%通配符不属于Graph OData查询支持的语法,字符串包含匹配需要使用contains()函数https://graph.microsoft.com/beta/users?$expand=memberOf仅做关联属性展开,未添加任何筛选逻辑,会返回全量用户及所属组数据,且数据量过大时会触发返回结果截断,无法得到预期结果。
内容的提问来源于stack exchange,提问作者AskMe
相关产品推荐
相关产品推荐

