2013-01-16 64 views
6

我能够使用下面的代码从我的Windows 7机器注册表配置单元“HKEY_LOCAL_MACHINE”成功检索5个子键。Python winreg通过子键循环

from _winreg import * 

try: 
    i = 0 
    while True: 
     subkey = EnumKey(HKEY_LOCAL_MACHINE, i) 
     print subkey 
     i += 1 
except WindowsError: 
    pass 

我的问题是,我怎么枚举那些下的键?我想最终列出SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ NetworkList \ Signatures \ Unmanaged文件夹中的所有密钥,但我无法弄清楚如何在那里下一步。

为了回应第一条评论,我在机器上运行了这段代码,虽然没有出错,但没有产生结果。

from _winreg import * 

aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE) 
aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\Unmanaged") 
for i in range(1024): 
    try: 
     keyname = EnumKey(aKey, i) 
     asubkey = OpenKey(aKey, keyname) 
     val = QueryValueEx(asubkey, "Description") 
     print val 
    except WindowsError: 
     break 

一个注册表编辑器或REG查询显示该文件夹中有6个平均值,但我不能让一个python脚本来给我看这六个。

+0

我觉得这个答案有你需要的所有信息:http://stackoverflow.com/questions/5227107/python-code-to-read-registry –

+0

嗯,让我修改我的问题。 – user1982218

+0

该链接上列出的示例都没有在我的电脑上工作,但我的cmd正在以管理员身份运行......我想知道是否有其他问题。 – user1982218

回答

1

我没有要搜索的相同注册表项,但以下代码将列出HKEY_LOCAL_MACHINE \ Software中的所有子项。我认为如果你将keyVal字符串的值更改为你的目录,它将起作用。

try ... except集团是这种方式,因为EnumKey会失败。我没有把它当做for循环,因为我不知道如何获得正确的aKey长度。

keyVal = r"Software" 
aKey = OpenKey(HKEY_LOCAL_MACHINE, keyVal, 0, KEY_ALL_ACCESS) 
try: 
    i = 0 
    while True: 
     asubkey = EnumKey(aKey, i) 
     print(asubkey) 
     i += 1 
except WindowsError: 
    pass 
0

做了这样的工作吗?

import _winreg 

def subkeys(key): 
    i = 0 
    while True: 
     try: 
      subkey = _winreg.EnumKey(key, i) 
      yield subkey 
      i+=1 
     except WindowsError: 
      break 

def traverse_registry_tree(key=_winreg.HKEY_LOCAL_MACHINE, tabs=0): 
    for k in subkeys(key): 
     print '\t'*tabs + str(k) 
     traverse_registry_tree(k, tabs+1) 
+0

不,因为'EnumKey'返回一个字符串,然后您尝试并通过一个'PyHKEY'不起作用 – sparrowt

0

这工作,并打印出所有子项的列表(的@ Broseph的答案固定版本)

import _winreg 

def subkeys(key): 
    i = 0 
    while True: 
     try: 
      subkey = _winreg.EnumKey(key, i) 
      yield subkey 
      i+=1 
     except WindowsError as e: 
      break 

def traverse_registry_tree(hkey, keypath, tabs=0): 
    key = _winreg.OpenKey(hkey, keypath, 0, _winreg.KEY_READ) 
    for subkeyname in subkeys(key): 
     print '\t'*tabs + subkeyname 
     subkeypath = "%s\\%s" % (keypath, subkeyname) 
     traverse_registry_tree(hkey, subkeypath, tabs+1) 

keypath = r"SOFTWARE\\Microsoft\\Windows" 

traverse_registry_tree(_winreg.HKEY_LOCAL_MACHINE, keypath) 
+0

在traverse_registry_tree(hkey,keypath,tabs = 0)中,调用traverse_registry_tree(subkeypath,tabs + 1)似乎省略第一个参数,我认为应该是hkey。 – gwideman

+0

很好,谢谢!固定。 – sparrowt

0

对于通过Windows注册表键迭代,你需要EnumKey()_winreg模块。下面给出的定义EnumKey(): -

高清EnumKey(键,索引):

  • 枚举的打开注册表项的子项。
  • 键是一个已经打开的键或任何一个预定义的HKEY_ *常数。
  • index是一个整数,用于标识要检索的键的索引。

注意,此方法,采用指数作为参数,并提供您的关键只为给定的指标。因此,为了获得所有密钥,您需要将索引加1并继续,直到遇到WindowsError

请参阅this post了解相同的细节。该代码的Github链接可以在帖子中找到。