CoInitializeSecurity を使用したプロセス全体のセキュリティの設定

CoInitializeSecurity 関数を使用すると、アプリケーションのセキュリティをプログラムで設定することで、複雑なセキュリティ シナリオを制御できます。 このトピックでは、CoInitializeSecurity を使用するシナリオについて説明し、その使用方法について詳しく説明します。

CoInitializeSecurity を使用して、プログラム内でプロセス全体のセキュリティを設定する理由はいくつかあります。 たとえば、dcomcnfg.exe を使用してアプリケーションの認証レベルとアクセス許可を設定できますが、コンピューターの既定の偽装レベルが、プロセスに必要なレベルではない可能性があります。 プロセスに対してこの設定を変更する唯一の方法は、CoInitializeSecurity を呼び出す方法です。

Schannel セキュリティ プロバイダーを使用する場合は、CoInitializeSecurity の呼び出しで認証サービスとして指定する必要があります。

プロセス全体のセキュリティをプログラムで設定するもう 1 つの一般的なシナリオは、プロセス全体に既定のセキュリティを設定したいが、そのプロセス内に特別なセキュリティ要件を持つインターフェイスを公開する 1 つ以上のオブジェクトがある場合です。 この場合は、CoInitializeSecurity を呼び出してプロセスのセキュリティを設定し、COM がほとんどのセキュリティ チェックを処理できるようにします。また、他のメソッドを呼び出して、特別なセキュリティ ニーズを持つオブジェクトのセキュリティを設定できます。 これらのメソッドと関数の呼び出しについては、「インターフェイス プロキシ レベルでのセキュリティの設定」を参照してください。

アプリケーションに、時間帯に応じて特定のグループに異なるオブジェクトへのアクセスを許可するなど、非常に特殊なセキュリティ要件がある場合は、すべてのセキュリティをプログラムで処理し、COM による自動チェックがまったく行われないようにすることをお勧めします。 これを行うには、CoInitializeSecurity を呼び出し、dwAuthnLevel パラメーターを none に設定し、pVoid パラメーターを NULL に設定する必要があります。 独自のセキュリティ パッケージがある場合は、pAuthnSvc パラメーターに登録する必要もあります。 その後、「インターフェイス プロキシ レベルでのセキュリティの設定」で説明されているプロキシ レベルのインターフェイスと関数の呼び出しを使用して、独自のすべてのセキュリティをプログラムで処理できます。

CoInitializeSecurity には、豊富な機能セットが用意されています。 CoInitializeSecurity を呼び出すと、レジストリ値は無視され、代わりに呼び出しに渡すセキュリティの初期化値が使用されます。 必要な結果に応じて、最初のパラメーター pVoid は、SECURITY_DESCRIPTORIAccessControl、または AppID へのポインターの 3 種類の値を指すことができます。 ほとんどの場合、Windows 関数を使用して、pVoid が指す SECURITY_DESCRIPTOR を作成します。

ただし、pVoidIAccessControl オブジェクトを指すこともできます。

IAccessControl オブジェクトを pVoid に渡すことを CoInitializeSecurity に示すには、EOAC_ACCESS_CONTROL 値を dwCapabilities パラメーターに渡す必要があります。 CoInitializeSecurity は、アクセス チェックの結果をキャッシュするため、CoInitializeSecurity を呼び出した後にアクセス制御リストを変更することはできません。

pVoid パラメーターに渡すことができる別の種類の値は、アプリケーションの AppID である GUID へのポインターです。 pVoid が AppID へのポインターである場合は、pCapabilities パラメーターに EOAC_APPIDを指定して、関数が pVoid で期待する値を認識できるようにする必要があります。 pVoid が AppID を指している場合、CoInitializeSecurity は認証値にレジストリのみを使用し、CoInitializeSecurity に対する他のすべてのパラメーターを無視します。

プロセス全体のセキュリティの設定