gpt4 book ai didi

sharepoint - 使用全局管理员帐户访问被拒绝的 Office 365/SharePoint Online

转载 作者:行者123 更新时间:2023-12-04 01:58:32 26 4
gpt4 key购买 nike

自从两天解决问题以来,我快疯了。问题是;

我正在制作一个控制台应用程序,它使用全局管理员帐户(在进行新订阅时被指定为管理员)与 SharePoint Online 对话。我想要实现的是,我想使用 CSOM 向 office 365 的每个网站集和子网站添加一个自定义操作。该代码工作正常,但在注册时由 office 365 预先创建的根网站集除外(即https://xyz.sharepoint.com )

对于根网站集的任何租户,它都会给我以下错误;

{ "SchemaVersion":"15.0.0.0","LibraryVersion":"16.0.3912.1201","ErrorInfo":{ "ErrorMessage":"Access denied. You do not have permission to perform this action or access this resource.","ErrorValue":null,"TraceCorrelationId":"2a47fd9c-c07b-1000-cfb7-cdffbe3ab83a","ErrorCode":-2147024891,"ErrorTypeName":"System.UnauthorizedAccessException" },"TraceCorrelationId":"2a47fd9c-c07b-1000-cfb7-cdffbe3ab83a" }



现在用户是全局管理员。我还再次将该用户添加为网站集管理员。

同一段代码适用于其他网站集(搜索网站集、任何新创建的网站集...)。

这是一个代码;
        using (ClientContext spcollContext = new ClientContext(web.Url))
{
SecureString passWord = new SecureString();
foreach (char c in strAdminPassword.ToCharArray()) passWord.AppendChar(c);
SharePointOnlineCredentials creds = new SharePointOnlineCredentials(strAdminUser, passWord);
spcollContext.Credentials = creds;
Web currentweb = spcollContext.Web;
spcollContext.Load(currentweb);
spcollContext.ExecuteQuery();

// authCookie = creds.GetAuthenticationCookie(new Uri(web.Url));

var existingActions2 = currentweb.UserCustomActions;
spcollContext.Load(existingActions2);
spcollContext.ExecuteQuery();
var actions2 = existingActions2.ToArray();
foreach (var action in actions2)
{
if (action.Description == "CustomScriptCodeForEachsite" &&
action.Location == "ScriptLink")
{
action.DeleteObject();
spcollContext.ExecuteQuery();
}
}

var newAction2 = existingActions2.Add();
newAction2.Description = "CustomScriptCodeForEachsite";
newAction2.Location = "ScriptLink";

newAction2.ScriptBlock = scriptBlock;
newAction2.Update();
spcollContext.Load(currentweb, s => s.UserCustomActions);
spcollContext.ExecuteQuery(); // GETTING ERROR ON THIS LINE.
}

注意:以上错误是 Fiddler 跟踪。

最佳答案

这种行为很可能是由 Custom Script feature 引起的, 基本上
当自定义脚本功能为 时会出现此问题关闭

如何验证?

您可以使用以下控制台应用程序验证站点权限:

using (var ctx = GetContext(webUri, userName, password))
{
var rootWeb = ctx.Site.RootWeb;
ctx.Load(rootWeb, w => w.EffectiveBasePermissions);
ctx.ExecuteQuery();
var permissions = rootWeb.EffectiveBasePermissions;
foreach (var permission in Enum.GetValues(typeof(PermissionKind)).Cast<PermissionKind>())
{
var permissionName = Enum.GetName(typeof(PermissionKind), permission);
var hasPermission = permissions.Has(permission);
Console.WriteLine("Permission: {0}, HasPermission: {1}", permissionName, hasPermission);
}
}

在哪里
public static ClientContext GetContext(Uri webUri, string userName, string password)
{
var securePassword = new SecureString();
foreach (var ch in password) securePassword.AppendChar(ch);
return new ClientContext(webUri) {Credentials = new SharePointOnlineCredentials(userName, securePassword)};
}

SP.PermissionKind.AddAndCustomizePages设置为 错误 ,添加用户自定义操作时出现拒绝访问错误。

enter image description here

解决方案

根据 Turn scripting capabilities on or off :

For self-service created sites, custom scripting is disabled by default


Solution: enable Allow users to run custom scripts on self-service created sites

从 SharePoint 管理中心启用或禁用脚本
  • 使用您的工作或学校帐户登录 Office 365。
  • 转到 SharePoint 管理中心。
  • 选择设置。
  • 在自定义脚本下选择:
  • 阻止用户在个人站点上运行自定义脚本或允许
    用户在个人网站上运行自定义脚本。
  • 阻止用户在用户创建的站点上运行自定义脚本或
    允许用户在自助创建的站点上运行自定义脚本。

  • enter image description here
  • 选择确定。需要 约24小时为了改变
    影响。


  • 由于通过 SharePoint Online 管理中心对脚本设置进行的任何更改最多可能需要 24小时要生效,您可以在特定网站集上启用脚本 立即通过 CSOM API ( SharePoint Online Client Components SDK ) 如下所示:
    public static void DisableDenyAddAndCustomizePages(ClientContext ctx, string siteUrl)
    {
    var tenant = new Tenant(ctx);
    var siteProperties = tenant.GetSitePropertiesByUrl(siteUrl, true);
    ctx.Load(siteProperties);
    ctx.ExecuteQuery();

    siteProperties.DenyAddAndCustomizePages = DenyAddAndCustomizePagesStatus.Disabled;
    var result = siteProperties.Update();
    ctx.Load(result);
    ctx.ExecuteQuery();
    while (!result.IsComplete)
    {
    Thread.Sleep(result.PollingInterval);
    ctx.Load(result);
    ctx.ExecuteQuery();
    }
    }

    用法
    using (var ctx = GetContext(webUri, userName, password))
    {
    using (var tenantAdminCtx = GetContext(tenantAdminUri, userName, password))
    {
    DisableDenyAddAndCustomizePages(tenantAdminCtx,webUri.ToString());
    }
    RegisterJQueryLibrary(ctx);
    }

    在哪里
    public static void RegisterJQueryLibrary(ClientContext context)
    {
    var actions = context.Site.UserCustomActions;
    var action = actions.Add();
    action.Location = "ScriptLink";
    action.ScriptSrc = "~SiteCollection/Style Library/Scripts/jQuery/jquery.min.js";
    action.Sequence = 1482;
    action.Update();
    context.ExecuteQuery();
    }

    关于sharepoint - 使用全局管理员帐户访问被拒绝的 Office 365/SharePoint Online,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29675567/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com