Web アプリケーションが実行されているのと同じサービス ID で実行される SharePoint サイトのコードを呼び出す必要があります。既定では、SharePoint は Web ページを表示しているユーザーを偽装し、ユーザーは必要なアクセス許可を持っていません。
Web アプリケーションのサービス ID を使用してコードを実行し、その後デフォルトの偽装を使用するように戻す最良の方法は何ですか?
Web アプリケーションが実行されているのと同じサービス ID で実行される SharePoint サイトのコードを呼び出す必要があります。既定では、SharePoint は Web ページを表示しているユーザーを偽装し、ユーザーは必要なアクセス許可を持っていません。
Web アプリケーションのサービス ID を使用してコードを実行し、その後デフォルトの偽装を使用するように戻す最良の方法は何ですか?
ナットは正しいです。SPSecurity.RunWithElevatedPrivileges を使用する必要があります。内部では、Anthony が言及している ReverToSelf を実行しますが、ヘルパー メソッドを使用する方がはるかに簡単です。次の例のように、インライン デリゲートを使用できます。
理解しておくべき主なことは、このデリゲートは別のアプリケーション ドメインで実行されるということです。これは、基本的に、SPSite または SPWeb を使用する必要があることを意味し、以下に示すように、デリゲート内でそれらを再インスタンス化する必要があります。
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// Your are now inside the delegate
// Anything provided within this block is marshaled across the app domain
using (SPSite site = new SPSite("http://myserver/sites/mysite"))
{
using (SPWeb web= site.OpenWeb())
{
// Do stuff here
}
}
});
簡単!HostingEnvironment.Impersonate()ブロックで行っている呼び出しをラップします。
http://msdn.microsoft.com/en-us/library/system.web.hosting.hostingenvironment.impersonate.aspx
ASPの下には、Win32のRevertToSelf()関数(advapi32.dllにあります)を呼び出してASPをアプリケーションプールのIDで実行するために使用できるユーティリティDLLがありました。
もちろん、一度そこに入ると、スレッドが使用していた元のIDに戻ることはできませんが、それは実際には問題ではありません。現在のリクエストが終了すると、次のリクエストはユーザーID(または匿名ユーザー)で再度実行されます。
ASP.NETのPInvokeでも同じことができると思いますが、フレームワークにどのような影響があるのかわかりません。私はそれが現在の要求に対してのみ続くと確信しています。これを行うための標準の.NETAPIはないと思います。