Share via


Méthode ICertPolicy ::VerifyRequest (certpol.h)

La méthode VerifyRequest informe le module de stratégie qu’une nouvelle demande est entrée dans le système. Le module de stratégie peut ensuite interagir avec cette demande en transmettant Context en tant que paramètre lors de la récupération ou de la définition des propriétés sur la demande ou le certificat associé.

La valeur de disposition retournée indique si la demande a été acceptée, refusée ou a été envoyée à la file d’attente d’administration pour une évaluation ultérieure.

Syntaxe

HRESULT VerifyRequest(
  [in]          const BSTR strConfig,
  [in]          LONG       Context,
  [in]          LONG       bNewRequest,
  [in]          LONG       Flags,
  [out, retval] LONG       *pDisposition
);

Paramètres

[in] strConfig

Représente le nom de l’autorité de certification, tel qu’entré lors de l’installation des services de certificats. Pour plus d’informations sur le nom de la chaîne de configuration, consultez ICertConfig.

[in] Context

Identifie la demande et le certificat associé en cours de construction. Le serveur de certificats transmet le contexte à cette méthode.

[in] bNewRequest

Si la valeur est TRUE, spécifie que la demande est nouvelle. Si la valeur est FALSE, la requête est renvoyée au module de stratégie à la suite d’un appel ICertAdmin ::ResubmitRequest . La valeur FALSE peut être utilisée pour indiquer que l’administrateur souhaite que la demande soit émise ou que les propriétés de la demande définies par l’administrateur doivent être examinées.

Notez que TRUE est défini (dans un fichier d’en-tête Microsoft) pour les programmeurs C/C++ comme un, tandis que Visual Basic définit la valeur True mot clé comme étant négative. Par conséquent, les développeurs Visual Basic doivent en utiliser un (au lieu de True) pour définir ce paramètre sur TRUE. Toutefois, pour définir ce paramètre sur FALSE, les développeurs Visual Basic peuvent utiliser zéro ou False.

[in] Flags

Ce paramètre est réservé et doit être défini sur zéro.

[out, retval] pDisposition

Pointeur vers la valeur de disposition. La méthode définit l’une des dispositions suivantes.

Valeur Signification
VR_INSTANT_BAD
Refusez la demande.
VR_INSTANT_OK
Acceptez la demande.
VR_PENDING
Ajoutez la demande à la file d’attente pour accepter ou refuser la demande ultérieurement.

Valeur retournée

C++

Si la méthode réussit, la méthode retourne S_OK.

Si la méthode échoue, elle retourne une valeur HRESULT qui indique l’erreur. Pour obtenir la liste des codes d’erreur courants, consultez Valeurs HRESULT courantes.

VB

La valeur de retour spécifie la disposition, qui doit être l’une des valeurs suivantes.
Code de retour Description
VR_INSTANT_BAD
Refusez la demande.
VR_INSTANT_OK
Acceptez la demande.
VR_PENDING
Ajoutez la demande à la file d’attente pour accepter ou refuser la demande ultérieurement.

Remarques

VerifyRequest est libre de générer d’autres processus ou d’accéder à une base de données externe pour effectuer la vérification de la demande. Si la vérification nécessite un traitement hors bande ou une intervention humaine, VerifyRequest peut notifier un autre processus ou laisser un avis de la demande entrante requise. Une fois le traitement hors bande terminé, un appel à ResubmitRequest peut être effectué ou l’outil d’administration fourni peut être utilisé pour soumettre à nouveau la demande au module de stratégie. Le module de stratégie peut examiner à nouveau la demande, accéder à toutes les données externes nécessaires et retourner une valeur indiquant que le certificat doit être émis ou refusé.

Lorsque vous écrivez des modules de stratégie personnalisés, vous devez implémenter la fonctionnalité VerifyRequest dans vos modules.

Exemples

L’exemple suivant montre une implémentation possible de la méthode 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);
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Aucun pris en charge
Serveur minimal pris en charge Windows Server 2003 [applications de bureau uniquement]
Plateforme cible Windows
En-tête certpol.h (inclure Certsrv.h)
Bibliothèque Certidl.lib

Voir aussi

ICertConfig

ICertPolicy

ICertPolicy2