共用方式為


CertOpenStore 函式 (wincrypt.h)

CertOpenStore 函式透過指定的儲存提供者類型開啟憑證儲存。 雖然此功能可用於大多數用途的憑證儲存,但建議 使用 CertOpenSystemStore 來開啟最常見的憑證儲存庫。 CertOpenStore 是較複雜選項和特殊情況的必備條件。

語法

HCERTSTORE CertOpenStore(
  [in] LPCSTR            lpszStoreProvider,
  [in] DWORD             dwEncodingType,
  [in] HCRYPTPROV_LEGACY hCryptProv,
  [in] DWORD             dwFlags,
  [in] const void        *pvPara
);

參數

[in] lpszStoreProvider

包含存放區提供者類型的 Null 終止 ANSI 字串指標。

下列值代表預先定義的存放區類型。 儲存提供者類型決定 pvPara 參數的內容,以及 dwFlags 參數高字的使用與意義。 可透過使用 CryptInstallOIDFunctionAddressCryptRegisterOIDFunction 函式安裝或註冊額外的儲存服務提供者。 欲了解更多關於新增儲存服務提供者的資訊,請參閱 擴展認證OpenStore功能

價值 意義
CERT_STORE_PROV_COLLECTION
sz_CERT_STORE_PROV_COLLECTION
開啟將成為其他商店集合的存放區。 透過 CertAddStoreToCollectionCertRemoveStoreFromCollection 來新增或移除儲存庫。 將存放區新增至集合時,該存放區中的所有憑證、CRL 和 CCL 都可供搜尋或列舉集合存放區。

dwFlags 的高字數設為零。

pvPara 值:pvPara 參數必須為 NULL。

CERT_STORE_PROV_FILE
使用從指定的開啟檔案讀取的憑證、CRL 和 CCL,初始化存放區。 此提供者預期檔案只包含串行化存放區,而不是 PKCS #7 簽署的訊息或單一編碼憑證。

檔案指標必須位於串行化存放區資訊的開頭。 將串行化存放區中的數據載入證書存儲之後,檔案指標會放在任何可追蹤檔案中串行化存放區數據的數據開頭。 若 CERT_FILE_STORE_COMMIT_ENABLE 在 dwFlags 中設定,檔案 handle 會重複,且儲存始終以序列化儲存方式提交。 當存放區關閉時,檔案不會關閉。

pvPara 值:pvPara 參數必須包含指向使用 CreateFile 開啟檔案的 handle 的指標。

CERT_STORE_PROV_FILENAME_A
使用檔案中的憑證、CRL 和 CCL,初始化存放區。 提供者會開啟檔案,並先嘗試將檔案讀取為串行化存放區,然後以 PKCS #7 簽署的訊息,最後以單一編碼憑證的形式讀取檔案。

dwEncodingType 參數必須包含同時用於訊息與憑證的編碼類型。 若檔案包含 X.509 編碼憑證,開啟操作失敗,呼叫 GetLastError 函式將返回 ERROR_ACCESS_DENIED。 若 CERT_FILE_STORE_COMMIT_ENABLE 標誌設於 dwFlags,則傳入 CreateFiledwCreationDisposition 值如下:

  • 如果設定了 CERT_STORE_CREATE_NEW_FLAG 標誌, CreateFile 會使用 CREATE_NEW
  • 如果設定了 CERT_STORE_OPEN_EXISTING_FLAG 標誌, CreateFile 會使用 OPEN_EXISTING
  • 對於所有其他 dwFlags 設定, CreateFile 使用 OPEN_ALWAYS

dwFlags 包含 CERT_FILE_STORE_COMMIT_ENABLE,該檔案會根據所開啟的檔案類型,被提交為 PKCS #7 或序列化儲存。 如果檔案是空的,或檔名具有 .p7c 或 .spc 擴展名,則會將檔案認可為 PKCS #7。 否則,檔案會認可為串行化存放區。

pvPara 值:pvPara 參數必須包含指向 null-terminaled ANSI 字串的指標,該字串包含一個存在且未開啟的檔案名稱。

CERT_STORE_PROV_FILENAME(_W)
sz_CERT_STORE_PROV_FILENAME(_W)
CERT_STORE_PROV_FILENAME_A一樣。

