循环遍历值或注册表项.. _winreg Python

时间:2010-10-20 01:06:35

标签: python windows registry enumeration winreg

如何使用Python模块_winreg遍历Windows注册表项的所有 。我有代码可以执行我想要的操作,但它适用于指定注册表项的子项。


以下是代码:

from _winreg import *
t = OpenKey(HKEY_CURRENT_USER, r"PATH TO KEY", 0, KEY_ALL_ACCESS)

try:
    i = 0
    while True:
        subkey = EnumValue(t, i)
        print subkey
        i += 1
except WindowsError:
    # WindowsError: [Errno 259] No more data is available    
    pass

哦,想通了。但是,如果有人知道另一种方法,我仍然会接受这个答案!

5 个答案:

答案 0 :(得分:7)

我更喜欢避免错误,而不是潜入其中......

使用_winreg.QueryInfoKey获取值的数量:

import _winreg
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r'PATH\TO\KEY', 0, _winreg.KEY_READ)

for i in xrange(0, _winreg.QueryInfoKey(key)[1]):
    print _winreg.EnumValue(key, i)

获取Keys的数量,相同的方法,不同的索引(原始问题的后半部分):

for i in xrange(0, _winreg.QueryInfoKey(key)[0]):
    print _winreg.EnumKey(key, i)

注意:使用import而不是from ... import来明确函数和变量的来源。在以后的生活中更容易遵循代码。

答案 1 :(得分:4)

不应该EnumValue在这里有所帮助

# list all values for a key
try:
    count = 0
    while 1:
        name, value, type = _winreg.EnumValue(t, count)
        print repr(name),
        count = count + 1
except WindowsError:
    pass

答案 2 :(得分:0)

要迭代注册表的键和值,您需要EnumKey()模块中的EnumVlaue()_winreg方法。请注意,这两个方法将索引作为参数,并仅为给定索引提供键(或值)。因此,为了获取所有键(或值),您需要将索引递增1并继续直到WindowsError未遇到。

This post可能会帮助您详细了解相同内容。代码的Github链接可以在帖子中找到。

答案 3 :(得分:0)

对于python 3

import winreg
hKey = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, "Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache")


try:
    count = 0
    while 1:
        name, value, type = winreg.EnumValue(hKey, count)
        print (name),
        count = count + 1
except WindowsError as err:
    print(err)
    pass

答案 4 :(得分:0)

(Python3)使用生成器和递归,因为我不喜欢计数器...

 def get_keys(self, path, i=0):
    try:
        yield winreg.EnumValue(winreg.OpenKey(winreg.HKEY_CURRENT_USER, path), i)
        yield from get_keys(path, i+1)
    except WindowsError as err:
        pass


for name, value, type in r.get_keys(r"Local Settings\Software\Microsoft\Windows\Shell\MuiCache"):
    print(f"{name} => {value} ({type})"