当我的代码尝试遍历事件接收器中的SPListItems.RoleAssignments
集合时,我收到错误。但仅适用于拥有贡献者权限的用户。拥有管理员权限的用户。
我尝试了以下内容:
使用以下代码进行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;
}
最后我尝试了SPWeb.AllowUnsafeUpdates = true;
我已经尝试了所有方法,分开和集体,没有任何东西。它似乎也是SPListItems.RoleAssignments.Count
上的一个例外。
答案 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.RunWithElevatedPrivileges
或WindowsIdentity.Impersonate(System.IntPtr.Zero)
不是必需的。
我撰写了一篇涵盖此主题的博文:How To Open a SPSite With thw System Account In SharePoint 2010。