我很难理解如何使用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;
}
}
}
1条答案
按热度按时间4dc9hkyq1#
我建议你使用PnP核心组件来访问网站集和添加管理员。请参考以下代码