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
指向处置值的指针。 方法设置以下处置之一。
值 | 含义 |
---|---|
|
拒绝请求。 |
|
接受请求。 |
|
将请求添加到队列,以便稍后接受或拒绝请求。 |
返回值
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 |