1

2つのサイトコレクションがあります。それらをAとBと呼びましょう。AIには、複数のサイトコレクション間で同期したいコンテンツのリストがあります。データをクエリするカスタムコンテンツクエリWebパーツを作成しましたが、障害が発生しています。

ユーザーレベルのアカウントはサイトAにまったくアクセスできず、どのレベルでもこの​​サイトにアクセスできないようにするため、WebパーツがサイトBで実行されると、アクセス拒否エラーが発生します。 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;

これをSPSecurity.RunWithElevatedPrivilegesでラップすると、サイトコレクションAコンテキスト内で実行したい場合は、サイトコレクションBコンテキスト内で昇格して実行されます。

4

2 に答える 2

4

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

コードがサーバー上で実行されている場合は、を使用してシステムアカウントのクレデンシャルでSPUserToken.SystemAccountを開くことができます。SPSite

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

詳細については、私のブログ投稿「システムアカウントの資格情報を使用してSPSiteを開く方法」を確認してください。

于 2011-12-14T13:22:14.957 に答える
2

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

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

于 2011-12-14T03:29:20.207 に答える