pvPara 值:pvPara 參數必須包含指向 null-終止 Unicode 字串的指標,該字串包含一個已存在且未開啟的檔案名稱。

CERT_STORE_PROV_LDAP(_W)
sz_CERT_STORE_PROV_LDAP(_W)
使用LDAP查詢結果中的憑證、CRL和 CTL,初始化存放區。

若要在存放區上執行寫入作業,查詢字串必須指定沒有篩選條件和單一屬性的BASE查詢。

pvPara 值: dwFlags 參數包含 CERT_LDAP_STORE_OPENED_FLAG,則將 pvPara 設為指定已建立 LDAP 會話的 CERT_LDAP_STORE_OPENED_PARA 結構位址。

否則,將 pvPara 設定為指向包含 LDAP 查詢字串的 null 終止 Unicode 字串。 欲了解更多關於 LDAP 查詢字串的資訊,請參閱 LDAP 方言

CERT_STORE_PROV_MEMORY
sz_CERT_STORE_PROV_MEMORY
在快取的記憶體中建立證書存儲。 最初不會載入任何憑證、 憑證撤銷清單 (CRL)或 憑證信任清單 (CTL)。 通常用來建立暫存存放區。

不會自動儲存記憶體存放區中憑證、CRL 或 CCL 的任何新增憑證、CRL 或 CCL 或屬性變更。 它們可以透過 CertSaveStore 儲存到檔案或記憶體 BLOB

pvPara 值: 不使用 pvPara 參數。

CERT_STORE_PROV_MSG
使用來自指定密碼編譯訊息的憑證、CRL 和 CTL,初始化存放區。 dwEncodingType 參數必須包含訊息與憑證所用的編碼類型。

pvPara 值:pvPara 參數包含編碼訊息的 HCRYPTMSG 句柄,透過呼叫 CryptMsgOpenToDecode 回傳。

CERT_STORE_PROV_PHYSICAL(_W)
sz_CERT_STORE_PROV_PHYSICAL(_W)
使用屬於邏輯系統存放區成員之指定實體存放區的憑證、CRL 和 CCL,初始化存放區。

兩個名稱會以反斜杠分隔,例如 “Root.Default”。 在這裡,“Root” 是系統存放區和 “的名稱。預設值“ 是實體存放區的名稱。 系統和實體存放區名稱不能包含任何反斜杠。 dwFlags 的高字表示系統儲存位置,通常CERT_SYSTEM_STORE_CURRENT_USER。 欲了解更多資訊,請參閱本主題後面的 dwFlags系統商店位置。 某些實體存放區位置可以從遠端開啟。

pvPara 值:pvPara 參數指向一個包含系統儲存名稱與實體名稱的 null 終止 Unicode 字串。

CERT_STORE_PROV_PKCS7
sz_CERT_STORE_PROV_PKCS7
使用來自編碼 PKCS #7 簽署訊息的憑證、CRL 和 CTL,初始化存放區。 dwEncodingType 參數必須指定訊息與憑證共用的編碼類型。

pvPara 值:pvPara 參數指向一個CRYPT_DATA_BLOB結構,代表編碼訊息。

CERT_STORE_PROV_PKCS12
sz_CERT_STORE_PROV_PKCS12
PKCS #12 封包的內容初始化儲存。

如果 PKCS #12 封包受到 NULL 或空白密碼的保護,此函式將會成功開啟存放區。

從 Windows 8 和 Windows Server 2012 開始,如果內嵌在 PFX 封包中的密碼受到 Active Directory (AD) 主體的保護,而目前使用者作為該主體的成員,有權解密密碼,此函式就會成功開啟存放區。 更多資訊請參閱 pvPara 參數及 PFXExportCertStoreEx 函式的 PKCS12_PROTECT_TO_DOMAIN_SIDS 標誌。

您可以從 Windows 8 和 Windows Server 2012 開始,將 PFX 密碼保護至 AD 主體。

pvPara 值:pvPara 參數指向一個代表 PKCS #12 封包的 CRYPT_DATA_BLOB 結構。

CERT_STORE_PROV_REG
使用登錄子機碼中的憑證、CRL 和 CTL,初始化存放區。

