1

我有一个使用 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 对象

出于某种原因,当文档到达目标库时,上面的代码可以正常工作(因为一旦文档到达目的地,我们将再次删除所有权限)。发生这种情况是因为使用系统帐户将文档从放置库移动到目标库。

在使用与上述类似的方法时如何解决“拒绝访问”错误的任何想法?

4

1 回答 1

0

以及这个项目是如何被送到 Drop off 图书馆的?通过工作流,还是在使用 OfficialFile.asmx 时?当您手动上传文件时,您能否检查此事件接收器是否正常工作(很可能您必须单击“提交”以强制更新,但也许您可以以这种方式设置字段,您的规则都不匹配?我的文件到达那里通过工作流,确保运行 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);
                 }
             }
        }
    }
});
于 2012-11-20T16:28:00.873 回答