【问题标题】:How do I determine if Windows Credentials are disabled如何确定是否禁用了 Windows 凭据
【发布时间】:2018-03-29 21:57:24
【问题描述】:

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

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

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

【问题讨论】:

  • 应用策略时 API 函数会发生什么情况?它们是否因特定错误而失败?
  • Cred* api 即使在禁用凭据管理器服务的情况下也能工作 - 独立于它

标签: security winapi credentials credential-manager


【解决方案1】:

windows 中存在 VaultSvc(友好名称​​Credentials Service),它们支持不同的保险库类型。存在 utilVaultCmd.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 和大多数保险库,比如 Web Credentials(将密码存储在 ie 中)只有在 VaultSvc 正在运行的情况下才能工作

Windows 凭据 (77BC582B-F0A6-4E15-4E80-61736B6F3B29) 是内置在凭据中的,即使 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 内部调用

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不知道 lsass.exe 如何跨 Windows 版本管理凭据,无论是否使用 VaultSvc (vaultsvc.dll)。但是,我可以说在 Windows 10 中禁用此服务的干净启动并不会完全禁用凭据管理器 API。远程过程调用仍由 LSA 处理。例如,我能够通过CredEnumerate 枚举用户存储的凭据,这触发了在lsass.exe 中lsasrv!CredrEnumerate 上设置的断点。此外,我还可以通过CredWrite 编写新凭据,这触发了在lsass.exe 中lsasrv!CredrWrite 上设置的断点。
    • 我知道我的答案可能不完整,我会进一步研究并更新它。我觉得这个问题很有趣……
    猜你喜欢
    • 2015-02-27
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多