此提供者會在 pvPara 傳遞的金鑰下開啟或建立登錄子鍵憑證CRLCTL。 提供者不會關閉輸入索引鍵。 在返回之前,提供者會打開自己在 pvPara 中傳遞的金鑰副本。 若CERT_STORE_READONLY_FLAG設於 dwFlags 的低字,則使用 RegOpenKey 與 KEY_READ_ACCESS 開啟登錄檔子鍵。 否則,登錄檔子鍵則是透過使用 RegCreateKey 與 KEY_ALL_ACCESS 來建立。 開啟存放區內容的任何變更都會立即保存至登錄。 然而,如果 CERT_STORE_READONLY_FLAG 設在 dwFlags 的低字中,任何嘗試新增儲存內容或更改上下文屬性時,都會導致 GetLastError 回傳 E_ACCESSDENIED 程式碼的錯誤。

pvPara 值:pvPara 參數包含一個開啟登錄檔鍵的字柄。

CERT_STORE_PROV_SERIALIZED
sz_CERT_STORE_PROV_SERIALIZED
從包含串行化存放區的記憶體位置,使用憑證、CRL 和 CCL 初始化存放區。

pvPara 值:pvPara 參數指向包含序列化記憶體 BLOB 的 CRYPT_DATA_BLOB結構。

CERT_STORE_PROV_SMART_CARD(_W)
sz_CERT_STORE_PROV_SMART_CARD(_W)
目前未使用。
CERT_STORE_PROV_SYSTEM_A
使用來自指定系統存放區的憑證、CRL 和 CCL,初始化存放區。

系統存放區是邏輯集合存放區,由一或多個實體存放區組成。 與系統儲存相關聯的實體儲存會以 CertRegisterPhysicalStore 函式註冊。 系統儲存開啟後,所有與其相關的實體儲存也會透過呼叫 CertOpenStore 開啟,並透過 CertAddStoreToCollection 函式加入系統儲存集合。 dwFlags 的高字表示系統儲存位置,通常設為 CERT_SYSTEM_STORE_CURRENT_USER。 關於登錄檔位置的詳細資訊,請參見本主題後面的 dwFlags系統儲存位置。 某些系統存放區位置可以從遠端開啟;如需詳細資訊,請參閱系統存放區位置。

pvPara 值:pvPara 參數指向一個包含系統儲存名稱(如「My」或「Root」)的 null 終止 ANSI 字串。

CERT_STORE_PROV_SYSTEM(_W)
sz_CERT_STORE_PROV_SYSTEM(_W)
CERT_STORE_PROV_SYSTEM_A一樣。

pvPara 值:pvPara 參數指向一個包含系統儲存名稱(如「My」或「Root」)的 null 終止 Unicode 字串。

CERT_STORE_PROV_SYSTEM_REGISTRY_A
使用實體登錄存放區中的憑證、CRL 和 CTL,初始化存放區。 實體存放區不會以集合存放區的形式開啟。 列舉和搜尋只會經歷該實體存放區中的憑證、CRL 和 CCL。

dwFlags 的高字表示系統儲存位置,通常設為 CERT_SYSTEM_STORE_CURRENT_USER。 欲了解更多資訊,請參閱本主題後面的 dwFlags 。 部分系統儲存地點可遠端開放;更多資訊請參閱 系統商店地點

pvPara 值:pvPara 參數指向一個包含系統儲存名稱(如「My」或「Root」)的 null 終止 ANSI 字串。

CERT_STORE_PROV_SYSTEM_REGISTRY(_W)
sz_CERT_STORE_PROV_SYSTEM_REGISTRY(_W)
CERT_STORE_PROV_SYSTEM_REGISTRY_A一樣。

pvPara 值:pvPara 參數指向一個包含系統儲存名稱(如「My」或「Root」)的 null 終止 Unicode 字串。

[in] dwEncodingType

指定 憑證編碼類型訊息編碼類型。 編碼僅在 CertSaveStore 函式的 dwSaveAs 參數包含 CERT_STORE_SAVE_AS_PKCS7 時使用。 否則, dwMsgAndCertEncodingType 參數則不被使用 dwMsgAndCertEncodingType 參數。

