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

如何使用Microsoft Graph API v5批量更新ADB2C用户?

问题描述

我正在使用Microsoft Graph API与ADB2C应用交互,单个用户的查询、创建、更新和删除操作均正常。现在需要为管理员实现批量更新多个用户特定字段的功能,参考示例代码编写了批量更新逻辑,但遇到报错:

原代码如下:

string filterQuery = string.Join(" or ", emails.Select(email => $"mail eq '{email}'"));
var users = new List<User>();
var batchRequestContent = new BatchRequestContentCollection(graphClient);

var result = await graphClient.Users.GetAsync((requestConfiguration) =>
{
    requestConfiguration.QueryParameters.Filter = filterQuery;
});
if (result != null && result.Value.Count > 0)
{
    users.AddRange(result.Value);
}

foreach (var user in users)
{
    user.AccountEnabled = !value;
    var userRequest = graphClient.Users.ToPostRequestInformation(user);
    await batchRequestContent.AddBatchRequestStepAsync(userRequest);
}
var response = await graphClient.Batch.PostAsync(batchRequestContent);
var responses = await response.GetResponsesStatusCodesAsync();

使用POST请求时,报错:

A password must be specified to create a new user.

修改为PATCH请求(userRequest.HttpMethod = Method.PATCH;)后,又报错:

Specified HTTP method is not allowed for the request target.

请问如何基于现有代码实现Microsoft Graph API v5批量更新用户的功能?


解决方案

问题出在批量请求的构建逻辑上:

  1. 原代码用graphClient.Users.ToPostRequestInformation(user)生成的是创建用户的POST请求(目标路径为/users),这就是为什么会提示需要密码——它默认执行新建用户操作,而非更新现有用户。
  2. 修改为PATCH后报错,是因为/users集合路径不支持PATCH方法,更新单个用户的正确路径应为/users/{userId}。

正确的批量更新代码调整如下:

string filterQuery = string.Join(" or ", emails.Select(email => $"mail eq '{email}'"));
var users = new List<User>();
var batchRequestContent = new BatchRequestContentCollection(graphClient);

// 1. 查询目标用户(仅获取必要字段,提升性能)
var result = await graphClient.Users.GetAsync((requestConfiguration) =>
{
    requestConfiguration.QueryParameters.Filter = filterQuery;
    requestConfiguration.QueryParameters.Select = new[] { "id", "accountEnabled" };
});
if (result != null && result.Value.Count > 0)
{
    users.AddRange(result.Value);
}

// 2. 为每个用户构建单独的PATCH更新请求
foreach (var user in users)
{
    // 仅构造需要修改的字段,避免覆盖其他属性
    var updatePayload = new User
    {
        AccountEnabled = !value
    };

    // 生成针对单个用户ID的PATCH请求(路径为/users/{userId})
    var userRequest = graphClient.Users[user.Id].ToPatchRequestInformation(updatePayload);
    await batchRequestContent.AddBatchRequestStepAsync(userRequest);
}

// 3. 发送批量请求并处理响应
var response = await graphClient.Batch.PostAsync(batchRequestContent);
var responses = await response.GetResponsesStatusCodesAsync();

// 可选:遍历响应检查每个请求的执行结果
foreach (var (batchId, statusCode) in responses)
{
    // 根据状态码处理成功/失败场景,比如记录日志或重试
}

关键调整要点:

  • 使用graphClient.Users[user.Id].ToPatchRequestInformation(updatePayload)生成针对单个用户ID的PATCH请求,而非针对用户集合的请求。
  • 构建更新载荷时只包含需要修改的字段(如AccountEnabled),不要直接修改查询返回的完整User对象提交,避免不必要的字段覆盖或验证错误。
  • 查询用户时通过Select参数只获取必要字段,减少数据传输量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:37:18