使用SharePoint CSOM和.Net 6添加网站集管理员

lmvvr0a8  于 2023-01-14  发布在  .NET
关注(0)|答案(1)|浏览(129)

我很难理解如何使用SharePoint CSOM将用户添加为网站集管理员。
到目前为止,此代码适用于全局管理员将用户添加为站点集合管理员,即使全局管理员不包括在站点管理员中。
我试着以普通用户身份运行代码,这只是网站集管理员,添加另一个用户作为网站集管理员。但后来我得到一些错误:

  • 如果我使用SharePoint Admin URL获取访问令牌,则代码在第48行崩溃,显示为401“未授权”
  • 如果我使用网站集URL获取访问令牌,则在尝试获取访问令牌时会出现错误,提示环境中不存在网站。
  • 如果我使用根站点URL(“https://domain-admin.sharepoint.com/”)来获取访问令牌,那么代码会在第51行崩溃,显示为401“未授权”。

我使用PnP.PowerShell代码作为参考:https://github.com/pnp/powershell/blob/dev/src/Commands/Admin/SetTenantSite.cs#L547-L574
我的过程和这里差不多:MSAL AD token not valid with SharePoint Online CSOM
但我不清楚这是访问令牌的问题还是我使用的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;
        }
    }
}
4dc9hkyq

4dc9hkyq1#

我建议你使用PnP核心组件来访问网站集和添加管理员。请参考以下代码

string siteUrl = "https://xxx.sharepoint.com/";  
string userName = "xxxx@xxx.onmicrosoft.com";  
string password = "*******";  
      
AuthenticationManager authManager = new AuthenticationManager();  
try  
{  
    using (var clientContext = authManager.GetSharePointOnlineAuthenticatedContextTenant(siteUrl, userName, password))  
    {  
        List<UserEntity> admins = new List<UserEntity>();  
        UserEntity admin = new UserEntity();  
        admin.LoginName = "nirmal";  
        admins.Add(admin);  

        clientContext.Site.RootWeb.AddAdministrators(admins, true);  
  
        Console.WriteLine("User added as Site Collection Admin");  
        Console.ReadKey();  
    }  
}  
catch (Exception ex)  
{  
    Console.WriteLine("Error Message: " + ex.Message);  
    Console.ReadKey();  
}

相关问题