此參數僅適用於 lpszStoreProvider 參數中指定 CERT_STORE_PROV_MSGCERT_STORE_PROV_PKCS7CERT_STORE_PROV_FILENAME 提供者類型時。 對於所有其他提供者類型,這個參數是未使用的,而且應該設定為零。

此參數可以是下列一或多個值的組合。

價值 意義
PKCS_7_ASN_ENCODING
65536 (0x10000)
指定 PKCS #7 訊息編碼。
X509_ASN_ENCODING
1 (0x1)
指定 X.509 憑證編碼。

[in] hCryptProv

此參數未被使用,應設為 NULL。

Windows Server 2003 與 Windows XP: 一個密碼學提供者的帳號。 對此參數傳遞 NULL 會產生適當的預設提供者。 建議使用預設提供者。 預設或指定的密碼學提供者用於所有驗證主體憑證或 CRL 簽名的儲存功能。此參數的資料型態為 HCRYPTPROV

[in] dwFlags

這些值由高字與低字值組成,透過位元順序 或運算組合而成。

dwFlags 的低字部分控制了所開啟憑證儲存庫的多種一般特性。 此部分可與所有存放區提供者類型搭配使用。 dwFlags 的低字部分可以是以下其中一個值。

價值 意義
CERT_STORE_BACKUP_RESTORE_FLAG
利用執行緒的SE_BACKUP_NAME與SE_RESTORE_NAME 權限 來開啟登錄檔或基於檔案的系統儲存。 如果線程沒有這些許可權,此函式必須失敗,並出現拒絕存取錯誤。
CERT_STORE_CREATE_NEW_FLAG
如果新存放區不存在,則會建立新的存放區。 如果存放區已經存在,函式就會失敗。

CERT_STORE_OPEN_EXISTING_FLAGCERT_STORE_CREATE_NEW_FLAG 都未設定,則若存在即開啟該商店;若尚未存在則被建立並開啟。

CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG
延遲關閉存放區的提供者,直到所有從存放區取得的憑證、CRL 或 CCL 都不再使用為止。 從存放區取得的最後一個憑證、CRL 或 CTL 釋出時,實際上會關閉存放區。 即使呼叫 CertCloseStore 後,對這些憑證、CRL 和 CTL 屬性所做的任何變更仍會被持久化。

如果未設定此旗標,且從存放區取得的憑證、CRL 或 CCL 仍在使用中,則不會保存這些憑證、CRL 和 CTL 之屬性的任何變更。

若此函式被呼叫為 CERT_CLOSE_STORE_FORCE_FLAG,則忽略 CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG

當此標誌設定且傳遞非 NULL的 hCryptProv 參數值時,該提供者即使在呼叫此函式後仍會繼續使用。

