CoInitializeSecurity 関数 (combaseapi.h)

セキュリティを登録し、プロセスの既定のセキュリティ値を設定します。

構文

HRESULT CoInitializeSecurity(
  [in, optional] PSECURITY_DESCRIPTOR        pSecDesc,
  [in]           LONG                        cAuthSvc,
  [in, optional] SOLE_AUTHENTICATION_SERVICE *asAuthSvc,
  [in, optional] void                        *pReserved1,
  [in]           DWORD                       dwAuthnLevel,
  [in]           DWORD                       dwImpLevel,
  [in, optional] void                        *pAuthList,
  [in]           DWORD                       dwCapabilities,
  [in, optional] void                        *pReserved3
);

パラメーター

[in, optional] pSecDesc

サーバーが呼び出しを受信するために使用するアクセス許可。 このパラメーターは、サーバーが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。 その値は、AppID、 IAccessControl オブジェクト、または絶対形式の SECURITY_DESCRIPTORの 3 種類のいずれかを指すポインターです。 詳細については、次の「解説」を参照してください。

[in] cAuthSvc

asAuthSvc パラメーター内のエントリの数。 このパラメーターは、サーバーが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。 このパラメーターが 0 の場合、認証サービスは登録されません。サーバーはセキュリティで保護された呼び出しを受信できません。 値 -1 は、登録する認証サービスを選択するように COM に指示します。この場合、 asAuthSvc パラメーターは NULL である必要があります。 ただし、このパラメーターが -1 の場合、Schannel はサーバーによって認証サービスとして選択されることはありません。

[in, optional] asAuthSvc

サーバーが呼び出しを受信するために使用する認証サービスの配列。 このパラメーターは、サーバーが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。 詳細については、「 SOLE_AUTHENTICATION_SERVICE」を参照してください。

[in, optional] pReserved1

このパラメーターは予約されており、 NULL である必要があります。

[in] dwAuthnLevel

プロセスの既定の認証レベル。 サーバーとクライアントはどちらも 、CoInitializeSecurity を呼び出すときにこのパラメーターを使用します。 COM は、低い認証レベルで到着した呼び出しに失敗します。 既定では、すべてのプロキシで少なくともこの認証レベルが使用されます。 この値には、 認証レベルの定数のいずれかが含まれている必要があります。 既定では、 IUnknown へのすべての呼び出しはこのレベルで行われます。

[in] dwImpLevel

プロキシの既定の偽装レベル。 このパラメーターの値は、プロセスがクライアントの場合にのみ使用されます。 RPC_C_IMP_LEVEL_DEFAULTを除き、 偽装レベルの定数の値である必要があります。 これは CoInitializeSecurity では使用できません。

