Metodo ICertPolicy::VerifyRequest (certpol.h)

Il metodo VerifyRequest notifica al modulo criteri che una nuova richiesta è stata immessa nel sistema. Il modulo criteri può quindi interagire con tale richiesta passando Contesto come parametro durante il recupero o l'impostazione delle proprietà sulla richiesta o sul certificato associato.

Il valore di eliminazione restituito indica se la richiesta è stata accettata, negata o inviata alla coda di amministrazione per la valutazione successiva.

Sintassi

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

Parametri

[in] strConfig

Rappresenta il nome dell'autorità di certificazione, come immesso durante la configurazione di Servizi certificati. Per informazioni sul nome della stringa di configurazione, vedere ICertConfig.

[in] Context

Identifica la richiesta e il certificato associato in fase di costruzione. Il server certificati passa il contesto a questo metodo.

[in] bNewRequest

Se impostato su TRUE, specifica che la richiesta è nuova. Se impostato su FALSE, la richiesta viene restituita al modulo dei criteri come risultato di una chiamata ICertAdmin::ResubmitRequest . Un valore false può essere usato per indicare che l'amministratore vuole che la richiesta venga emessa o che le proprietà della richiesta impostate dall'amministratore debbano essere esaminate.

Si noti che TRUE è definito (in un file di intestazione Microsoft) per i programmatori C/C++ come uno, mentre Visual Basic definisce la parola chiave True come una negativa. Di conseguenza, gli sviluppatori di Visual Basic devono usare uno (anziché True) per impostare questo parametro su TRUE. Tuttavia, per impostare questo parametro su FALSE, gli sviluppatori di Visual Basic possono usare zero o False.

[in] Flags

Questo parametro è riservato e deve essere impostato su zero.

[out, retval] pDisposition

Puntatore al valore di eliminazione. Il metodo imposta una delle disposizioni seguenti.

Valore Significato
VR_INSTANT_BAD
Negare la richiesta.
VR_INSTANT_OK
Accettare la richiesta.
VR_PENDING
Aggiungere la richiesta alla coda per accettare o negare la richiesta in un secondo momento.

Valore restituito

C++

Se il metodo ha esito positivo, il metodo restituisce S_OK.

Se il metodo ha esito negativo, restituisce un valore HRESULT che indica l'errore. Per un elenco di codici di errore comuni, vedere Valori HRESULT comuni.

VB

Il valore restituito specifica l'eliminazione, che deve essere uno dei valori seguenti.
Codice restituito Descrizione
VR_INSTANT_BAD
Negare la richiesta.
VR_INSTANT_OK
Accettare la richiesta.
VR_PENDING
Aggiungere la richiesta alla coda per accettare o negare la richiesta in un secondo momento.

Commenti

VerifyRequest è gratuito per generare altri processi o accedere a un database esterno per eseguire la verifica della richiesta. Se la verifica richiede l'elaborazione fuori banda o l'intervento umano, VerifyRequest può notificare un altro processo o lasciare qualsiasi avviso della richiesta in ingresso richiesta. Al termine dell'elaborazione out-of-band, è possibile effettuare una chiamata a ResubmitRequest oppure usare lo strumento di amministrazione fornito per inviare nuovamente la richiesta al modulo criteri. Il modulo criteri può esaminare di nuovo la richiesta, accedere a tutti i dati esterni necessari e restituire un valore per indicare che il certificato deve essere rilasciato o negato.

Quando si scrivono moduli di criteri personalizzati, è necessario implementare la funzionalità VerifyRequest nei moduli.

Esempio

Nell'esempio seguente viene illustrata una possibile implementazione del metodo 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);
}

Requisiti

Requisito Valore
Client minimo supportato Nessuno supportato
Server minimo supportato Windows Server 2003 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione certpol.h (includere Certsrv.h)
Libreria Certidl.lib

Vedi anche

ICertConfig

ICertPolicy

ICertPolicy2