我正在使用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”参数。答案 0 :(得分:1)
使用winreg。 (winreg.OpenKey
和winreg.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运行的脚本现在将有问题的密钥导出到可以轻松解析的文本文件中。