如何确定 Windows 凭据是否被禁用

How do I determine if Windows Credentials are disabled

我正在使用 Windows 凭据管理器 API 中的 CredRead()CredWrite() 函数来存储和检索用户密码,如 this Whosebug answer 中所述.

但是,我了解到可以通过设置组策略或仅通过 stopping/disabling 凭据管理器服务来禁用凭据管理器。在这种情况下,我想更新我的应用程序的 UI 以反映凭据存储当前不可用。

是否有可靠的方法以可编程方式确定凭据管理器是否已被禁用?

凭据服务的名称是 VaultSvc。 您可以在 this 答案中找到如何查询任何服务的状态,只需在将 "ValutSvc" 字符串传递给函数时使用代码即可。

在 windows 中存在支持不同保管库类型的 VaultSvc(友好名称 Credentials Service)。存在 util VaultCmd.exe 我们可以用它来枚举不同的凭证模式和加载的保险库。例如:

vaultcmd /listschema
Global Schemas

Credential schema: Windows Secure Note
Schema guid: 2F1A6504-0641-44CF-8BB5-3612D865F2E5

Credential schema: Windows Web Password Credential
Schema guid: 3CCD5499-87A8-4B10-A215-608888DD3B55

Credential schema: Windows Credential Picker Protector
Schema guid: 154E23D0-C644-4E6F-8CE6-5069272F999F

Currently loaded credentials schemas:

Vault: Web Credentials
Vault Guid:4BF4C442-9B8A-41A0-B380-DD4A704DDB28

Credential schema: Windows Web Password Credential
Schema guid: 3CCD5499-87A8-4B10-A215-608888DD3B55

Vault: Windows Credentials
Vault Guid:77BC582B-F0A6-4E15-4E80-61736B6F3B29

Credential schema: Windows Domain Certificate Credential
Schema guid: E69D7838-91B5-4FC9-89D5-230D4D4CC2BC

Credential schema: Windows Domain Password Credential
Schema guid: 3E0E35BE-1B77-43E7-B873-AED901B6275B

Credential schema: Windows Extended Credential
Schema guid: 3C886FF3-2669-4AA2-A8FB-3F6759A77548

vaultcmd /list
Currently loaded vaults:
        Vault: Web Credentials
        Vault Guid:4BF4C442-9B8A-41A0-B380-DD4A704DDB28
        Location: C:\Users\*\AppData\Local\Microsoft\VaultBF4C442-9B8A-41A0-B380-DD4A704DDB28

        Vault: Windows Credentials
        Vault Guid:77BC582B-F0A6-4E15-4E80-61736B6F3B29
        Location: C:\Users\*\AppData\Local\Microsoft\Vault

当然 vaultcmd 和大多数保险库,比如 Web 凭据(在 ie 中存储密码)只有在 VaultSvc 是 运行

但是Windows Credentials (77BC582B-F0A6-4E15-4E80-61736B6F3B29) 是内置的凭证,它是始终 运行(在 lsass 内),即使 VaultSvc 不是 运行(已禁用)。 CredReadCredWriteCredEnumerate 和其他 Cred* api 将始终有效。它不能被禁用


存在未记录的 api Vault* api 在 vaultcli.dll 中实施。所有这些 api 都以 Vault* 的形式命名。当我们调用它时,如果 VaultSvc 是 运行 - vaultsvc.dll 加载到 lsass 中并处理远程调用:

vaultcli!VaultSomeApi -> rpc - > vaultsvc!VltSomeApi

例如,当我们在客户端调用VaultEnumerateItems时,VltEnumerateItems在lsass(vaultsvc.dll)中调用。 VltEnumerateItems 内部调用的内容取决于它调用的混凝土拱顶。对于 Windows 凭据 保险库 - CredEnumerateWVltEnumerateItems

中调用