chienkaung 发表于 2016-08-19 14:11

python读取注册表问题

import _winreg
import 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: 。哪位高手有解决办法或思路的,请不吝赐教!!

chienkaung 发表于 2016-08-19 14:23

在win7_x64 系统下进行的测试,其实我的目的是想清理掉卸载软件后的所有残留注册表项,如果哪位大侠有好的思路希望赐教,不限python

chienkaung 发表于 2016-08-20 16:58

原来注册表下的有些键只有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)

chienkaung 发表于 2016-08-20 17:02

现在又遇到一个问题,如果想删除一个键的话,必须保证这个键没有子健,所以必须把一个键的子健全部删除干净才能继续删除此键。我们不清楚一个键地下有多少子健,子健之下又有多少子健,怎么设计一个算法来删除一个键的所有子健?

chienkaung 发表于 2016-08-25 12:12

还是通过递归就可以做到,只是递归函数中删除语句的位置要放对

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]
查看完整版本: python读取注册表问题