在ItemUpdating事件接收器中的Drop Off Library上使用BreakRoleInheritence方法时“访问被拒绝”

时间:2012-11-08 21:49:11

标签: c# sharepoint

我有一个使用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的任何想法都被拒绝"使用上述类似方法时出错?

1 个答案:

答案 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);
                 }
             }
        }
    }
});