偽装と復帰
場合によっては、Windows アカウント トークンを取得して、Windows アカウントを偽装する必要があります。 たとえば、ASP.NET ベースのアプリケーションが、時間によって複数のユーザーの代わりに操作しなければならない場合があります。 その場合、アプリケーションはインターネット インフォメーション サービス (IIS) から管理者を表すトークンを受け入れて、そのユーザーを偽装し、操作を実行してから前の ID に戻ります。 続いて、IIS から管理者より権限が少ないユーザーを表すトークンを受け入れ、操作を実行してから、また元に戻ります。
アプリケーションが、IIS によって現在のスレッドにアタッチされていない Windows アカウントを偽装しなければならない場合は、そのアカウントのトークンを取得し、そのトークンを使用してアカウントをアクティブ化する必要があります。 それには、次のタスクを実行します。
アンマネージ LogonUser メソッドを呼び出すことによって、特定のユーザーのアカウント トークンを取得します。 このメソッドは、.NET の基底クラス ライブラリには含まれていませんが、アンマネージ advapi32.dll 内にあります。 アンマネージ コード内のメソッドへのアクセスは高度な操作であり、ここでは説明しません。 詳細については、「アンマネージ コードとの相互運用」を参照してください。 LogonUser メソッドと advapi32.dll の詳細については、プラットフォーム SDK ドキュメントを参照してください。
WindowsIdentity クラスの新しいインスタンスを作成し、トークンを渡します。 次のコードに、この呼び出しを示します。ここで、
hToken
は Windows トークンを表します。WindowsIdentity impersonatedIdentity = new WindowsIdentity(hToken);
Dim impersonatedIdentity As New WindowsIdentity(hToken)
このコードに示されているように、WindowsImpersonationContext クラスの新しいインスタンスを作成し、そのインスタンスを、初期化されたクラスの WindowsIdentity.Impersonate メソッドで初期化することで、偽装を開始します。
WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate();
WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate()
偽装する必要がなくなったら、以下のコードに示されているように WindowsImpersonationContext.Undo メソッドを呼び出して、偽装を元に戻します。
myImpersonation.Undo();
myImpersonation.Undo()
信頼されるコードによって WindowsPrincipal オブジェクトが既にスレッドにアタッチされている場合は、アカウント トークンを取らないインスタンス メソッド Impersonate を呼び出すことができます。 この方法が役立つのは、スレッドで WindowsPrincipal オブジェクトが表しているユーザーが、現在プロセスが実行されているユーザーではない場合のみです。 このような状態は、たとえば、Windows 認証を有効にして、偽装を無効にした ASP.NET を使用している場合に発生することがあります。 その場合、プロセスはインターネット インフォメーション サービス (IIS) で構成されたアカウントで実行されますが、現在のプリンシパルは、ページにアクセスしている Windows ユーザーを表しています。
Impersonate と Undo のいずれでも、現在の呼び出しコンテキストに関連する Principal オブジェクト (IPrincipal) は変更されないことに注意してください。 偽装と元に戻す操作によって変更されるのは、現在のオペレーティング システム プロセスに関連付けたトークンです。
関連項目
.NET