SharePoint 2010& “试图进行未经授权的操作。” &安培; SPListItems.RoleAssignments

时间:2012-01-17 21:22:26

标签: sharepoint-2010

当我的代码尝试遍历事件接收器中的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;

  4. 我已经尝试了所有方法,分开和集体,没有任何东西。它似乎也是SPListItems.RoleAssignments.Count上的一个例外。

1 个答案:

答案 0 :(得分:3)

用户至少需要管理权限权限才能阅读和修改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。这使得"系统帐户令牌" SharePoint 2007中所需的hack已过时。

对于SharePoint对象的操作SPSecurity.RunWithElevatedPrivilegesWindowsIdentity.Impersonate(System.IntPtr.Zero) 是必需的。

我撰写了一篇涵盖此主题的博文:How To Open a SPSite With thw System Account In SharePoint 2010