2011-12-13 12 views
1

私は2つのサイトコレクションを持ち、AとBを呼び出すだけです。複数のサイトコレクションにわたって同期するいくつかのコンテンツのリストがあります。私はデータをクエリするカスタムコンテンツクエリWebパーツを作成しましたが、私はロードブロックに入っています。SharePoint 2010 RunWithElevatedPrivilegesのコンテキストを変更します。

ユーザーレベルのアカウントはサイトAに全くアクセスできず、どのレベルでもこの​​サイトにアクセスしたくないため、Webパーツがサイトで実行されるとアクセス拒否エラーが発生しますB. RunWithElevatedPrivilegesが動作するコンテキストを変更する方法はありますか?私はSPSecurity.RunWithElevatedPrivilegesでこれをラップする場合は、サイトコレクションBから実行

私の現在のコードは

ClientContext clientContext = new ClientContext(siteAUrl); 
SP.List oList = clientContext.Web.Lists.GetByTitle(listName); 

CamlQuery query = new CamlQuery(); 
//Add View, Execute Query, etc. 

return results; 

のように見える、それは私はむしろそれがサイトコレクション内で実行しますサイトコレクションBのコンテキスト内での上昇で実行されます文脈。

答えて

4

SharePoint 2010クライアントオブジェクトモデルは、SPSecurity.RunWithElevatedPrivilegesをサポートしていません。 @Natの状態では、この呼び出しはスレッドIDをアプリケーションプールアカウント(SystemAccount)に戻します。コードをクライアントで実行しているため、IDをアプリケーションプールアカウントに戻すことはできません。 クライアントオブジェクトモデルを介してコードをシステムアカウントとして実行すると、セキュリティホールが開かれます。誰もが管理者としてコードを書いて実行することができます。

あなたのコードがサーバー上で実行する場合は、システムアカウントの資格情報を使用してSPSiteを開くためにSPUserToken.SystemAccountを使用することができますが:

using (SPSite site = new SPSite("http://someurl", SPUserToken.SystemAccount)) 
{ 
    // admin action here 
} 

詳細については、私のブログ記事How to Open a SPSite with System Account Credentialsをチェックしてください。

2

SPSecurity.RunWithElevatedPrivilegesは、アプリケーションプールアカウントのセキュリティコンテキストでコードを実行していることに注意してください。 異なるWebアプリケーションでサイトコレクションを実行している場合を除き、それらは同じコンテキストを持ちます。すなわち調査された全てのマスター。

サイトコレクションを実行している場合は、アプリケーションプールアカウントによって他のWebアプリケーションのアクセス許可が指定されます。

関連する問題