たとえば、プロセスと同じコンテキストでスレッドを実行したい場合は、次のようにすることができます。
private void ImpersonateThread()
{
new Thread(() =>
{
Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
//Do the work...
}).Start();
}
アプリケーション プールが 1 人のユーザーとして実行され、認証モードが Windows 認証に設定されている Web サイト (MS-IIS 上) を実行している場合、これは非常に便利です。次に、Web サイトにアクセスするユーザーとしてスレッドを実行することをお勧めします。
アップデート:
これを明確にしたいだけです。この線:
Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
ユーザー(ユーザーはまだスレッドに偽装されていません)をスレッドに転送するだけで、他のコンポーネントがユーザーが誰であるかを確認し、必要に応じて情報を使用できるようになります。たとえば、次のようになります。
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext =
((System.Security.Principal.WindowsIdentity)System.Threading.Thread.CurrentPrincipal.Identity).Impersonate();
//Do the work that you want within the impersonated users context.
impersonationContext.Undo();
偽装と元に戻すの間に、ユーザーは偽装され、すべてのコードがこのユーザーとして実行されます。このサンプルではユーザーが同じであることはわかっていますが、プロセスを実行しているユーザーとはまったく異なるユーザー (ユーザーが入力したものなど) をスレッドが保持していると想像してください。お役に立てれば :-)