Windows 阻止对 HKLM 的 reg query;返回 HKCU

3 投票
2 回答
1649 浏览
提问于 2025-04-16 23:39

我正在使用 ActivePython 2.5 来读取注册表,主要是查看 pGina 创建的条目。具体来说,就是哪些 GID(组标识符)被允许在这台电脑上使用。这些信息可能会随着 pGina 的编辑而定期变化,所以我希望我的 Python 脚本每次都能检查这些值。

这其实很简单。下面这个 Windows 命令可以帮我获取这些信息:

reg query HKLM\Software\pGina\ldapauth\

...但是当我用 Python 运行这个命令时,我得到了这个结果:

>>> import subprocess
>>> command = 'reg query HKLM\Software\pGina\ldapauth'
>>> ldapauth = subprocess.Popen(command, shell=False, stdout=subprocess.PIPE).communicate()[0]
ERROR: The system was unable to find the specified registry key or value.

所以,当我通过 Python 运行 'reg query HKLM\Software' 时,它却给我返回了 HK CU\Software 下的键和值,而不是 HKLM 下的。

我以管理员身份运行 Python(通过 getpass.getuser() 确认了这一点),而当我从批处理脚本中运行同样的命令时,我得到了正确的 HKLM 列表。然而,当我从 Python 调用这个批处理脚本时,又回到了 HKCU 的结果。

所以,我有点卡住了。有没有人能给点建议?

补充说明:如后面详细说明的,我正在运行 64 位的 Windows 7,并且我尝试过 _winreg 方法,包括在 OpenKey 中的可选第四个 "sam" 参数。

2 个回答

1

可以使用 winreg 这个库。使用 winreg.OpenKeywinreg.Query* 这些方法会更快,不需要去执行外部的命令,而且它还能返回一些复杂的注册表值类型,比如二进制数据,所有操作都是面向对象的方式。

#import _winreg as winreg # the 'correct' idiom for importing
from _winreg import *

with OpenKey(HKEY_LOCAL_MACHINE,'Software\pGina\ldapauth') as key:
    ... do something with QueryValue(key[,...])

winreg 完全可以完成这个任务,虽然它的界面有点奇怪,因为它是基于 Windows 的底层接口。你可能会想为查找操作写一个封装器,特别是如果你像我一样,写了一个生成器来处理递归和枚举子键、根据键名进行模式匹配、限制搜索到某些允许的注册表值等等。

0

我到现在还没找到我这个问题的根本原因。不过,我可以找到一个解决办法。现在,每次登录时,系统会运行一个脚本,这个脚本会把相关的密钥导出到一个文本文件里,这样就可以很方便地处理这些信息了。

撰写回答