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

我所要做的就是使用2个基本的 key 环函数:get_password(SERVICE_NAME, username, password)set_password(SERVICE_NAME, username)。据我所知,我并没有预先配置 key 环,而是看到它会自动配置其后端。

当我在Windows Server 2008或更高版本上运行此程序时,一切运行正常。但是,当我在Windows Server 2003上运行此命令时,出现此讨厌的错误:
error: (1312, 'CredWrite', 'A specified logon session does not exist. It may already have been terminated.')
我认为这与用于运行我的服务的本地系统用户的登录 session 有关,尽管这很特殊,因为我知道这是一种 super 管理员 super 用户的形式,应该具有执行任何操作的权限它想要在系统中。但是,当我将用户的登录凭据更改为本地管理员时,一切都会顺利进行。

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

最佳答案

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

Windows的keyring的默认后端是使用此内置的Windows Vault机制,这是由Windows触发此异常的原因。

解决此问题的方法是使用另一个名为Win32CryptoKeyring的 key 环后端,如下所示:

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

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

再次需要注意的是,此错误仅与在Windows Server 2003下使用“本地系统”用户的Windows Vault结合使用时发生。在较新的Windows版本上,此方法运行正常,而在Windows Server 2003上的其他用户中,也运行正常。

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

关于python - 在Windows Server 2003上使用python key 环时出现错误1312,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12173969/

10-10 01:03
查看更多