使用SharePoint CSOM和.NET 6添加网站集管理员的问题
我正在尝试通过SharePoint CSOM将用户添加为网站集管理员(Site Collection Admin)。当前代码使用全局管理员账号可成功执行,即便该全局管理员未被列为网站管理员。但使用仅拥有网站集管理员权限的普通用户运行代码时,出现以下错误:
- 使用SharePoint管理URL获取AccessToken时,代码在第48行崩溃,报错401"Unauthorized"
- 使用网站集URL获取AccessToken时,获取令牌时提示"站点在环境中不存在"
- 使用根站点URL(
https://domain-admin.sharepoint.com/)获取AccessToken时,代码在第51行崩溃,报错401"Unauthorized"
我参考过PnP.PowerShell中SetTenantSite的相关实现,以及关于MSAL令牌在SharePoint CSOM中使用的讨论,但不确定问题出在AccessToken还是CSOM命令的使用上,求解决方法。
另外,我猜测全局管理员账号只需调用tenant.SetSiteAdmin(siteCollection, userEmail, true);即可。曾看到资料说即使全局管理员也需要调用EnsureUser(userEmail);,但目前我的代码不调用该方法也能正常运行。
附代码:
using Microsoft.Identity.Client; using Microsoft.SharePoint.Client; namespace ScriptTester { internal class Program { static async Task Main(string[] args) { await AddUserAdmin(); } public static async Task AddUserAdmin() { string siteAdmin = "https://domain-admin.sharepoint.com/"; string siteRoot = "https://domain.sharepoint.com/"; string siteCollection = "https://domain.sharepoint.com/sites/SiteName/"; string userEmail = "_email"; string accessToken = await GetAccessToken(siteRoot); using (var context = new Microsoft.SharePoint.Client.ClientContext(siteRoot)) { context.ExecutingWebRequest += (sender, e) => { e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + accessToken; }; var tenant = new Microsoft.Online.SharePoint.TenantAdministration.Tenant(context); try { addLog("Try using tenant context"); tenant.SetSiteAdmin(siteCollection, userEmail, true); tenant.Context.ExecuteQueryRetry(); } catch (Exception ex) { addLog("Failed using Tenant context"); addLog(ex.Message); using (var site = tenant.Context.Clone(siteCollection)) { var user = site.Web.EnsureUser(userEmail); user.Update(); user.IsSiteAdmin= true; site.Load(user); site.ExecuteQueryRetry(); tenant.SetSiteAdmin(siteCollection, userEmail, true); tenant.Context.ExecuteQueryRetry(); } } } } public static async Task<string> GetAccessToken(string siteUrl) { string tenantId = "xxxx-xxxx-xxxx-xxxx-xxx"; string clientId = "xxxx-xxxx-xxxx-xxxx-xxx"; Uri authority = new Uri($"https://login.microsoftonline.com/{tenantId}"); string redirectUri = "http://localhost"; string defaultPermissions = siteUrl + "/.default"; string[] scopes = new string[] { defaultPermissions }; var app = PublicClientApplicationBuilder.Create(clientId) .WithAuthority(authority) .WithRedirectUri(redirectUri) .Build(); AuthenticationResult result; result = await app.AcquireTokenInteractive(scopes) .WithUseEmbeddedWebView(false) .ExecuteAsync(); return result.AccessToken; } } }
内容的提问来源于stack exchange,提问作者Barbarur
相关产品推荐
相关产品推荐

