我正在使用 Windows Credential Manager API 中的CredRead()
andCredWrite()
函数来存储和检索用户密码,如StackOverflow answer中所述。
但是,我读过可以通过设置组策略或简单地通过停止/禁用凭据管理器服务来禁用凭据管理器。在这种情况下,我想更新我的应用程序的 UI 以反映凭据存储当前不可用。
是否有可靠的方法来以可编程方式确定凭据管理器是否已被禁用?
我正在使用 Windows Credential Manager API 中的CredRead()
andCredWrite()
函数来存储和检索用户密码,如StackOverflow answer中所述。
但是,我读过可以通过设置组策略或简单地通过停止/禁用凭据管理器服务来禁用凭据管理器。在这种情况下,我想更新我的应用程序的 UI 以反映凭据存储当前不可用。
是否有可靠的方法来以可编程方式确定凭据管理器是否已被禁用?
在 Windows 中存在支持不同保险库类型的VaultSvc(友好名称Credentials Service )。存在实用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\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
Vault: Windows Credentials
Vault Guid:77BC582B-F0A6-4E15-4E80-61736B6F3B29
Location: C:\Users\*\AppData\Local\Microsoft\Vault
当然vaultcmd和大多数 vaults,比如Web Credentials(在 ie 中存储密码)只有在VaultSvc正在运行的情况下才有效
但是Windows Credentials ( 77BC582B-F0A6-4E15-4E80-61736B6F3B29 ) 是内置在凭据中的,即使 VaultSvc没有运行(禁用),它也始终在运行(在 lsass 中)。, CredRead
,CredWrite
和CredEnumerate
其他Cred*
api 将始终有效。它不能被禁用
存在未记录的 api Vault*
api 在vaultcli.dll
. 所有这些 api 都以 form 命名Vault*
。当我们调用它并且VaultSvc正在运行时 -vaultsvc.dll
加载到 lsass 并处理远程调用:
vaultcli!VaultSomeApi -> rpc - > vaultsvc!VltSomeApi
例如,当我们调用VaultEnumerateItems
客户端时,VltEnumerateItems
调用 lsass (vaultsvc.dll)。内部调用的内容VltEnumerateItems
取决于它调用的具体保险库。对于Windows Credentials vault -CredEnumerateW
在内部调用VltEnumerateItems