Language

偽装と復帰

注

この記事は Windows に適用されます。

ASP.NET Core の詳細については、「ASP.NET Core のセキュリティ」を参照してください。

場合によっては、Windows アカウントを偽装するために Windows アカウント トークンを取得する必要があります。 たとえば、ASP などです。NET ベースのアプリケーションは、異なる時間に複数のユーザーの代わりに動作する必要がある場合があります。 アプリケーションは、インターネット インフォメーション サービス (IIS) の管理者を表すトークンを受け入れ、そのユーザーを偽装し、操作を実行して、前の ID に戻すことができます。 次に、権限の少ないユーザーを表す IIS からのトークンを受け入れ、何らかの操作を実行して、もう一度元に戻すことができます。

IIS によって現在のスレッドにアタッチされていない Windows アカウントをアプリケーションが偽装する必要がある場合は、そのアカウントのトークンを取得し、それを使用してアカウントをアクティブ化する必要があります。 これを行うには、次のタスクを実行します。

  1. アンマネージ LogonUser メソッドを呼び出して、特定のユーザーのアカウント トークンを取得します。 このメソッドは .NET 基本クラス ライブラリ内にありませんが、アンマネージ advapi32.dllにあります。 アンマネージ コード内のメソッドへのアクセスは高度な操作であり、この説明の範囲外です。 詳細については、「アンマネージ コードとの相互運用」を参照してください。 LogonUser メソッドと advapi32.dllの詳細については、プラットフォーム SDK のドキュメントを参照してください。

  2. トークンを渡して、 WindowsIdentity クラスの新しいインスタンスを作成します。 次のコードは、この呼び出しを示しています。ここで、 hToken は Windows トークンを表します。

    WindowsIdentity impersonatedIdentity = new WindowsIdentity(hToken);
    
    Dim impersonatedIdentity As New WindowsIdentity(hToken)
    
  3. 次のコードに示すように、 WindowsImpersonationContext クラスの新しいインスタンスを作成し、初期化されたクラスの WindowsIdentity.Impersonate メソッドを使用して初期化することで、偽装を開始します。

    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate();
    
    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate()
    
  4. 偽装する必要がなくなったら、次のコードに示すように、 WindowsImpersonationContext.Undo メソッドを呼び出して偽装を元に戻します。

    myImpersonation.Undo();
    
    myImpersonation.Undo()
    

信頼されたコードが既に WindowsPrincipal オブジェクトをスレッドにアタッチしている場合は、アカウント トークンを受け取らないインスタンス メソッド Impersonate を呼び出すことができます。 これは、スレッド上の WindowsPrincipal オブジェクトが、プロセスが現在実行されているユーザー以外のユーザーを表している場合にのみ役立つことに注意してください。 たとえば、Windows 認証を有効にして偽装を無効にした ASP.NET を使用して、このような状況が発生する場合があります。 この場合、プロセスはインターネット インフォメーション サービス (IIS) で構成されたアカウントで実行され、現在のプリンシパルはページにアクセスしている Windows ユーザーを表します。

偽装も元に戻すことも、現在の呼び出しコンテキストに関連付けられているプリンシパルオブジェクト (IPrincipal) を変更しないことに注意してください。 偽装と元に戻す操作によって変更されるのは、現在のオペレーティング システム プロセスに関連付けたトークンです。

こちらも参照ください