python读取注册表问题
import _winregimport re
def subkey(key):
try:
i=0
subkeys=[]
while 1:
name=_winreg.EnumKey(key,i)
subkeys.append(name)
i+=1
except WindowsError:
return subkeys
def search1(key):
key1=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,key)
#if re.search('abc',key,re.IGNORECASE):
print key
for sk in subkey(key1):
sk1=key+"\\"+sk
search1(sk1)
keycon="SYSTEM"
search1(keycon)
目的是搜索注册表HKEY_LOCAL_MACHINE\system下的所有子健,找出带有关键字的键,发现有些键可以读取有些键没有读取权限,使用管理员权限运行的cmd然后调用python脚本,在注册表中也设置了所有键的权限为管理员完全控制,但是还是不行,执行到最后报错WindowsError: 。哪位高手有解决办法或思路的,请不吝赐教!!
在win7_x64 系统下进行的测试,其实我的目的是想清理掉卸载软件后的所有残留注册表项,如果哪位大侠有好的思路希望赐教,不限python 原来注册表下的有些键只有system用户才有读写权限,这些键主要涉及到硬件信息和系统相关信息,对于清理软件残留来说没必要去读取和修改这些键,所以当遇到WindowsError: 错误的时候用try。。except 捕获异常就不会造成程序退出了,之前def search1(key):这个函数没有捕获异常的代码。下面是改造后的代码,有兴趣的可以参考
import _winreg
import re
#获取一个注册表键的所有子健
def SubKeys(Ob_S_key):
try:
i=0
L_SubKeys=[]
while 1:
Name=_winreg.EnumKey(Ob_S_key,i)
L_SubKeys.append(Name)
i+=1
except WindowsError:
return L_SubKeys
#递归获取一个主键下包含关键字的所有子健
def SearchSubkey(Ob_MasterKey,Str_SubKey,Keyname):
try:
Ob_SS_Key=_winreg.OpenKey(Ob_MasterKey,Str_SubKey)
if re.search(Keyname,Str_SubKey,re.IGNORECASE):
print Str_SubKey
for sk in SubKeys(Ob_SS_Key):
Str_SS_SubKey=Str_SubKey+"\\"+sk
SearchSubkey(Ob_MasterKey,Str_SS_SubKey,Keyname)
except WindowsError:
pass
#获取根键下包含关键字的所有子健
def Search_KN_SubKey(Ob_MasterKey,Str_SubKey,Keyname):
Ob_SKS_Key=_winreg.OpenKey(Ob_MasterKey,Str_SubKey)
for Str_SKS_SubKey in SubKeys(Ob_SKS_Key):
SearchSubkey(Ob_MasterKey,Str_SKS_SubKey,Keyname)
#print Str_M_SubKey
#通过_winreg模块获取根键对象HKEY_LOCAL_MACHINE和HKEY_USERS,在windows系统中只有这两个根键被保存在硬盘中,其他根键要么是这两个根键的子健,要么就是volatile hive,当系统启动时在内存中创建。
Ob_M_MasterKey0=_winreg.HKEY_LOCAL_MACHINE
Ob_M_MasterKey1=_winreg.HKEY_USERS
#设置子健字符串为空,这样可以检索根键对象HKEY_LOCAL_MACHINE和HKEY_USERS下的所有子健
Str_M_SubKey=""
#设置检索子健的关键字,可以在list中追加多个关键字
L_Search_Keyname=['qq','360']
#根据关键字搜索注册表对应根键的所有子健,不区分大小写。
for Search_Keyname in L_Search_Keyname:
Search_KN_SubKey(Ob_M_MasterKey0,Str_M_SubKey,Search_Keyname)
Search_KN_SubKey(Ob_M_MasterKey1,Str_M_SubKey,Search_Keyname)
现在又遇到一个问题,如果想删除一个键的话,必须保证这个键没有子健,所以必须把一个键的子健全部删除干净才能继续删除此键。我们不清楚一个键地下有多少子健,子健之下又有多少子健,怎么设计一个算法来删除一个键的所有子健? 还是通过递归就可以做到,只是递归函数中删除语句的位置要放对
import _winreg
import re
#获取一个注册表键的所有子健
def SubKeys(Ob_S_key):
try:
i=0
L_SubKeys=[]
while 1:
Name=_winreg.EnumKey(Ob_S_key,i)
L_SubKeys.append(Name)
i+=1
except WindowsError:
return L_SubKeys
#删除主键和主键下的所有子健
def Del_SubKey(Ob_MasterKey,Str_SubKey):
try:
Ob_DS_Key=_winreg.OpenKey(Ob_MasterKey,Str_SubKey)
for sbkey in SubKeys(Ob_DS_Key):
Str_DS_SubKey=Str_SubKey+"\\"+sbkey
Del_SubKey(Ob_MasterKey,Str_DS_SubKey)
_winreg.DeleteKey(Ob_MasterKey,Str_SubKey)
except WindowsError:
pass
#递归获取一个主键下包含关键字的所有子健
def SearchSubkey(Ob_MasterKey,Str_SubKey,Keyname):
try:
Ob_SS_Key=_winreg.OpenKey(Ob_MasterKey,Str_SubKey)
for sk in SubKeys(Ob_SS_Key):
Str_SS_SubKey=Str_SubKey+"\\"+sk
if re.search(Keyname,sk,re.IGNORECASE):
print "Delete "+Str_SS_SubKey
Del_SubKey(Ob_MasterKey,Str_SS_SubKey)
else:
SearchSubkey(Ob_MasterKey,Str_SS_SubKey,Keyname)
except WindowsError:
pass
#获取根键下包含关键字的所有子健
def Search_KN_SubKey(Ob_MasterKey,Str_SubKey,Keyname):
Ob_SKS_Key=_winreg.OpenKey(Ob_MasterKey,Str_SubKey)
for Str_SKS_SubKey in SubKeys(Ob_SKS_Key):
SearchSubkey(Ob_MasterKey,Str_SKS_SubKey,Keyname)
#print Str_M_SubKey
#通过_winreg模块获取根键对象HKEY_LOCAL_MACHINE和HKEY_USERS,在windows系统中只有这两个根键被保存在硬盘中,其他根键要么是这两个根键的子健,要么就是volatile hive,当系统启动时在内存中创建。
Ob_M_MasterKey0=_winreg.HKEY_LOCAL_MACHINE
Ob_M_MasterKey1=_winreg.HKEY_USERS
#设置子健字符串为空,这样可以检索根键对象HKEY_LOCAL_MACHINE和HKEY_USERS下的所有子健
Str_M_SubKey=""
#设置检索子健的关键字,可以在list中追加多个关键字
L_Search_Keyname=['qq','360']
#根据关键字搜索注册表对应根键的所有子健,不区分大小写。
for Search_Keyname in L_Search_Keyname:
Search_KN_SubKey(Ob_M_MasterKey0,Str_M_SubKey,Search_Keyname)
Search_KN_SubKey(Ob_M_MasterKey1,Str_M_SubKey,Search_Keyname)
页:
[1]