CERT_STORE_DELETE_FLAG
刪除存放區,而不是開啟。 此函式對刪除成功與失敗皆回傳 NULL 。 要判斷刪除是否成功,呼叫 GetLastError,若儲存被刪除則回傳 0,若未刪除則回傳非零值。
CERT_STORE_ENUM_ARCHIVED_FLAG
通常,列舉所有憑證時會忽略任何帶有 CERT_ARCHIVED_PROP_ID 屬性的憑證。 若設定此標誌,儲存中憑證的列舉將包含所有憑證,包括具有 CERT_ARCHIVED_PROP_ID 屬性的憑證。
CERT_STORE_MAXIMUM_ALLOWED_FLAG
以允許的許可權上限集開啟存放區。 如果指定此旗標,登錄存放區會先以寫入許可權開啟,如果失敗,則會以只讀存取重新開啟。
CERT_STORE_NO_CRYPT_RELEASE_FLAG
hCryptProv 參數為 NULL 時,此旗標不會使用。 此旗標僅在非 NULL CSP 句柄作為 hCryptProv 參數傳遞時有效。 設定此旗標可防止關閉證書存儲時自動發行非預設 CSP。
CERT_STORE_OPEN_EXISTING_FLAG
只開啟現有的存放區。 如果存放區不存在,函式會失敗。
CERT_STORE_READONLY_FLAG
以唯讀模式開啟存放區。 任何變更存放區內容的嘗試都會導致錯誤。 當此旗標設定且使用基於登錄表的儲存服務提供者時,登錄子鍵會透過 RegOpenKeyKEY_READ_ACCESS 開啟。 否則,登錄檔子鍵則是透過 RegCreateKeyKEY_ALL_ACCESS 來建立。
CERT_STORE_SET_LOCALIZED_NAME_FLAG
若支援此旗標,提供者會設定商店的 CERT_STORE_LOCALIZED_NAME_PROP_ID 屬性。 可透過將 dwPropID 設為 CERT_STORE_LOCALIZED_NAME_PROP_IDCertGetStoreProperty 函式來取得本地化名稱。 此旗標支援 CERT_STORE_PROV_FILENAMECERT_STORE_PROV_SYSTEMCERT_STORE_PROV_SYSTEM_REGISTRYCERT_STORE_PROV_PHYSICAL_W 類型的供應商。
CERT_STORE_SHARE_CONTEXT_FLAG
多次開啟存放區時,您可以設定此旗標,藉由在已開啟的存放區實例上重複使用憑證、CRL 或 CTL 內容的編碼部分記憶體,以確保有效率的記憶體使用量。
CERT_STORE_UPDATE_KEYID_FLAG
CurrentUser 和 LocalMachine 中存在金鑰標識碼的清單。 這些金鑰標識碼的屬性非常類似憑證的屬性。 若 CERT_STORE_UPDATE_KEYID_FLAG 設定,對於儲存位置中每個具有 CERT_KEY_PROV_INFO_PROP_ID 屬性的金鑰識別碼,該屬性會自動從該金鑰識別碼屬性 CERT_KEY_PROV_INFO_PROP_ID 或與該金鑰識別碼相關的憑證 CERT_KEY_IDENTIFIER_PROP_ID 更新。
 

CERT_STORE_PROV_SYSTEMCERT_STORE_PROV_SYSTEM_REGISTRYCERT_STORE_PROV_PHYSICAL 提供者類型使用以下 dwFlags 的高字來指定系統儲存登錄位置:

CERT_SYSTEM_STORE_CURRENT_SERVICE

CERT_SYSTEM_STORE_CURRENT_USER

CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY

CERT_SYSTEM_STORE_LOCAL_MACHINE

CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE

CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY

CERT_SYSTEM_STORE_SERVICES

CERT_SYSTEM_STORE_USERS

預設情況下,系統儲存位置會相對於 HKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERS 預設登錄檔金鑰開啟。 欲了解更多資訊,請參閱系統商店地點。

下列高字旗標會覆寫此預設行為。

價值 意義
CERT_SYSTEM_STORE_RELOCATE_FLAG
設定時, pvPara 必須包含指向 CERT_SYSTEM_STORE_RELOCATE_PARA 結構的指標,而非字串。 結構會指出存放區的名稱及其在登錄中的位置。
CERT_SYSTEM_STORE_UNPROTECTED_FLAG
根據預設,當 CurrentUser “Root” 存放區開啟時,此函式傳回之前,不會在受保護根清單上的任何 SystemRegistry 根目錄從快取中刪除。 設定此旗標時,會覆寫此預設值,而且會傳回 SystemRegistry 中的所有根目錄,而且不會檢查受保護的根清單。
 

CERT_STORE_PROV_REGISTRY提供者使用以下高字標誌。

價值 意義
CERT_REGISTRY_STORE_REMOTE_FLAG
pvPara 包含遠端電腦登錄檔金鑰的代號。 若要存取遠端電腦上的登錄機碼,遠端電腦上的安全性許可權必須設定為允許存取。 如需詳細資訊,請參閱。
CERT_REGISTRY_STORE_SERIALIZED_FLAG
CERT_STORE_PROV_REG提供者會將憑證、CRL 和 CTL 儲存在單一序列化的儲存子金鑰中,而非執行預設的儲存操作。 默認值是,每個憑證、CRL 或 CTL 都會儲存為適當子機碼下的個別登錄子機碼。

此旗標主要用於從組策略範本 (GPT) 下載的商店,例如 CurrentUserGroupPolicy 和 LocalMachineGroupPolicy 存放區。

