免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4293 | 回复: 4
打印 上一主题 下一主题

python读取注册表问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-19 14:11 |只看该作者 |倒序浏览
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: [Error 5]。哪位高手有解决办法或思路的,请不吝赐教!!

论坛徽章:
0
2 [报告]
发表于 2016-08-19 14:23 |只看该作者
在win7_x64 系统下进行的测试,其实我的目的是想清理掉卸载软件后的所有残留注册表项,如果哪位大侠有好的思路希望赐教,不限python

论坛徽章:
0
3 [报告]
发表于 2016-08-20 16:58 |只看该作者
原来注册表下的有些键只有system用户才有读写权限,这些键主要涉及到硬件信息和系统相关信息,对于清理软件残留来说没必要去读取和修改这些键,所以当遇到WindowsError: [Error 5] 错误的时候用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)

论坛徽章:
0
4 [报告]
发表于 2016-08-20 17:02 |只看该作者
现在又遇到一个问题,如果想删除一个键的话,必须保证这个键没有子健,所以必须把一个键的子健全部删除干净才能继续删除此键。我们不清楚一个键地下有多少子健,子健之下又有多少子健,怎么设计一个算法来删除一个键的所有子健?

论坛徽章:
0
5 [报告]
发表于 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)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP