如何用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
相关产品推荐
相关产品推荐

