我有一个使用ItemUpdating事件的事件接收器。我试图从父项中删除该项目的权限,并在上传到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再次获取列表项(但是这会抛出该项不存在的错误,因为该项目尚未发布 - 我们需要在文档发布之前删除权限 - 我们无法强制检查-in否则,drop off库可能会处理并将文档移动到其目标库中) - 尝试使用guid获取网站和网站选项 - 使用AllowUnsafeUpdates尝试了许多不同的展示位置组合 - 使用网站集管理员的用户令牌打开Web对象
出于某种原因,当文档到达目标库时,上面的代码工作正常(因为我们在文档到达目的地后删除所有权限AGAIN)。发生这种情况是因为使用系统帐户将文档从放置库移动到目标库。
关于如何绕过" Access的任何想法都被拒绝"使用上述类似方法时出错?
答案 0 :(得分:0)
这个项目如何被发送到Drop off库?通过工作流程,或使用OfficialFile.asmx?你可以在手动上传文件时检查这个事件接收器是否正常工作(很可能你必须点击'submit'来强制更新,但也许你可以用这样的方式设置字段,你的规则都不匹配?我的文件到那里通过工作流程,确保运行SPTimer4服务的帐户也是此网站集的网站管理员。
另外要小心, - 我认为在您的事件接收器中有两件事可能无法正常工作:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (var oSiteCollection = new SPSite(properties.ListItem.Web.Url))
{
using (var oWebsite = oSiteCollection.RootWeb)
{
var currentListItem = properties.ListItem;
oSiteCollection.AllowUnsafeUpdates = true;
oWebsite.AllowUnsafeUpdates = true;
currentListItem.BreakRoleInheritance(true);
//You should take the RoleAssignments after breaking inheritance our you will be working on parents permissions.
var spRoleAssColn = currentListItem.RoleAssignments;
oSiteCollection.AllowUnsafeUpdates = true;
oWebsite.AllowUnsafeUpdates = true;
for (int i = spRoleAssColn.Count - 1; i >= 0; i--)
{
//I think it won't allow you to remove permissions for site administrator
if (spRoleAssColn[i].Member.Name != "System Account" && !oWebsite.EnsureUser(spRoleAssColn[i].Member.LoginName).IsSiteAdmin)
{
spRoleAssColn.Remove(i);
}
}
}
}
});