SharePoint 2010 & «Попытка выполнить несанкционированную операцию».& SPListItems.RoleAssignments - PullRequest
3 голосов
/ 18 января 2012

Я получаю сообщение об ошибке, когда мой код пытается перебрать коллекцию SPListItems.RoleAssignments в моем приемнике событий.Но только для пользователей, которые имеют права участника.Пользователи, имеющие права администратора.

Я пробовал следующее:

  1. Упаковка под SPRunElevatedPrivlages
  2. Windows Impersation, используя следующий код:

    WindowsImpersonationContext ctx = null;
    ctx = WindowsIdentity.Impersonate(System.IntPtr.Zero);
    SPUserToken oSysToken = GetSysToken(properties.SiteId)
    private static SPUserToken GetSysToken(Guid SPSiteID)
    {
        SPUserToken sysToken = null;
        using(SPSite oSite = new SPSite(SPSiteID))
        {
            sysToken = oSite.SystemAccount.UserToken;
        }
        if (sysToken == null)
        {
            SPSecurity.RunWithElevatedPrivileges(
            delegate()
            {
                using(SPSite site = new SPSite(SPSiteID))
                {
                    sysToken = site.SystemAccount.UserToken;
                }
            });
        }
        return sysToken;
    }
    
  3. Наконец-то я попробовал SPWeb.AllowUnsafeUpdates = true;

Я испробовал все методы по отдельности и вместе, и ничего.Похоже, что через исключение на SPListItems.RoleAssignments.Count.

1 Ответ

3 голосов
/ 18 января 2012

Пользователям нужно как минимум Управление разрешениями правами на объект для чтения и изменения SPSecurableObject.RoleAssignments.

Чтобы выполнить код с привилегиями системной учетной записи (с повышенными правами) для объекта SharePoint, необходимо «повторно открыть данный объект»:

SPListItem item = // the item from the event receiver

// Re-open the item with the system account
using (SPSite adminSite = new SPSite(item.Web.Url, SPUserToken.SystemAccount))
{
  using (SPWeb adminWeb = adminSite.OpenWeb())
  {
    SPListItem adminItem = adminWeb
      .Lists[item.ParentList.ID]
      .GetItemByUniqueId(i.UniqueId);

    // execute your code with the system account on the item.
    // adminItem.RoleAssignments.WhatEver
  }
}

Обратите внимание на использование SPUserToken.SystemAccount. Это делает хак «System Account Token», требуемый в SharePoint 2007, устаревшим.

Для действий над объектами SharePoint SPSecurity.RunWithElevatedPrivileges или WindowsIdentity.Impersonate(System.IntPtr.Zero) - это , а не .

Я написал сообщение в блоге, посвященное этой теме: Как открыть SPSite с помощью системной учетной записи в SharePoint 2010 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...