我正在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.')
我认为它与用于运行我的服务的本地系统用户的登录会话有关,虽然它很奇怪,因为我知道它是一种超级管理员 - 超级用户的形式,应该有权做任何事情它想要在系统中.但是,当我将用户的登录凭据更改为本地管理员时,一切都顺利进行.
我的服务配置是否需要更改才能使其正常工作?或者更改本地系统用户的安全策略?或者我应该要求用户使用本地管理员凭据运行此服务?
我的Windows 7机器上有一个Mercurial密钥环.我正在使用Python keyring库从Mercurial密钥环获取用户凭据.
我可以使用以下命令检索给定用户名的密码:
keyring.get_password('Mercurial', 'user@@etc')
Run Code Online (Sandbox Code Playgroud)
是否有类似的功能来检索用户名?
我安装了以下软件包(并非所有软件包都可以在两个平台上安装):
在 Windows 7 机器上:
Window 7
Run Code Online (Sandbox Code Playgroud)
在 RHEL7 Linux 机器上:
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)
$ cat /proc/version
Linux version 3.10.0-514.26.2.el7.x86_64 (sandman@node3res7) (gcc version 4.8.5 20150623 (SuSE 4.8.5-11) (GCC) ) #1 SMP Tue Jul 4 13:45:36 UTC 2017
Run Code Online (Sandbox Code Playgroud)
在 Windows 上,登录名和密码按预期存储在安全的旧版本中,无需任何其他密码。我认为 WinVaultKeyring 只有在正确的用户登录时才能解锁,前提是我正确理解了所有内容:
>>> from keyring import get_keyring
>>> get_keyring()
<keyring.backends.Windows.WinVaultKeyring object at 0x000000000361CAC8>
Run Code Online (Sandbox Code Playgroud)
在 Linux 上,它有点不同,当您开始存储登录名和密码时,会询问额外的密码。每次我需要访问登录+密码时,都会请求最后一个密码:Please enter …
我尝试在2个Python进程中使用SecretStorage,但是当我尝试更新我的Gtk.Window时,我在大多数时间都收到此消息:
RuntimeError:无法初始化SecretService:未收到回复.可能的原因包括:远程应用程序未发送回复,消息总线安全策略阻止回复,回复超时过期或网络连接中断.
两者都以multiprocessing.Process开始,这是有效的:
def get_data(self):
p1 = Process(target=P1().update_database)
p1.start()
p1.join()
p2 = Process(target=P2().update_database)
p2.start()
p2.join()
Run Code Online (Sandbox Code Playgroud)
问题是:这是阻止我的Gtk界面,窗口被阻止,没有其他按钮可点击.
因此,我使用了一个也是threading.Thread
def on_get_data_button_clicked(self, widget):
thread = Thread(target=self.get_data)
thread.start()
Run Code Online (Sandbox Code Playgroud)
这也有效,但我无法从主窗口看到进程是否仍在进行中.
所以我添加了一个Gtk.Spinner-Button来查看活动
def on_get_data_button_clicked(self, widget):
thread = Thread(target=self.get_data)
thread.start()
GObject.timeout_add(200, self.manage_spinner, thread)
def manage_spinner(self, thread):
if thread.is_alive():
return True
else:
self.sync_spinner.stop()
return False
Run Code Online (Sandbox Code Playgroud)
有时这是有效的,但大多数时候我收到此错误:
RuntimeError:无法初始化SecretService:未收到回复.可能的原因包括:远程应用程序未发送回复,消息总线安全策略阻止回复,回复超时过期或网络连接中断.
在下标中,SecretStorage以这种方式使用:
def get_key(self, key_name):
bus = secretstorage.dbus_init()
collection = secretstorage.get_default_collection(bus)
if collection.is_locked():
collection.unlock()
items = collection.get_all_items()
for item in items:
if item.get_label() == key_name:
return item.get_secret()
Run Code Online (Sandbox Code Playgroud)
如果在get_key()调用期间调用GObject.timeout_add,则会出现此问题.
也许它也与这个问题有关: …
在 Docker 中运行的无头 Linux 中运行命令行实用程序(在本例中为pgcli )时,我收到这两条消息:
No handlers could be found for logger "keyring.backend"
Please enter password for encrypted keyring:
Run Code Online (Sandbox Code Playgroud)
如何配置记录器和密钥环的密码,以便在运行任何依赖于密钥环的实用程序时不再烦恼?
请注意,我使用的是无头 Ubuntu,因此我需要知道如何从命令行执行此操作。
谢谢
我对编程等还不陌生。我正在尝试使用Spyder3,并且不断收到此错误(如下)。我正在使用Geforce 1080ti,Ubuntu 18.04.01,python3.3.6,python2未安装。我尝试了$ pip3 install密钥环,该密钥环现已安装,但仍收到错误。
$ spyder3
Error initializing plugin EntryPoint('Windows (alt)', 'keyrings.alt.Windows', None, Distribution('keyrings.alt', '3.0')).
Traceback (most recent call last):
File "/home/usr/.local/lib/python3.6/site-packages/keyring/backend.py", line 163, in _load_plugins
init_func = ep.load()
File "/home/usr/.local/lib/python3.6/site-packages/entrypoints.py", line 77, in load
mod = import_module(self.module_name)
File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", …Run Code Online (Sandbox Code Playgroud) 我有一个程序,它使用 Yagmail 和密钥环包来安全存储电子邮件凭据。当我在atom.io 中运行此脚本并空闲时,它可以工作。
然而,当我用 pyinstaller 打包它后,它给了我这样的消息:
RuntimeError: No recommended backend was available. Install a recommended 3rd party backend package; or, install the keyrings.alt package if you want to use the non-recommended backends. See https://pypi.org/project/keyring for details.
Run Code Online (Sandbox Code Playgroud)
在我的程序中我有
import keyring
Run Code Online (Sandbox Code Playgroud)
我也已经安装了 keyring.alt
当我尝试pip在我的机器上运行命令时,我注意到这个问题WSL2 Ubuntu-20.04,运行任何东西都需要很长时间。我最终将范围缩小到pip导入keyring模块的时间。
Python 3.8.5 (default, May 27 2021, 13:30:53)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> def import_keyring():
... time_start = time.time()
... import keyring
... print(f"Keyring took {time.time() - time_start} seconds to load")
...
>>> import_keyring()
Keyring took 400.4930064678192 seconds to load
Run Code Online (Sandbox Code Playgroud)
查看进程资源管理器,似乎有一个子进程正在等待:
dbus-launch --autolaunch <32 character hex string> --binary-syntax --close-stderr
Run Code Online (Sandbox Code Playgroud)
dbus-launch 命令本身似乎没有任何子进程,所以我常常strace查看它挂在哪里:
connect(3, {sa_family=AF_INET, sin_port=htons(6000), sin_addr=inet_addr("<my main machine's …Run Code Online (Sandbox Code Playgroud) python ×5
dbus ×1
gtk ×1
ide ×1
pip ×1
pygobject ×1
pyinstaller ×1
python-3.6 ×1
python-3.x ×1
rhel7 ×1
spyder ×1
ubuntu ×1
ubuntu-18.04 ×1
windows ×1