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

如何用Microsoft Graph API实现SharePoint的ensureuser功能(附C#方案)

问题

使用MS Graph API向SharePoint列表的PersonOrGroup字段添加用户时遇到以下问题:

  • 若用户从未访问过目标站点,不会出现在站点内部的“users”列表中,无法获取该字段所需的用户Lookup ID。
  • SharePoint REST API提供ensureuser函数,可检索站点用户列表中的用户;若不存在则添加并返回Lookup ID,但Graph API无直接等效功能。
  • 目标用户属于同一租户,可通过Graph API获取其完整信息。
解决方案

方案1:直接更新列表项(自动关联用户)

Graph API支持在更新PersonOrGroup字段时,直接传入用户的Azure AD ID或邮箱,无需提前获取站点Lookup ID。Graph会自动将用户添加到站点用户集合(等效于ensureuser的效果),并关联到列表项。

请求示例

PATCH https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items/{item-id}/fields
Content-Type: application/json
{
  "PersonColumnName@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
  "PersonColumnName": {
    "Email": "user@contoso.com"
  }
}

方案2:手动添加用户到站点(获取Lookup ID)

若需先确保用户存在于站点用户列表并获取Lookup ID,可使用站点用户添加端点:

请求示例

POST https://graph.microsoft.com/v1.0/sites/{site-id}/users
Content-Type: application/json
{
  "userPrincipalName": "user@contoso.com"
}

返回结果中的id即为站点用户的Lookup ID,可用于后续列表项字段更新。

.NET C# 代码实现

先安装依赖包:

Install-Package Microsoft.Graph
Install-Package Azure.Identity

方案1:直接更新列表项的Person字段

using Microsoft.Graph;
using Azure.Identity;

var scopes = new[] { "Sites.ReadWrite.All" };
var tenantId = "你的租户ID";
var clientId = "你的应用客户端ID";
var clientSecret = "你的应用客户端密钥";

var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(credential, scopes);

try
{
    var siteId = "目标站点ID";
    var listId = "目标列表ID";
    var itemId = 1; // 待更新的列表项ID
    var userEmail = "user@contoso.com";

    var fields = new FieldValueSet
    {
        AdditionalData = new Dictionary<string, object>
        {
            { "PersonColumnName@odata.type", "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser" },
            { 
                "PersonColumnName", new Dictionary<string, object>
                {
                    { "Email", userEmail }
                }
            }
        }
    };

    await graphClient.Sites[siteId].Lists[listId].Items[itemId].Fields
        .Request()
        .UpdateAsync(fields);

    Console.WriteLine("列表项更新成功");
}
catch (Exception ex)
{
    Console.WriteLine($"操作失败:{ex.Message}");
}

方案2:先添加用户到站点再更新列表项

using Microsoft.Graph;
using Azure.Identity;

var scopes = new[] { "Sites.ReadWrite.All" };
var tenantId = "你的租户ID";
var clientId = "你的应用客户端ID";
var clientSecret = "你的应用客户端密钥";

var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(credential, scopes);

try
{
    var siteId = "目标站点ID";
    var listId = "目标列表ID";
    var itemId = 1; // 待更新的列表项ID
    var userEmail = "user@contoso.com";

    // 添加用户到站点用户集合
    var siteUser = await graphClient.Sites[siteId].Users
        .Request()
        .AddAsync(new User { UserPrincipalName = userEmail });

    var siteLookupId = siteUser.Id;

    // 更新列表项的Person字段
    var fields = new FieldValueSet
    {
        AdditionalData = new Dictionary<string, object>
        {
            { "PersonColumnName@odata.type", "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser" },
            { 
                "PersonColumnName", new Dictionary<string, object>
                {
                    { "Id", siteLookupId }
                }
            }
        }
    };

    await graphClient.Sites[siteId].Lists[listId].Items[itemId].Fields
        .Request()
        .UpdateAsync(fields);

    Console.WriteLine("用户添加到站点并更新列表项成功");
}
catch (Exception ex)
{
    Console.WriteLine($"操作失败:{ex.Message}");
}

内容的提问来源于stack exchange,提问作者Bram Schouppe BE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:56:07