Python Windows阻止HKLM上的注册表查询;返回香港大学

Python Windows阻止HKLM上的注册表查询;返回香港大学,python,windows,windows-7,registry,registry-virtualization,Python,Windows,Windows 7,Registry,Registry Virtualization,我正在使用ActivePython 2.5读取注册表中pGina生成的条目。具体而言,计算机上允许哪些GID的条目。对于通过pGina编辑的每台计算机,这些信息可能会定期更改,因此我希望我的Python脚本能够每次检查这些值 很简单。以下Windows命令将为我获取该信息: reg query HKLM\Software\pGina\ldapauth\ …除非我用Python运行它,否则我会得到以下结果: >>> import subprocess >>>

我正在使用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'时,它会在HKCU\Software而不是HKLM下弹出一个键和值列表

我以管理员身份运行Python(通过使用getpass.getuser()确认),当我从批处理脚本运行相同的命令时,我在HKLM下得到了正确的列表。但是,当我从Python调用批处理脚本时,返回到ole'HKCU结果

所以,我有点卡住了。有人有什么见解吗

编辑:如下文所述,我正在运行64位Windows 7,并尝试了_winreg方法,包括OpenKey中可选的第4个“sam”参数。

使用。(
winreg.OpenKey
winreg.Query*
)。速度更快,无需运行shell命令,它甚至会以面向对象的方式返回棘手的注册表值类型,如二进制

#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界面是。您可能很想为查找调用编写一个包装器,特别是如果您像我一样,编写一个生成器来获取子项的递归和枚举、与项名称的模式匹配、将搜索限制为某些允许的注册表值等等。

因此我仍然没有找到解决我的问题的根本原因的方法。不过,我可以解决这个问题。系统在每次登录时运行的脚本现在将相关密钥导出到一个文本文件中,该文件可以轻松解析。

是的,我在网上看到了这些示例。我之前应该说过,我已经尝试过了,但它仍然返回HKCU。OpenKey(hive,keyname[,0,sam])有一个可选的第四个参数。sam是,您可能还需要
KEY\u ENUMERATE\u SUB\u KEY
。当您请求HKLM时,Windows将HKCU返回给您听起来像是一些Windows权限问题,而不是Python。我亲自在HKLM上执行这种命令没问题。什么版本的Windows?Windows Defender(或第三方安全软件)是否已关闭?建议您将标题更改为“Windows阻止HKLM上的注册查询”;返回HKCU“谢谢所有建议,ppl!恐怕第四个论点没有什么不同。赛门铁克正在运行,但当它被禁用时似乎没有什么区别。这是Win7 64位。您正在运行Win7,是吗?显然,这实现了注册表虚拟化,这可能是罪魁祸首。请参阅,此问题也会影响cmakes自己的
find_库
,许多软件包都依赖它来查找内容。例如,cmake无法通过“HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore”中的注册表找到64位Python库,因为cmake可执行文件是32位的。有关Win 7注册表虚拟化,请参阅我在您的问题下的评论中引用的SO文章。