CERT_REGISTRY_STORE_SERIALIZED_FLAG 設定時,儲存的新增、刪除或屬性變更不會持續存在,直到使用 CERT_STORE_CTRL_COMMIT 呼叫 CertCloseStoreCertControlStore

 

CERT_STORE_PROV_FILECERT_STORE_PROV_FILENAME 提供者類型使用以下高字標誌。

價值 意義
CERT_FILE_STORE_COMMIT_ENABLE
設定此標誌會將儲存中新增的任何內容或對儲存中上下文屬性所做的變更提交到檔案儲存,無論是在呼叫 CertCloseStore 或以 CERT_STORE_CONTROL_COMMIT 呼叫 CertControlStore 時。

如果 dwFlags 同時設定了 CERT_FILE_STORE_COMMIT_ENABLECERT_STORE_READONLY_FLAG,CertOpenStore 會因 E_INVALIDARG 失敗。

 

CERT_STORE_PROV_LDAP提供者類型使用以下高字標誌。

價值 意義
CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG
pvPara 參數中指定的 URL 進行僅 A 紀錄的 DNS 查詢。 這可防止解析 URL 主機名時產生錯誤的 DNS 查詢。 在傳遞主機名稱(而非網域名稱)時, pvPara 參數請使用此旗標。
CERT_LDAP_STORE_OPENED_FLAG
使用此旗標來使用現有的LDAP會話。 當指定此標誌時, pvPara 參數即為包含 LDAP 會話資訊的 CERT_LDAP_STORE_OPENED_PARA 結構位址。
CERT_LDAP_STORE_SIGN_FLAG
若要提供某些應用程式所需的完整性,請使用 Kerberos 驗證通訊協定,以數位方式簽署 LDAP 伺服器的所有 LDAP 流量。
CERT_LDAP_STORE_UNBIND_FLAG
使用此旗標搭配 CERT_LDAP_STORE_OPENED_FLAG 標誌,當商店關閉時,LDAP 會話會被解除綁定。 系統會在儲存關閉時使用 ldap_unbind 函式解除綁定 LDAP 會話。

[in] pvPara

32 位值,可包含此函式的其他資訊。 此參數的內容取決於 lpszStoreProvider 及其他參數的值。

傳回值

如果函式成功,函式會回傳一個代號到 憑證儲存。 使用完儲存後,呼叫 CertCloseStore 函式釋放帳號。

如果函式失敗,則會傳回 NULL。 如需擴充錯誤資訊,請呼叫 GetLastError

注意CreateFileReadFile 或登錄檔錯誤可能會被傳播,並回傳其錯誤代碼。 CertOpenStore 本身只有一個錯誤碼,稱為 ERROR_FILE_NOT_FOUND 碼,表示函式無法找到 lpszStoreProvider 參數所指定的提供者。
 

言論

系統存放區是由一或多個實體同層級存放區所組成的集合。 每個系統存放區都有預先定義的實體同層級存放區。 在CERT_SYSTEM_STORE_CURRENT_USER開啟像「My」這樣的系統儲存後,會呼叫 CertOpenStore 來開啟系統儲存集合中所有實體儲存。 這些實體儲存裝置透過 CertAddStoreToCollection 函式加入系統儲存集合。 這些實體存放區中的所有憑證、CRL 和 CCL 都可透過邏輯系統存放區集合取得。

便條 憑證上下文的順序可能無法在儲存中保留。 若要存取特定憑證,您必須在存放區中反覆運算憑證。
 

您可以從遠端開啟下列系統存放區位置:

  • CERT_SYSTEM_STORE_LOCAL_MACHINE
  • CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY
  • CERT_SYSTEM_STORE_SERVICES
  • CERT_SYSTEM_STORE_USERS

系統會以遠端方式開啟系統存放區位置,方法是在傳遞至 pvPara 的字串中,加上計算機名稱的存放區名稱前置詞。 遠端系統存放區名稱的範例包括:

  • ComputerName\CA
  • \\電腦名稱\CA
  • ComputerName\ServiceName\Trust
  • \\電腦名稱\服務名稱\信任

欲了解更多系統儲存資訊,請參閱 系統儲存地點

欲了解更多自動遷移的商店資訊,請參閱 憑證商店遷移

例子

