Windows阻止对HKLM的reg查询;返回HKCU

时间:2011-08-15 23:27:28

标签: python windows windows-7 registry registry-virtualization

我正在使用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结果。

所以,我有点卡住了。有没有人有任何见解?

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

2 个答案:

答案 0 :(得分:1)

使用winreg。 (winreg.OpenKeywinreg.Query*)。更快,不需要运行shell命令,它甚至会返回像BINARY这样棘手的注册表值类型,所有这些都是OO方式。

#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界面是。你可能想为查询调用编写一个包装器,尤其是。如果像我一样你编写一个生成器来获取子键的递归和枚举,模式匹配键名,限制搜索到某些允许的注册表值等等。

答案 1 :(得分:0)

所以我仍然没有在我的案例中找到解决根本原因的方法。但是,我可以解决它。每次登录时由SYSTEM运行的脚本现在将有问题的密钥导出到可以轻松解析的文本文件中。