我可以使用下面的代码从我的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脚本来向我显示这六个值。
答案 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_64KEY
或KEY_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