Función CertAddStoreToCollection (wincrypt.h)

La función CertAddStoreToCollection agrega un almacén de certificados del mismo nivel a un almacén de certificados de colección. Cuando se ha agregado un almacén de certificados a un almacén de recopilación, todos los certificados, listas de revocación de certificados (CRL) y listas de confianza de certificados (CTL) en el almacén que se ha agregado al almacén de recopilación se pueden recuperar mediante llamadas de función find o enumerate que usan el almacén de recopilación.

Sintaxis

BOOL CertAddStoreToCollection(
  [in]           HCERTSTORE hCollectionStore,
  [in, optional] HCERTSTORE hSiblingStore,
  [in]           DWORD      dwUpdateFlags,
  [in]           DWORD      dwPriority
);

Parámetros

[in] hCollectionStore

Identificador de un almacén de certificados.

[in, optional] hSiblingStore

Identificador de un almacén relacionado que se va a agregar al almacén de recopilación. Para obtener más información, vea la sección Comentarios.

[in] dwUpdateFlags

Indica si se pueden agregar certificados, CRL y CTL al nuevo miembro del almacén relacionado del almacén de recopilación. Para habilitar la adición, establezca dwUpdateFlag en CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG. Para deshabilitar las adiciones, establezca dwUpdateFlag en cero.

[in] dwPriority

Establece un nivel de prioridad del nuevo almacén de la colección, con cero siendo la prioridad más baja. Si se pasa cero para este parámetro, el almacén especificado se anexa como último almacén de la colección. Los niveles de prioridad de los almacenes de una colección determinan el orden en que se enumeran los almacenes y el orden de búsqueda de los almacenes al intentar recuperar un certificado, CRL o CTL. Los niveles de prioridad también determinan a qué almacén de una colección se agrega un nuevo certificado, CRL o CTL. Para obtener más información, vea la sección Comentarios.

Valor devuelto

Si la función se ejecuta correctamente, la función devuelve un valor distinto de cero y se agrega un nuevo almacén a la colección de almacenes.

Si se produce un error en la función, devuelve cero y el almacén no se agregó.

Comentarios

Un almacén de recopilación tiene el mismo identificador HCERTSTORE que un único almacén; por lo tanto, casi todas las funciones que se aplican a cualquier almacén de certificados también se aplican a cualquier almacén de recopilación. Los procesos de enumeración y búsqueda abarcan todos los almacenes de un almacén de recopilación; sin embargo, las funciones como CertAddCertificateLinkToStore que agregan vínculos a almacenes no se pueden usar con almacenes de recopilación.

Cuando se agrega un certificado, CRL o CTL a un almacén de recopilación, se busca en la lista de almacenes del mismo nivel de la colección en prioridad para encontrar el primer almacén que permite agregar. Agregar está habilitado si CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG se estableció en la llamada CertAddStoreToCollection . Con cualquier función que agrega elementos a un almacén, si un almacén que permite agregar no devuelve éxito, la función de adición continúa en el siguiente almacén sin proporcionar notificación.

Cuando un almacén de recopilación y sus almacenes del mismo nivel se cierran con CertCloseStore mediante CERT_CLOSE_STORE_FORCE_FLAG, el almacén de recopilación debe cerrarse antes de sus almacenes del mismo nivel. Si no se usa CERT_CLOSE_STORE_FORCE_FLAG, las tiendas se pueden cerrar en cualquier orden.

Ejemplos

En el ejemplo siguiente se muestra cómo agregar un almacén de certificados del mismo nivel a un almacén de certificados de recopilación. Para obtener un ejemplo completo, incluido el contexto completo de este ejemplo, vea Ejemplo de programa C: Operaciones de almacén de certificados del mismo nivel y recopilación.

//-------------------------------------------------------------------
// Declare and initialize variables.

HCERTSTORE  hCollectionStore = NULL;     // The collection store 
                                         // handle
HCERTSTORE  hMemoryStore = NULL;         // A memory store handle
LPCSTR pszFileName = "TestStor.sto";     // Output file name
LPWSTR pswzFirstCert = L"Full Test Cert";// Subject of the first
                                         // certificate
LPWSTR pswzSecondCert = L"Microsoft";    // Subject of the second 
                                         // certificate
//-------------------------------------------------------------------
// Open a collection certificate store.

if(hCollectionStore = CertOpenStore(
    CERT_STORE_PROV_COLLECTION, // A collection store
    0,                          // Encoding type; not used with a
                                // collection store
    NULL,                       // Use the default provider
    0,                          // No flags
    NULL))                      // Not needed

{
    printf("The collection store was opened. \n");
}
else
{
    printf( "There was an error while opening the "
        "collection store! \n");
    exit(1);
}
//-------------------------------------------------------------------
// Open a new certificate store in memory.

if(hMemoryStore = CertOpenStore(
    CERT_STORE_PROV_MEMORY,    // A memory store
    0,                         // Encoding type; not used with a
                               // memory store
    NULL,                      // Use the default provider
    0,                         // No flags
    NULL))                     // Not needed
{
    printf("The memory store was opened. \n");
}
else
{
    printf( "There was an error while opening the memory store! \n");
    exit(1);
}
//-------------------------------------------------------------------
// Add the memory store as a sibling to the collection store. 
// All certificates in the memory store and any new certificate
// added to the memory store will also be available in the 
// collection
// store.

if(CertAddStoreToCollection(
    hCollectionStore,
    hMemoryStore,
    CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG,  // New certificates can be
                                          // added to the sibling
                                          // store.
    1))                                   // The sibling store's 
                                          // priority.
                                          // Because this is the 
                                          // store with the highest
                                          // priority, certificates
                                          // added to the collection
                                          // store will actually be
                                          // stored in this store.
{
    printf("The memory store was added to the collection store.\n");
}
else
{
    printf("The memory store was not added to the "
        "collection store.\n");
    exit(1);
}


//-------------------------------------------------------------------
// The store handles must be closed.

if(CertCloseStore(hCollectionStore,
                  0))
{
    printf("The collection store was closed. \n");
}
else
{
    printf("There was an error while closing the "
        "collection store! \n");
}

if(CertCloseStore(hMemoryStore, 0))
{
    printf("The memory store was closed. \n");
}
else
{
    printf("There was an error while closing the memory store! \n");
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado wincrypt.h
Library Crypt32.lib
Archivo DLL Crypt32.dll

Consulte también

CertRemoveStoreFromCollection

Funciones del almacén de certificados