偽装レベル (承認)

SECURITY_IMPERSONATION_LEVEL列挙は、サーバーがクライアントのコンテキストで実行できる操作を決定する 4 つの偽装レベルを定義します。

偽装レベル 説明
SecurityAnonymous サーバーは、クライアントを偽装または識別できません。
SecurityIdentification サーバーはクライアントの ID と特権を取得できますが、クライアントを偽装することはできません。
SecurityImpersonation サーバーは、ローカル システムでクライアントのセキュリティ コンテキストを偽装できます。
SecurityDelegation サーバーは、リモート システムでクライアントのセキュリティ コンテキストを偽装できます。

 

名前付きパイプ、RPC、または DDE 接続のクライアントは、偽装レベルを制御できます。 たとえば、名前付きパイプ クライアントは CreateFile 関数を呼び出して、名前付きパイプへのハンドルを開き、サーバーの偽装レベルを指定できます。

名前付きパイプ、RPC、または DDE 接続がリモートの場合、偽装レベルを設定するために CreateFile に渡されるフラグは無視されます。 この場合、クライアントの偽装レベルは、サーバーによって有効になっている偽装レベルによって決まります。このレベルは、ディレクトリ サービス内のサーバーのアカウントのフラグによって設定されます。 たとえば、サーバーで委任が有効になっている場合、 CreateFile に渡されるフラグで ID 偽装レベルが指定されている場合でも、クライアントの偽装レベルも委任に設定されます。

DDE クライアントは、偽装レベルを指定するために、 ddeSetQualityOfService 関数と SECURITY_QUALITY_OF_SERVICE 構造体を使用します。 SecurityImpersonation レベルは、名前付きパイプ、RPC、DDE サーバーの既定値です。 ImpersonateSelfDuplicateTokenDuplicateTokenEx 関数を使用すると、呼び出し元は偽装レベルを指定できます。 GetTokenInformation 関数を使用して、アクセス トークンの偽装レベルを取得します。

SecurityImpersonation レベルでは、スレッドのほとんどのアクションは、スレッドを所有するプロセスプライマリ トークンではなく、スレッドの偽装トークンのセキュリティ コンテキストで発生します。 たとえば、偽装スレッドがセキュリティ保護可能なオブジェクトを開いた場合、システムは偽装トークンを使用してスレッドのアクセスをチェックします。 同様に、偽装スレッドが CreateFile 関数を呼び出して新しいオブジェクトを作成した場合、新しいオブジェクトの所有者はクライアントの アクセス トークンの既定の所有者になります。

ただし、システムは、次の状況で呼び出し元スレッドの偽装トークンではなく、プロセスのプライマリ トークンを使用します。

  • 偽装スレッドが CreateProcess 関数を呼び出すと、新しいプロセスは常にプロセスのプライマリ トークンを継承します。
  • LogonUser 関数など、SE_TCB_NAME特権を必要とする関数の場合、システムは常にプロセスのプライマリ トークン内の特権をチェックします。
  • ObjectOpenAuditAlarm 関数など、SE_AUDIT_NAME特権を必要とする関数の場合、システムは常にプロセスのプライマリ トークン内の特権をチェックします。
  • OpenThreadToken 関数の呼び出しでは、スレッドは、関数が偽装トークンまたはプライマリ トークンを使用して、要求されたアクセスを許可するかどうかを決定するかどうかを指定できます。