在Windows Server 2003上使用python密钥环时出现错误1312

时间:2012-08-29 08:43:35

标签: python windows-services python-keyring

我在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.')

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

我的服务配置是否需要更改才能实现此功能?或者更改本地系统用户的安全策略?或者我应该要求用户使用本地管理员凭据运行此服务吗?

1 个答案:

答案 0 :(得分:3)

Windows Server 2003中的本地系统用户似乎无法访问保存凭据的Windows机制,也称为凭据保险库。

密钥环的Windows默认后端是使用这种内置的Windows Vault机制,而这就是从Windows中触发此异常的原因。

此问题的解决方案是使用名为Win32CryptoKeyring的不同密钥环后端,如此:

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

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

重要的是要再次注意,只有在Windows Server 2003下使用本地系统用户的Windows Vault组合才会出现此错误。在较新的Windows版本上,这可以很好地与Windows Server 2003上的其他用户一起使用完美无缺。

如果您希望成为跨平台而不使用多种安全机制来保存代码中的凭据,那么在较新版本的Windows上使用Win32CryptoKeyring后端也可以完美地运行。