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 在 Microsoft 头文件中 (定义,) C/C++ 程序员为一个,而 Visual Basic 将 True 关键字 (keyword) 定义为负数。 因此,Visual Basic 开发人员必须使用一个 (而不是 True) 将此参数设置为 TRUE。 但是,若要将此参数设置为 FALSE,Visual Basic 开发人员可以使用零或 False

[in] Flags

此参数是保留的,必须设置为零。

[out, retval] pDisposition

指向处置值的指针。 方法设置以下处置之一。

含义
VR_INSTANT_BAD
拒绝请求。
VR_INSTANT_OK
接受请求。
VR_PENDING
将请求添加到队列,以便稍后接受或拒绝请求。

返回值

C++

如果该方法成功,该方法将返回S_OK。

如果方法失败,它将返回指示错误的 HRESULT 值。 有关常见错误代码的列表,请参阅 常见 HRESULT 值

VB

返回值指定处置,该处置必须是以下值之一。
返回代码 说明
VR_INSTANT_BAD
拒绝请求。
VR_INSTANT_OK
接受请求。
VR_PENDING
将请求添加到队列,以便稍后接受或拒绝请求。

注解

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

另请参阅

ICertConfig

ICertPolicy

ICertPolicy2