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

使用SharePoint CSOM和.NET 6添加网站集管理员的问题

使用SharePoint CSOM添加网站集管理员的权限问题

我正在尝试通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:11:21