Python winreg通过子键循环

时间:2013-01-16 02:32:52

标签: python winreg

我可以使用下面的代码从我的Windows 7计算机注册表配置单元“HKEY_LOCAL_MACHINE”中成功检索5个子键。

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

regedit或reg查询在该文件夹中显示6个值,但是我无法获得一个python脚本来向我显示这六个值。

6 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

答案 2 :(得分: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)

答案 3 :(得分:0)

要迭代Windows注册表的密钥,您需要EnumKey()模块中的_winreg。以下是EnumKey()的定义: -

  

def EnumKey(键,索引):

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

请注意,此方法将index作为参数,并仅为给定索引提供密钥。因此,为了获取所有密钥,您需要将索引递增1并继续,直到遇到WindowsError

有关详细信息,请参阅this post。代码的Github链接可以在帖子中找到。

答案 4 :(得分:0)

只想添加一个可能更多的pythonic解决方案。

from _winreg import *
import itertools

def subkeys(path, hkey=HKEY_LOCAL_MACHINE, flags=0):
    with suppress(WindowsError), OpenKey(hkey, path, 0, KEY_READ|flags) as k:
        for i in itertools.count():
            yield EnumKey(k, i)

您现在可以按预期访问键

for key in subkeys(r'path\to\your\key'):
    print key

对于缺少suppress()的python版本 <3.4 ,我建议将其添加到您的项目中:

from contextlib import contextmanager

@contextmanager
def suppress(*exceptions):
    try:
        yield
    except exceptions:
        pass
  

注意:如果您在读取某些值时遇到问题,则可能是从错误的注册表视图中读取的。将KEY_WOW64_64KEYKEY_WOW64_32KEY传递到flags参数)。在 python 2.6 中引入了使用OpenKey()作为上下文管理器。

答案 5 :(得分:0)

这只是@sparrowt答案的一个改进。我尝试时他的回答失败了,但认为它是在正确的轨道上。这将在键路径下面给出树。很抱歉在重写时更改了一些变量和方法名称,但只是尝试快速发布。在我的代码中,我将hkey用作全局变量bc,我希望一次只能使用一个hkey。

import winreg
import itertools
hkey = winreg.HKEY_LOCAL_MACHINE
def list_subkeys(path, hkey_set=None):
    global hkey
    if not hkey_set:
        hkey_set = hkey
    try:
        registry_key = winreg.OpenKey(hkey_set, path, 0, winreg.KEY_READ)
        for i in itertools.count():
            yield winreg.EnumKey(registry_key, i)
        winreg.CloseKey(registry_key)
    except Exception as ex:
        if str(ex) != '[WinError 259] No more data is available':
            print(str(ex))
        try:
            winreg.CloseKey(registry_key)
        except:
            pass
        return []

def traverse_registry_tree(keypath, levels=None, hkey_set=None):
    global hkey
    if not levels:
        levels = []
    if not hkey_set:
        hkey_set = hkey
    subkeys = list(list_subkeys(keypath, hkey_set))
    for subkeyname in subkeys:
        subkeypath = "%s\\%s" % (keypath, subkeyname)
        levels.append(subkeypath)
        levels.extend([r for r in traverse_registry_tree(subkeypath, levels, hkey_set) if r not in levels])
    del subkeys
    return levels