我目前正在尝试使用python通过_winreg搜索注册表项。这是我的代码:
from _winreg import *
import getpass
compName = raw_input("What is the name of the PC you wish to get a list of?: ")
currentUser = getpass.getuser()
filePath = "C:\\Users\\" + currentUser + "\\Desktop\\" + compName + "_Install_Programs.txt"
aReg = ConnectRegistry(compName,HKEY_LOCAL_MACHINE)
aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData")
file = open(filePath, "w")
for i in range(1024):
try:
asubkey_name=EnumKey(aKey,i)
asubkey=OpenKey(aKey,asubkey_name)
val=QueryValueEx(asubkey, "DisplayName")
val_disp = val[0]
val_str = val_disp.encode('ascii', 'ignore')
if "KB" not in val_str:
file.write(val_str)
file.write("\n")
except EnvironmentError:
pass
file.close()但是,它不会搜索其中文件夹的任何子文件夹。例如,它包含一个名为S-1-5-18的文件夹,然后在它下面是另外3个名为Components,Patches和Products的文件夹。如何让_winreg遍历所有这些文件夹及其后续文件夹,以找到名称为"DisplayName“的所有键?
已查看文档,但看不到列出的任何内容。可能是解释并不像我想的那么清楚
编辑
好的,所以我意识到我没有深入到文件夹,所以通过这段代码,我获得了文件夹的正确访问权限:
for i in range(1024):
try:
asubkey_name=EnumKey(aKey,i)
asubkey=OpenKey(aKey,asubkey_name)
for j in range(1024):
asubkey_name2=EnumKey(asubkey,j)
if asubkey_name2 == "Products":
asubkey2 = OpenKey(asubkey, asubkey_name2)
for k in range(1024):
asubkey_name3=EnumKey(asubkey2, k)
asubkey3=OpenKey(asubkey2, asubkey_name3)
print asubkey3
for l in range(1024):
asubkey_name4=EnumKey(asubkey3, l)
print asubkey_name4
asubkey4 = OpenKey(asubkey3, asubkey_name4)
except EnvironmentError:
pass我的输出显示如下:
<PyHKEY:0x000001E8>
Features
<PyHKEY:0x000001F0>
InstallProperties
<PyHKEY:0x000001F4>
Patches
<PyHKEY:0x000001EC>
Usage
<PyHKEY:0x000001D8>
<PyHKEY:0x000001E4>
Features
<PyHKEY:0x000001EC>
InstallProperties
<PyHKEY:0x000001F0>
Patches
<PyHKEY:0x000001E8>
Usage
<PyHKEY:0x000001D8>所以我知道它已经到达了这些文件夹。但是当我添加到代码中来搜索"DisplayName“时,如下所示:
for i in range(1024):
try:
asubkey_name=EnumKey(aKey,i)
asubkey=OpenKey(aKey,asubkey_name)
for j in range(1024):
asubkey_name2=EnumKey(asubkey,j)
if asubkey_name2 == "Products":
asubkey2 = OpenKey(asubkey, asubkey_name2)
for k in range(1024):
asubkey_name3=EnumKey(asubkey2, k)
asubkey3=OpenKey(asubkey2, asubkey_name3)
print asubkey3
for l in range(1024):
asubkey_name4=EnumKey(asubkey3, l)
print asubkey_name4
asubkey4 = OpenKey(asubkey3, asubkey_name4)
val=QueryValueEx(asubkey4, "DisplayName")
print val
val_disp = val[0]
val_str = val_disp.encode('ascii', 'ignore')
file.write(val_str)
file.write("\n")
except EnvironmentError:
pass这是我的输出:
<PyHKEY:0x000001E8>
Features
<PyHKEY:0x000001E4>
Features这就像是它丢失了文件夹,或者没有以相同的方式访问它们。这可能是一个简单的解决方案,但看看它,我就是看不出哪里出了问题
发布于 2015-01-30 00:27:14
经过大量的调查,我找到了一个解决方案。它可能不是最漂亮的,但它是有效的。我对如何改进它的建议持开放态度,但以下是我为那些遇到相同问题的人提供的代码:
from _winreg import *
compName = raw_input("What is the name of the PC you wish to get a list of?: ")
aReg = ConnectRegistry(compName,HKEY_LOCAL_MACHINE)
aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData")
for i in range(1024):
try:
asubkey_name=EnumKey(aKey,i)
asubkey=OpenKey(aKey,asubkey_name)
for j in range(1024):
asubkey_name2=EnumKey(asubkey,j)
if asubkey_name2=="Products":
asubkey2 = OpenKey(asubkey, asubkey_name2)
for k in range(1024):
asubkey_name3=EnumKey(asubkey2, k)
asubkey3 = OpenKey(asubkey2, asubkey_name3)
for l in range(4):
asubkey_name4=EnumKey(asubkey3,l)
if asubkey_name4=="InstallProperties":
asubkey4=OpenKey(asubkey3, asubkey_name4)
try:
dn=QueryValueEx(asubkey4, "DisplayName")
dn_Val = dn[0]
dn_Str = dn_Val.encode('ascii', 'ignore')
vn=QueryValueEx(asubkey4, "DisplayVersion")
vn_Val = vn[0]
vn_Str = vn_Val.encode('ascii', 'ignore')
pn=QueryValueEx(asubkey4, "Publisher")
pn_Val = pn[0]
pn_Str = pn_Val.encode('ascii', 'ignore')
print "Name: " + dn_Str
print "Version: " + vn_Str
print "Publisher: " + pn_Str + "\n"
except EnvironmentError:
pass
except EnvironmentError:
pass这使我能够深入了解并获得所需的信息。现在我知道try和except语句的使用可能会得到更好的利用,但现在这就是它给我的输出(也是我想要的!)
What is the name of the PC you wish to get a list of?:
Name: Microsoft Office 2007 Primary Interop Assemblies
Version: 12.0.4518.1014
Publisher: Microsoft Corporation
Name: Microsoft Office Professional Plus 2007
Version: 12.0.6612.1000
Publisher: Microsoft Corporation
Name: Microsoft Office InfoPath MUI (English) 2007
Version: 12.0.6612.1000
Publisher: Microsoft Corporation
...............我希望这能帮到你
https://stackoverflow.com/questions/28216014
复制相似问题