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

通过Graph API获取Azure/Entra AD用户及组过慢,求优化方案

优化Azure AD用户-组关系获取速度的方案

方案1:使用批量请求(Batch API)合并多用户组查询

单用户调用POST /users/{id}/getmembergroups产生的大量HTTP请求是耗时核心原因。利用Graph的批量请求可将最多20个独立请求打包为一个HTTP请求,大幅降低网络往返开销。

示例批量请求格式:

POST /$batch
Content-Type: application/json

{
  "requests": [
    {
      "id": "1",
      "method": "POST",
      "url": "/users/{user-id-1}/getmembergroups",
      "body": {
        "securityEnabledOnly": false
      },
      "headers": {
        "Content-Type": "application/json"
      }
    },
    {
      "id": "2",
      "method": "POST",
      "url": "/users/{user-id-2}/getmembergroups",
      "body": {
        "securityEnabledOnly": false
      },
      "headers": {
        "Content-Type": "application/json"
      }
    }
    // 最多可添加至20个请求
  ]
}

处理逻辑:

  • 将35000个用户按每20个一组拆分,生成批量请求
  • 批量处理所有请求后,将每个用户的组ID结果对应存储
  • 最后与已获取的组列表匹配名称

该方法可将HTTP请求次数从35000次降至1750次,直接减少网络延迟带来的耗时。

方案2:反向遍历组构建用户-组映射

若组的成员分布相对集中(如大量用户属于少数组),可反向遍历所有组,获取组成员后构建用户到组的映射:

  1. 调用GET /groups?$select=id,displayName获取所有组的ID和名称(与现有步骤3一致)
  2. 对每个组,调用GET /groups/{id}/members?$select=id获取组成员的用户ID
  3. 遍历成员列表,将用户ID与当前组ID/名称关联,最终整理出每个用户所属的组集合

同样可通过批量请求优化组的成员查询,将多个/groups/{id}/members请求打包,减少HTTP请求次数。若组平均成员数较少,该方案的总数据传输量可能比遍历用户更小。

方案3:使用/users/{id}/memberOf替代getmembergroups

你之前尝试GET /users?$expand=memberOf失败,是因为Graph API默认不允许对多值导航属性memberOf进行全局扩展,但可针对单个用户调用GET /users/{id}/memberOf?$select=id,displayName,直接获取用户所属组的ID和名称,省去后续组匹配步骤。

该接口同样支持批量请求打包,一次获取多个用户的所属组信息,同时直接拿到组名称,减少后续的组ID匹配环节。

额外优化建议

  • 使用应用权限而非委托权限调用接口,应用权限的请求限制更高,可提升并发处理能力
  • 开启分页并行处理:获取用户/组列表时,同时处理已拿到的分页数据,无需等待所有数据下载完成再启动组查询
  • 若仅需安全组,可将getmembergroups的securityEnabledOnly参数设为true,减少返回数据量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:52:42