ICertPolicy::VerifyRequest メソッド (certpol.h)
VerifyRequest メソッドは、新しい要求がシステムに入力されたことをポリシー モジュールに通知します。 ポリシー モジュールは、要求または関連付けられた証明書のプロパティを取得または設定するときに、 パラメーターとして Context を渡すことによって、その要求と対話できます。
返される廃棄値は、後で評価するために要求が受け入れられたか、拒否されたか、または管理キューに送信されたかを示します。
構文
HRESULT VerifyRequest(
[in] const BSTR strConfig,
[in] LONG Context,
[in] LONG bNewRequest,
[in] LONG Flags,
[out, retval] LONG *pDisposition
);
パラメーター
[in] strConfig
証明書サービスのセットアップ時に入力された 証明機関の名前を表します。 構成文字列名の詳細については、「 ICertConfig」を参照してください。
[in] Context
要求と、構築中の関連する証明書を識別します。 証明書サーバーは、コンテキストをこのメソッドに渡します。
[in] bNewRequest
TRUE に設定されている場合は、要求が新しいかどうかを指定します。 FALSE に設定すると、ICertAdmin::ResubmitRequest 呼び出しの結果として、要求がポリシー モジュールに再送信されます。 FALSE の値を使用すると、管理者が要求を発行することを望んでいるか、管理者によって設定された要求プロパティを調べる必要があることを示すことができます。
TRUE は C/C++ プログラマの場合は (Microsoft ヘッダー ファイル内で) 1 つとして定義され、Visual Basic では True キーワード (keyword)が負のものとして定義されることに注意してください。 その結果、Visual Basic 開発者は、このパラメーターを TRUE に設定するために、(True ではなく) 1 つを使用する必要があります。 ただし、このパラメーターを FALSE に設定するには、Visual Basic 開発者は 0 または False を使用できます。
[in] Flags
このパラメーターは予約済みであり、0 に設定する必要があります。
[out, retval] pDisposition
処理値へのポインター。 メソッドは、次のいずれかの処理を設定します。
値 | 意味 |
---|---|
|
要求の拒否。 |
|
要求を受け入れます。 |
|
要求をキューに追加して、後で要求を受け入れるか拒否します。 |
戻り値
C++
メソッドが成功した場合、メソッドは S_OKを返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。 一般的なエラー コードの一覧については、「 共通 HRESULT 値」を参照してください。
VB
戻り値は、次のいずれかの値である必要がある処理を指定します。リターン コード | 説明 |
---|---|
|
要求の拒否。 |
|
要求を受け入れます。 |
|
要求をキューに追加して、後で要求を受け入れるか拒否します。 |
注釈
VerifyRequest は、他のプロセスを解放したり、外部データベースにアクセスして要求の検証を行ったりすることができます。 検証で帯域外処理または人間の介入が必要な場合、 VerifyRequest は別のプロセスに通知するか、受信要求が必要な通知を残すことができます。 帯域外処理が完了したら、 ResubmitRequest の呼び出しを行うか、指定された管理ツールを使用してポリシー モジュールに要求を再送信できます。 ポリシー モジュールは、要求を再度調べ、必要な外部データにアクセスし、証明書を発行または拒否する必要があることを示す値を返すことができます。
カスタム ポリシー モジュールを記述するときは、 モジュールに VerifyRequest 機能を実装する必要があります。
例
次の例は、 VerifyRequest メソッドの実装の可能性を示しています。
#include <windows.h>
#include <stdio.h>
#include <Certpol.h>
STDMETHODIMP CCertPolicy::VerifyRequest(
BSTR const strConfig,
LONG Context,
LONG bNewRequest,
LONG Flags,
LONG __RPC_FAR *pDisposition)
{
HRESULT hr;
long nDisp = VR_INSTANT_BAD;
ICertServerPolicy *pServer = NULL;
BSTR bstrPropName = NULL;
VARIANT varProp;
// Verify that pointer is not NULL.
if ( NULL == pDisposition )
{
hr = E_POINTER; // E_POINTER is #defined in Winerror.h
goto error;
}
// Set disposition to pending.
*pDisposition = VR_PENDING;
// Obtain a pointer to the CertServerPolicy interface.
hr = CoCreateInstance( CLSID_CCertServerPolicy,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICertServerPolicy,
(void **) &pServer);
if (FAILED( hr ))
{
printf("Failed CoCreateInstance for pServer - %x\n", hr );
goto error;
}
// Set the context to refer to this request.
hr = pServer->SetContext(Context);
if (FAILED( hr ))
{
printf("Failed SetContext(%u) - %x\n", Context, hr );
goto error;
}
// This policy will perform a database check on the CN.
// Set the property name to Subject.Commonname.
bstrPropName = SysAllocString(L"Subject.Commonname");
if ( NULL == bstrPropName )
{
hr = E_OUTOFMEMORY; // #defined in Winerror.h
printf("Failed SysAllocString (no memory)\n" );
goto error;
}
// Retrieve the certificate property for the CN.
// Actual implementations may want to examine other properties.
VariantInit( &varProp );
hr = pServer->GetCertificateProperty( bstrPropName,
PROPTYPE_STRING,
&varProp );
if (FAILED(hr))
{
printf("Failed GetCertificateProperty - %x\n", hr);
goto error;
}
// For this simple sample, merely check CN in a database.
// (Implementation not shown, as it is application-specific).
hr = MyDatabaseCheck( varProp.bstrVal );
if ( S_OK == hr )
*pDisposition = VR_INSTANT_OK; // Accepted.
else
*pDisposition = VR_INSTANT_BAD; // Denied.
error:
// Free resources.
if (NULL != pServer)
pServer->Release();
VariantClear( &varProp );
if ( NULL != bstrPropName )
SysFreeString( bstrPropName );
return(hr);
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | サポートなし |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | certpol.h (Certsrv.h を含む) |
Library | Certidl.lib |