6

我正在用 python 编写一个 Windows 服务,并且我正在使用密钥环模块来安全地存储我需要定期和持久使用的凭据。这意味着密钥环使用本地系统用户凭据存储密码。

我所做的只是使用 2 个基本的密钥环功能:get_password(SERVICE_NAME, username, password)set_password(SERVICE_NAME, username). 我没有按照我的理解预先配置密钥环,并且看到它会自动配置其后端。

当我在 Windows Server 2008 及更高版本上运行它时,一切正常。但是当我在 Windows Server 2003 上运行它时,我得到了这个讨厌的错误:

error: (1312, 'CredWrite', 'A specified logon session does not exist. It may already have been terminated.')

我认为它与用于运行我的服务的本地系统用户的登录会话有关,尽管它很奇怪,因为我知道它是一种超级管理员超级用户的形式,应该有权做任何事情它想在系统中。但是当我将用户的登录凭据更改为本地管理员时,一切正常。

我需要更改我的服务配置以使其正常工作吗?或者更改本地系统用户的安全策略?还是我应该要求用户使用本地管理员凭据运行此服务?

4

1 回答 1

3

Windows Server 2003 中的本地系统用户似乎有一个限制,即它无法访问 Windows 保存凭据的机制,也称为 Credentials Vault。

Windows 的密钥环默认后端是使用这个内置的 Windows Vault 机制,这就是创建它的原因,这就是从 Windows 触发这个异常的原因。

这个问题的解决方案是使用不同的密钥环后端,称为Win32CryptoKeyringlikes:

keyring.set_keyring(keyring.backend.Win32CryptoKeyring())

此后端使用 Win32 Cryptographic API 安全地保存凭据,因此在安全方面它与使用 Windows Vault 机制一样安全。不同之处仅在于凭据保存到的位置。我不确定凭据保存在哪里,但事实证明这与我的情况无关。

再次需要注意的是,此错误仅在 Windows Server 2003 下的本地系统用户使用 Windows Vault 时才会发生。在较新的 Windows 版本上,这可以正常工作,并且与 Windows Server 2003 上的其他用户一起使用也可以正常工作.

Win32CryptoKeyring如果您想在不使用多个安全机制在代码中保存凭据的情况下跨平台使用,则在较新版本的 Windows 上使用后端也可以很好地工作。

于 2012-09-12T11:48:22.457 回答