高昇格権限で実行された場合、通常のユーザーによってSPPersistedObject設定を更新できますか?
-
10-12-2019 - |
質問
各ドキュメントライブラリにデプロイされたカスタムリボンアイコン "enlist"を持っています。通常(すなわち非管理者)ユーザはこのアイコンをクリックすることができる。彼がすると、文書ライブラリ情報(ID、名前)をどこかに保存したいと思います。その場合、中央管理者(カスタムセントラル管理ページを介して)ユーザーが参加したすべてのドキュメントライブラリのリストを参照してください。
ユーザーがリボンアイコンをクリックすると、SPPersistedObject
を使用して文書ライブラリ情報を格納することを考えています。ただし、AFAIKこれにはファーム管理権限が必要です。つまり、通常のユーザーが[ENLIST]をクリックするとエラーが発生します。 昇格された特権でSpperSistedObjectを書き込むコードを実行することは、この問題を解決する、またはエラーが発生する可能性がありますか?これは私が意味するものです:
.
// Execute this code when a ribbon icon is clicked by a normal user
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// Write DocumentLibrary Id and Name to some custom SPPersistedObject
});
MSDNは、RunWithElevatedPrivileges()
がアプリケーションプールのIDで実行されます。これは、そのアプリケーションプールによってホストされているすべてのサイトコレクションでサイトコレクション管理者権限を持ちます。これはSPPersistedObject
を更新するのに十分ですか?
常にtrueを返すようにSPPersistedObject.HasAdditionalUpdateAccess
を上書きするか、それでも最小特権環境では十分ではありませんか。そうでない場合は、カスタムデータベース以外の情報を保存する必要がありますか?
解決
昇格特権は設定に書き込むのに十分ではありません データベース。上昇した特権を持つWebを使用します アプリケーションアプリプールの識別子。 デフォルトで設定DB。もちろん管理者ユーザー(セントラルを実行します 管理者は読み書き権限を持つべきです)。
.SPPersistedObject.HasAdditionalUpdateAccess
は、ファーム管理者ユーザーに偽装される非ファーム管理者ユーザーが必要です。
いくらかの補償を必要とする最終トピックの1つはセキュリティです。述べたように 以前に、HOSはファーム構成データベースに存在します。厳密に それを話すことは、管理機能をサポートするために存在します このスコープを超えて使用しました。たとえば、カスタムを構築している場合 タイマーの仕事と私たちは仕事に仕事を提出する能力を持っています 完了のため。これらのタスクが発生する可能性が最も高いです 管理されていない範囲内で。おそらくユーザーの結果として 他のサイトコレクションのWebPartのボタンをクリックします。 withう 以前のバージョンのSharePoints、これは単に不可能でした。のみ ファーム管理者はHOSを更新できます。しかしSharePointで 2010、ベースSPPersistedObjectに追加されました 他のユーザーにHOSを開きます。これがどのように機能するかを確認するには、変更できます 以下の主な機能:
.using System; using System.Runtime.InteropServices; using System.Security.Principal; namespace PersistedObjectDemo { internal class Program { private const int LOGON_TYPE_INTERACTIVE = 2; private const int LOGON_TYPE_PROVIDER_DEFAULT = 0; [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern bool LogonUser(string userName, string domain, string password, int logonType, int logonProvider, ref IntPtr accessToken); private static void Main(string[] args) { try { IntPtr accessToken = IntPtr.Zero; if (LogonUser("non-farm-admin-username", "your-domain-name", "your-password", LOGON_TYPE_INTERACTIVE, LOGON_TYPE_PROVIDER_DEFAULT, ref accessToken)) { using (var identity = new WindowsIdentity(accessToken)) { using (identity.Impersonate()) { MyPersistedObject obj = MyPersistedObject.Local; //delete existing object and recreate to keep things simple obj.Delete(); obj = MyPersistedObject.Local; obj.Foo = "Some updated value"; obj.Update(); } } } } catch (Exception ex) { Console.Write(ex); } Console.WriteLine("Press return to exit"); Console.ReadLine(); } } }
このコードは、ファーム以外の管理者が更新するための試みをシミュレートします。 ホスこれを実行すると、次の例外が表示されます。 Gotcha Number 3:
system.security.securityException:アクセスが拒否されました。 at Microsoft.SharePoint.Administration.SpperSistedObject.baseUpdate()AT persistedObjectDemo.MyperSistedObject.update()
不足なことに、ファーム以外の管理者ユーザーを使用してHOSを更新しようとしています 例外をスローします。ただし、以下のコードを追加した場合 MyPersistedObject.csとプログラムをもう一度実行します。 HOSは適切に更新されます。
.protected override bool HasAdditionalUpdateAccess() { return true; }
もちろん、現実のアプリケーションでは、おそらく追加したいと思うでしょう。 単にtrueを返すのではなく、この関数でのセキュリティチェック 誰かが私たちのオブジェクトを更新することを許可しますが、うまくいけばこれ 点を十分に示しています。セキュリティに関して他の1つのGOTCHAがあります - SharePointがある場合 2010インストールされた、デフォルトでは、ファーム管理者アカウントのみが読み書きがあります。 Configデータベースへのアクセス。最小特権インストールでは、すべて Webアプリケーションその他の中央管理は実行されます 独自のサービスアカウントの下で、これらのアカウントは書き込みません Configデータベースへのアクセス。その結果、追加、削除、および HOS内のオブジェクトを更新することはできません。上書きされていますが HasAdditionalUpdateAccessを使用すると、誰ができるかをもう少しコントロールできます。 基礎となるアプリプールアカウントには、HOSを更新します。 適切なデータベース権限は私たちがきれいになっています すぐに。
- もっと見るhttp://www.chaholl.com/archive / 2011/01/30/the-skinny-on-sppersistedobject-and-the-hierarchical-Object-StorInin。 ASPX#sthash.yujnw8op.dpuf "> http://www.chaholl.com/archive/2011/01/30/the-skinny-on-sppersistedobject-and-the-hierarchical-Object-Store-in.aspx#stHash. .yujnw8op.dpuf