範例 C 程式:註冊實體和系統憑證存放區
實體存放區可能會成為系統存放區的更多或更少永久成員。 當實體存放區是系統存放區的成員時,系統存放區上的作業,例如尋找憑證會查看所有註冊為系統存放區成員的實體存放區。 實體存放區可以使用取消註冊函式,從系統存放區的成員資格中移除。
此範例顯示下列工作和 CryptoAPI 函式:
- 使用 CertRegisterSystemStore註冊 () 新的系統存放區。
- 使用 CertOpenStore開啟新建立的系統存放區。
- 使用 CertRegisterPhysicalStore將實體存放區註冊為系統存放區的成員。
- 使用 CertUnregisterSystemStore取消註冊 (刪除) 系統存放區。
此範例也會示範建立和刪除系統存放區。
// This example uses CertRegisterSystemStore.
#pragma comment(lib, "crypt32.lib")
// Copyright (C) Microsoft. All rights reserved.
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void MyHandleError(char *s);
void main()
{
// Declare and initialize variables.
HCERTSTORE hSystemStore;
DWORD dwFlags= CERT_SYSTEM_STORE_CURRENT_USER;
LPCWSTR pvSystemName= L"NEWSTORE"; // For this setting of
// dwFlags, the store name may
// be prefixed with a user name.
CERT_PHYSICAL_STORE_INFO PhysicalStoreInfo;
BYTE fResponse = 'n';
if(CertRegisterSystemStore(
pvSystemName,
dwFlags,
NULL,
NULL))
printf("System store %S is registered. \n",pvSystemName);
else
printf("The system store did not register. \n");
// Open the NEWSTORE as a system store.
if(hSystemStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM, // the store provider type
0, // the encoding type is not needed
NULL, // use the default HCRYPTPROV
CERT_SYSTEM_STORE_CURRENT_USER,
// set the store location in a registry
// location
pvSystemName )) // the store name as a Unicode string
{
printf("The new store has been opened as a system store.\n");
}
else
{
printf("The new store was not opened as a system store.\n");
}
if(hSystemStore)
{
if(CertCloseStore(hSystemStore,0))
{
printf("The system store has been closed.\n");
}
else
{
printf("The system store could not be closed.\n");
}
}
else
{
printf("The system store did not need to be closed.\n");
}
// Initialize PhysicalStoreInfo.
PhysicalStoreInfo.cbSize=sizeof(CERT_PHYSICAL_STORE_INFO);
PhysicalStoreInfo.pszOpenStoreProvider=(LPSTR)
CERT_STORE_PROV_FILENAME;
PhysicalStoreInfo.dwFlags=CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG;
// Replace the path below with one that is appropriate for you.
PhysicalStoreInfo.OpenParameters.pbData =
(BYTE *) L"C:\\temp\\mystore";
PhysicalStoreInfo.OpenParameters.cbData =
(wcslen((LPWSTR) PhysicalStoreInfo.OpenParameters.pbData) + 1) *
sizeof(WCHAR);
PhysicalStoreInfo.dwPriority=1;
PhysicalStoreInfo.dwOpenEncodingType=MY_ENCODING_TYPE;
// Register the physical store.
if(CertRegisterPhysicalStore(
L"NEWSTORE",
dwFlags,
L"TESTOR.STO",
&PhysicalStoreInfo,
NULL
))
{
printf("Physical store is registered. \n");
}
else
{
printf("The physical store was not registered.\n");
}
// Next, unregister the store.
printf("Would you like to unregister the %S store? (y/n) "
,pvSystemName);
scanf_s("%c",&fResponse);
if(fResponse=='y')
{
if(CertUnregisterSystemStore(
pvSystemName,
dwFlags))
{
printf("System store %S has been unregistered.\n"
,pvSystemName);
}
else
{
printf("The system store was not unregistered.\n");
}
}
} // end main
// This example uses the function MyHandleError, a simple error
// handling function, to print an error message to
// the standard error (stderr) file and exit the program.
// For most applications, replace this function with one
// that does more extensive error reporting.
void MyHandleError(char *s)
{
fprintf(stderr,"An error occurred in running the program. \n");
fprintf(stderr,"%s\n",s);
fprintf(stderr, "Error number %x.\n", GetLastError());
fprintf(stderr, "Program terminating. \n");
exit(1);
} // end of MyHandleError