我有一个使用 ItemUpdating 事件的事件接收器。我正在尝试取消从父项那里继承该项目的权限,并在上传到 Drop Off Library 后剥夺该项目的所有权限。这样做的原因是该文档包含敏感信息,一旦到达 Drop Off Library,任何人都不应看到它。
下面的代码在到达 Drop Off Library 时执行 CurrentListItem.BreakRoleInheritence(true) 行时引发以下错误:访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite oSiteCollection = new SPSite(properties.ListItem.Web.Url))
{
using (SPWeb oWebsite = oSiteCollection.RootWeb)
{
SPListItem CurrentListItem = properties.ListItem;
SPRoleAssignmentCollection SPRoleAssColn = CurrentListItem.RoleAssignments;
oSiteCollection.AllowUnsafeUpdates = true;
oWebsite.AllowUnsafeUpdates = true;
CurrentListItem.BreakRoleInheritance(true);
oSiteCollection.AllowUnsafeUpdates = true;
oWebsite.AllowUnsafeUpdates = true;
for (int i = SPRoleAssColn.Count - 1; i >= 0; i--)
{
if (SPRoleAssColn[i].Member.Name != "System Account")
{
SPRoleAssColn.Remove(i);
}
}
}
}
});
我还做了以下事情: - 确保应用程序池的身份是网站集管理员 - 尝试使用 GetItemById 再次获取列表项(但这会引发该项目不存在的错误,因为该项目仍然尚未发布 - 我们需要在文档发布之前删除权限 - 我们不能强制签入,否则放置库可能会处理并将文档移动到其目标库) - 尝试使用获取 Web 和站点选项guids - 使用 AllowUnsafeUpdates 尝试了许多不同的展示位置组合 - 使用网站集管理员的用户令牌打开 Web 对象
出于某种原因,当文档到达目标库时,上面的代码可以正常工作(因为一旦文档到达目的地,我们将再次删除所有权限)。发生这种情况是因为使用系统帐户将文档从放置库移动到目标库。
在使用与上述类似的方法时如何解决“拒绝访问”错误的任何想法?