1

ItemUpdating イベントを使用するイベント レシーバーがあります。親からアイテムのアクセス許可を継承せず、ドロップオフ ライブラリにアップロードされたアイテムのすべてのアクセス許可を取り除こうとしています。これは、ドキュメントに機密情報が含まれており、ドキュメントが自動仕分けライブラリに到着すると、誰にも表示されてはならないためです。

以下のコードは、ドロップオフ ライブラリに到達したときに 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);
                            }
                        }
                    }
                }
            });

また、次のことも行いました: - アプリ プールの ID がサイト コレクション管理者であることを確認しました - GetItemById を使用してリスト アイテムを再度取得しようとしました (ただし、アイテムがまだ存在するため、アイテムが存在しないというエラーがスローされます)まだ公開されていません - ドキュメントを公開する前にアクセス許可を削除する必要があります - チェックインを強制することはできません。そうしないと、ドロップオフ ライブラリがドキュメントを処理してターゲット ライブラリに移動する可能性があります) - を使用して Web およびサイト オプションを取得しようとしましたGUID - AllowUnsafeUpdates を使用して配置のさまざまな組み合わせを試しました - サイト コレクション管理者のユーザー トークンを使用して Web オブジェクトを開きました

何らかの理由で、ドキュメントがターゲット ライブラリに到達すると、上記のコードは正常に機能します (ドキュメントが目的のライブラリに到達すると、すべてのアクセス許可が再び削除されるため)。これは、システム アカウントを使用してドキュメントが自動仕分けライブラリからターゲット ライブラリに移動されるために発生します。

上記と同様のアプローチを利用しながら、「アクセスが拒否されました」エラーを回避する方法について何か考えはありますか?

4

1 に答える 1

0

そして、このアイテムはどのようにドロップオフライブラリに送信されますか?ワークフロー経由、またはOfficialFile.asmxを使用する場合 ファイルを手動でアップロードするときにこのeventreceiverが正しく機能するかどうかを確認できますか(ほとんどの場合、更新を強制するには[送信]をクリックする必要がありますが、どのルールも一致しないようにフィールドを設定できますか?ファイルはそこに到達しますワークフローを介して、SPTimer4サービスが実行されているアカウントもこのサイトコレクションのサイト管理者であることを確認してください。

また、注意してください。イベントレシーバーで期待どおりに機能しない可能性があるものが2つあると思います。

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 に答える