我目前正在尝试使用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>
所以我知道它已经到达了那些文件夹。但是当我添加代码来搜索&#34; DisplayName&#34;像这样:
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
它已经丢失了文件夹或者没有以相同的方式访问它们。它可能是一个简单的解决方案,但看着它,我只是看不出这里的错误
答案 0 :(得分:0)
经过多次调查,我找到了解决方案。它可能不是最漂亮的但它有效。我对如何改进它的建议持开放态度,但这里是我遇到与我一样的问题的代码:
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
...............
我希望这会有所帮助