CertAddStoreToCollection 函数 (wincrypt.h)

CertAddStoreToCollection 函数将同级证书存储添加到集合证书存储。 将证书存储添加到集合存储后,可以使用使用集合存储的 find 或 enumerate 函数调用检索所有证书、 证书吊销 (列表 (CRL) ,以及添加到集合存储的存储区中) 的 证书信任列表

语法

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

参数

[in] hCollectionStore

证书存储的句柄。

[in, optional] hSiblingStore

要添加到集合存储的同级存储的句柄。 有关详细信息,请参阅“备注”。

[in] dwUpdateFlags

指示是否可以将 证书、CRL 和 CTL 添加到集合存储的新同级存储成员。 若要启用加法,请将 dwUpdateFlag 设置为 CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG。 若要禁用加法,请将 dwUpdateFlag 设置为零。

[in] dwPriority

设置集合中新存储的优先级,零为最低优先级。 如果为此参数传递零,则将指定的存储追加为集合中的最后一个存储。 集合中存储的优先级决定了枚举存储的顺序,以及尝试检索证书、CRL 或 CTL 时存储的搜索顺序。 优先级还确定将新证书、CRL 或 CTL 添加到集合的哪个存储区。 有关详细信息,请参阅“备注”。

返回值

如果函数成功,该函数将返回非零值,并将新存储添加到存储集合中。

如果函数失败,它将返回零,并且未添加存储。

注解

集合存储具有与单个 存储相同的 HCERTSTORE 句柄;因此,几乎所有应用于任何 证书存储 的函数也适用于任何集合存储。 枚举和搜索过程跨集合存储区中的所有存储;但是,将链接添加到存储的 CertAddCertificateLinkToStore 等函数不能与集合存储一起使用。

将证书、CRL 或 CTL 添加到集合存储时,将按优先级顺序搜索集合中的同级存储的列表,以查找允许添加的第一个存储。 如果在 CertAddStoreToCollection 调用中设置了CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG,则启用添加。 对于向存储添加元素的任何函数,如果允许添加的存储不返回成功,则加法函数将继续转到下一个存储,而不提供通知。

当集合存储及其同级存储使用 CertCloseStore 使用 CERT_CLOSE_STORE_FORCE_FLAG 关闭时,必须在其同级存储之前关闭该集合存储。 如果未使用CERT_CLOSE_STORE_FORCE_FLAG,则可以按任何顺序关闭商店。

示例

以下示例演示如何将同级证书存储添加到集合证书存储。 有关包含此示例的完整上下文的完整示例,请参阅 示例 C 程序:集合和同级证书存储操作

//-------------------------------------------------------------------
// 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");
}

要求

要求
最低受支持的客户端 Windows XP [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 wincrypt.h
Library Crypt32.lib
DLL Crypt32.dll

另请参阅

CertRemoveStoreFromCollection

证书存储函数