下列範例示範開啟不同存放區提供者類型的數個證書存儲。 範例中使用了 CreateMyDACL 函式,該函式在 「建立 DACL 」主題中定義,以確保開啟檔案是用正確的 DACL 建立的。 欲了解更多開啟其他商店提供者類型的範例,請參閱「 開啟憑證商店的範例 C 程式碼」。

//-------------------------------------------------------------------
// Open a system store, in this case, the My store.

HCERTSTORE hSysStore = NULL;
if(hSysStore = 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
   L"MY"                            // The store name as a Unicode 
                                    // string
   ))
{
    printf("The system store was created successfully.\n");
}
else
{
    printf("An error occurred during creation "
        "of the system store!\n");
    exit(1);
}

// Other common system stores include "Root", "Trust", and "Ca".


//-------------------------------------------------------------------
// Open a memory store. 

HCERTSTORE hMemStore = NULL;
if(hMemStore = CertOpenStore(
   CERT_STORE_PROV_MEMORY,   // The memory provider type
   0,                        // The encoding type is not needed
   NULL,                     // Use the default HCRYPTPROV
   0,                        // Accept the default dwFlags
   NULL                      // pvPara is not used
   ))
{
    printf("The memory store was created successfully.\n");
}
else
{
    printf("An error occurred during creation "
        "of the memory store!\n");
    exit(1);
}

//-------------------------------------------------------------------
// Open a read-only store from disk.

HANDLE       hFile = NULL;
HCERTSTORE   hFileStore = NULL;
LPCSTR       pszFileName = "TestStor2.sto";
SECURITY_ATTRIBUTES  sa;        // For DACL

// Create a DACL to use when opening the file.
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;  

// Call function to set the DACL. The DACL is set in the 
// SECURITY_ATTRIBUTES lpSecurityDescriptor member.
if (!CreateMyDACL(&sa))
{
     // Error encountered; generate message and exit.
     printf("Failed CreateMyDACL.\n");
        exit(1);
}

// Obtain the file handle of an existing file.
if (hFile = CreateFile(
     pszFileName,                  // The file name
     GENERIC_READ|GENERIC_WRITE,   // Access mode: Read from and
                                   // write to this file
     0,                            // Share mode
     &sa,                          // Uses the DACL created 
                                   // previously 
     OPEN_ALWAYS,                  // How to create
     FILE_ATTRIBUTE_NORMAL,        // File attributes
     NULL))                        // Template
{
    printf("The file was opened successfully.\n");
}
else
{
    printf("An error occurred during opening of the file!\n");
    exit(1);
}

//-------------------------------------------------------------------
//  This file can contain data before the store itself.
//  At this point, read and use data in the open file that precedes
//  the serialized certificate store data. 
//  To open the certificate store, the file pointer must
//  be placed at the beginning of the certificate store data.

//-------------------------------------------------------------------
//  Open the store.

if(hFileStore = CertOpenStore(
    CERT_STORE_PROV_FILE,     // Load certificates from a file
    0,                        // Encoding type not used
    NULL,                     // Use the default HCRYPTPROV
    CERT_STORE_READONLY_FLAG, // Read-only store
    hFile                     // The handle for the open file 
                              // that is the source of the 
                              // certificates
    ))
{
    printf("The file store was created successfully.\n");
}
else
{
    printf("An error occurred during creation of the file store!\n");
    exit(1);
}

//-------------------------------------------------------------------
// After processing, close the certificate stores and the file.

if(CertCloseStore(
        hSysStore, 
        CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The system store was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the "
        "system store.\n");
}

if(CertCloseStore(
        hMemStore, 
        CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The memory store was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the "
        "memory store.\n");
}

if(CertCloseStore(
        hFileStore, 
        CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The file store was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the file store.\n");
}

if(CloseHandle(hFile))
{
    printf("The file was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the file.\n");
}

要求

要求 價值
最低支援的用戶端 Windows XP [傳統型應用程式 |UWP 應用程式]
支援的最低伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平臺 窗戶
Header wincrypt.h
Library Crypt32.lib
DLL Crypt32.dll

另請參閱

CERT_SYSTEM_STORE_RELOCATE_PARA

CertCloseStore

CertSaveStore

憑證儲存功能