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

Avi*_*ion 5 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.')

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

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

Avi*_*ion 3

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

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

此问题的解决方案是使用不同的密钥环后端,称为Win32CryptoKeyringlikes,如下所示:

keyring.set_keyring(keyring.backend.Win32CryptoKeyring())
Run Code Online (Sandbox Code Playgroud)

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

再次需要注意的是,此错误仅在 Windows Server 2003 下的本地系统用户使用 Windows Vault 的组合中才会发生。在较新的 Windows 版本上,此功能完全正常,并且与 Windows Server 2003 上的其他用户一起使用也完全正常。

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