クライアントからの発信呼び出しでは、常に、指定した権限借用レベルが使用されます。 (ネゴシエートされません。クライアントへの着信呼び出しは、任意の偽装レベルで行うことができます。 既定では、すべての IUnknown 呼び出しはこの偽装レベルで行われます。そのため、セキュリティ対応アプリケーションでも、このレベルは慎重に設定する必要があります。 各認証サービスがサポートする偽装レベルを確認するには、 COM およびセキュリティ パッケージの認証サービスの説明を参照してください。 偽装レベルの詳細については、「 偽装」を参照してください。

[in, optional] pAuthList

構造体の配列であるSOLE_AUTHENTICATION_LISTへのポインター SOLE_AUTHENTICATION_INFO。 この一覧は、クライアントがサーバーの呼び出しに使用できる各認証サービスの情報を示します。 このパラメーターは、クライアントが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。

[in] dwCapabilities

1 つ以上の EOLE_AUTHENTICATION_CAPABILITIES 値を設定して指定された、クライアントまたはサーバーの追加機能。 これらの値の一部は同時に使用できず、特定の認証サービスが使用されている場合は設定できないものがあります。 これらのフラグの詳細については、「解説」セクションを参照してください。

[in, optional] pReserved3

このパラメーターは予約されており、 NULL である必要があります。

戻り値

この関数は、標準の戻り値E_INVALIDARGと、次の値を返すことができます。

リターン コード 説明
S_OK
成功を示します。
RPC_E_TOO_LATE

CoInitializeSecurity は既に呼び出されています。

RPC_E_NO_GOOD_SECURITY_PACKAGES
asAuthSvc パラメーターが NULL ではなく、リスト内の認証サービスを登録できませんでした。 asAuthSvc に保存された結果で、認証サービス固有のエラー コードを確認します。
E_OUT_OF_MEMORY
メモリが不足しています。

注釈

CoInitializeSecurity 関数は、セキュリティ レイヤーを初期化し、指定された値をセキュリティの既定値として設定します。 プロセスが CoInitializeSecurity を呼び出さない場合、COM はインターフェイスが初めてマーシャリングまたはマーシャリング解除されるときに自動的に呼び出し、システムの既定のセキュリティを登録します。 それまで、既定のセキュリティ パッケージは登録されません。

この関数は、明示的または暗黙的に、プロセスごとに 1 回だけ呼び出されます。 これは、クライアント、サーバー、またはその両方によって呼び出すことができます。 CoInitializeSecurity を明示的に呼び出さないレガシ アプリケーションやその他のアプリケーションの場合、COM はレジストリの値を使用してこの関数を暗黙的に呼び出します。 レジストリを使用してプロセス全体のセキュリティを設定し、 CoInitializeSecurity を呼び出すと、 AppID レジストリ値は無視され 、CoInitializeSecurity 値が使用されます。

CoInitializeSecurity を使用すると、コンピューター全体のアクセス許可とアプリケーション固有のアクセス許可の両方をオーバーライドできますが、コンピューター全体の制限ポリシーをオーバーライドすることはできません。

pSecDesc が AppID を指している場合、EOAC_APPID フラグは dwCapabilities で設定する必要があります。また、EOAC_APPID フラグが設定されている場合、CoInitializeSecurity に対するその他のすべてのパラメーターは無視されます。 CoInitializeSecurity は、レジストリ内の AppID キーの下で認証レベルを検索し、それを使用して既定のセキュリティを決定します。 AppID キーを使用してセキュリティを設定する方法の詳細については、「レジストリを使用した Process-Wide セキュリティの設定」を参照してください。

pSecDescIAccessControl オブジェクトへのポインターである場合、EOAC_ACCESS_CONTROL フラグを設定する必要があり、dwAuthnLevel を none にすることはできません。 IAccessControl オブジェクトは、プロセスを呼び出すことができるユーザーを決定するために使用されます。 DCOM は IAccessControlAddRef し、CoUninitialize が呼び出されたときに解放します。 IAccessControl オブジェクトの状態を変更しないでください。

pSecDescSECURITY_DESCRIPTORへのポインターである場合、dwCapabilities でEOAC_APPIDフラグとEOAC_ACCESS_CONTROL フラグを設定することはできません。 SECURITY_DESCRIPTORの所有者とグループを設定する必要があります。DCOM が監査をサポートするまで、システム ACL は NULL である必要があります。 SECURITY_DESCRIPTORの随意 ACL (DACL) のアクセス制御エントリ (ACE) は、プロセスのオブジェクトへの接続が許可されている呼び出し元を確認するために使用されます。 ACE のない DACL ではアクセスは許可されませんが、 NULL DACL では誰からの呼び出しも許可されます。 ACL と ACE の詳細については、「Access Control モデル」を参照してください。 アプリケーションは AccessCheck (IsValidSecurityDescriptor ではなく) を呼び出して、CoInitializeSecurity を呼び出す前にSECURITY_DESCRIPTORが正しく形成されていることを確認する必要があります。

pSecDescを NULL として渡すことを強くお勧めします。 適切な代替手段として、Everyone を許可する SECURITY_DESCRIPTOR を使用することもできます。 pSecDescNULL の場合、dwCapabilities のフラグによって、次のように、サーバーが使用するアクセス許可が CoInitializeSecurity によってどのように定義されるかが決まります。

  • EOAC_APPID フラグが設定されている場合、 CoInitializeSecurity はレジストリ内のアプリケーションの .exe 名を検索し、そこに格納されている AppID を使用します。
  • EOAC_ACCESS_CONTROL フラグが設定されている場合、 CoInitializeSecurity はエラーを返します。
  • EOAC_APPID フラグもEOAC_ACCESS_CONTROL フラグも設定されていない場合、 CoInitializeSecurity はローカルおよびリモート匿名ユーザーを含むすべての呼び出し元を許可します。
EOAC_APPIDフラグとEOAC_ACCESS_CONTROL フラグの両方が dwCapabilities に設定されている場合、CoInitializeSecurity 関数はエラーを返します。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー combaseapi.h (Objbase.h を含む)
Library Ole32.lib
[DLL] Ole32.dll

こちらもご覧ください

CoSetProxyBlanket

COM のセキュリティ