当前位置: 首页 > 科技观察

太棒了,Python也能操作注册表

时间:2023-03-18 01:02:19 科技观察

前言大家好,我是IT分享者,人称皮皮。您可能对注册表不是很熟悉,因为我们很少使用它;但它是Windows的核心,很多软件的启动和日志记录都在里面。可以说是一个大数据库,并没有不过,今天我们就来看看Python是如何操作注册表的。1.注册表首次进入系统注册表有多种方式。最常见的方式是运行窗口输入命令“regedit”进入注册表:注册表中的几个菜单分别对应从根目录登录的用户本机信息和本机信息以及用户信息以及本地配置信息等。2.理解操作注册表的模块Python中有这么一个神奇的模块,可以用来操作注册表。它就是-----“winreg”,Python自带的一个操作注册表的模块。3.导入importwinreg1。常量“winreg”总是有很多有用的方法,基本上就是对注册表中的键值进行操作,下面说几个重要的。首先我们来了解一下“winreg”中的常量:1).HKEY_常量winreg.HKEY_CLASSES_ROOT#存储应用程序和shell信息winreg.HKEY_CURRENT_USER#当前用户自定义信息winreg.HKEY_LOCAL_MACHINE#计算机系统所有信息winreg.HKEY_USERS#所有用户informationwinreg.HKEY_PERFORMANCE_DATA#性能数据winreg.HKEY_CURRENT_CONFIG#本地计算机系统的硬件配置文件winreg.HKEY_DYN_DATA#windows98之后的版本不能使用2).访问权限winreg.KEY_ALL_ACCESS#Allrightswinreg.KEY_WRITE#Writablewinreg。KEY_READ#可读winreg.KEY_EXECUTE#相当于KEY_READ的可执行winreg.KEY_QUERY_VALUE#查询注册表项值winreg.KEY_SET_VALUE#创建、删除或设置一组注册表值winreg.KEY_CREATE_SUB_KEY#为注册表子项创建注册表项winreg.KEY_ENUMERATE_SUB_KEYS#枚举注册表子键所需的注册表键winreg.KEY_NOTIFY#修改注册表键时提示winreg.KEY_CREATE_LINK#创建一个链接,保留给系统使用3).64-bitspecificapplicationswinreg.KEY_WOW64_64KEY#Applicationsin64-bitWindowsshouldrun在64位注册表视图中winreg.KEY_WOW64_32KEY#Applicationsin64-bitWindowsshouldrunin32-bitregistryview4).值类型winreg.REG_BINARY#任何形式的二进制数据winreg.REG_DWORD#32位数字winreg.REG_DWORD_LITTLE_ENDIAN#低位格式的32位数字,等同于REG_DWORDwinreg.REG_DWORD_BIG_ENDIAN#高位格式的32位数字winreg。REG_EXPAND_SZ#以空字符结尾的字符串包含对环境变量的引用(%%)winreg.REG_LINK#Unicode符号链接winreg.REG_MULTI_SZ#一个以null结尾的字符串序列,以两个空字符结尾winreg.REG_NONE#没有定义值类型winreg.REG_QWORD#64位数字winreg.REG_QWORD_LITTLE_ENDIAN#一个低优先级的64位数字格式,相当于REG_QWORDwinreg.REG_RESOURCE_LIST#设备驱动程序资源列表winreg.REG_FULL_RESOURCE_DESCRIPTOR#硬件设置winreg.REG_RESOURCE_REQUIREMENTS_LIST#硬件资源列表winreg.REG_SZ#以null结尾的字符串4.注册表相关操作1.连接远程计算机注册表reg=winreg.ConnectRegistry('\\Computername',winreg.HKEY_LOCAL_MACHINE)#返回值是打开的key的句柄#第一个参数是指远程计算机名,第二个参数是指注册表中的key,比如HKEY_LOCAL_MACHINE,就是winreg但是这里要注意的是,如果远程注册中心没有系统管理员权限,是无法正常访问注册中心的盟友。所以首先要确定它的访问权限。这里我们将使用之前讲过的“ctypes”模块中判断用户是否为管理员用户的方法。importctypesimportsysdefadmin():aa=ctypes.windll.shell32.IsUserAnAdmin()returnaaifadmin()==1:#有管理员权限,可以打开远程注册表winreg.ConnectRegistry('\\计算机名',winreg.HKEY_LOCAL_MACHINE)else:ifsys.version_info[0]==3:#pythonversionisversion3orabovectypes.windll.shell32.ShellExecuteW(None,"runas",sys.executable,__file__,None,1)else:#python2versionctypes.windll.shell32.ShellExecuteW(None,u"runas",unicode(sys.executable),unicode(__file__),None,1)2.关闭连接注册表。很简单,只要拿到打开注册表的句柄,就可以关闭了。winreg.CloseKey(reg)可以看出句柄的值不一样。其实还有一个方法,就是用注册处理对象的方法来关闭。reg.Close()注册对象还支持上下文和分离处理对象周期:reg.detach()#返回一个整数,记录当前对象的生命周期,如果注册句柄对象关闭了,那么就是03.openregistrykey#open指定key返回一个处理对象winreg.OpenKey(key,sub_key,reserved=0,access=winreg.KEY_READ)winreg.OpenKeyEx(key,sub_key,reserved=0,access=winreg.KEY_READ)#key:HKEY_constant#sub_key:指定密钥的子密钥#reserved:保留证书,必须为零。默认值为零#access:Access4.新建注册表项winreg.CreateKey(key,sub_key)winreg.CreateKeyEx(key,sub_key,reserved=0,access=winreg.KEY_WRITE)#key:HKEY_constant#sub_key:The指定密钥的子密钥#reserved:保留的证书,必须为零。默认值为零#access:访问权限5.删除注册表中指定的keywinreg.DeleteKey(key,sub_key)#不能删除带子key的keywinreg.DeleteKeyEx(key,sub_key,reserved=0,access=winreg.KEY_WOW64_64KEY)#Cannotdeleteakeywithsubkeyswinreg.DeleteValue(key,value)#Deleteanamedvalueitemfromaregistrationkey#用法同上,但结果是删除。可以看到“cnm”已经被删除了。如果key不存在,delete会报错。6.枚举注册表键值winreg.EnumKey(key,index)#枚举打开的注册表键值的子键值,并返回一个字符串winreg.EnumValue(key,index)#枚举打开的注册表键值,并返回一个元组#index:一个整数,用于标识获取到的key的索引7.刷新注册表keywinreg.FlushKey(key)#同步一个key的所有属性并写入注册表8.读取注册表winreg.LoadKey(key,sub_key,file_name)#file_name:读取注册表数据的文件名9.查找注册表键值winreg.QueryInfoKey(key)#返回一个3元元组的键值信息winreg.QueryValue(key,sub_key)#使用字符串检索valueofakeywinreg.QueryValueEx(key,value_name)#检索具有打开权限的注册表项关联的指定值的数据类型和名称10.保存注册表项winreg.SaveKey(key,file_name)#保存指定的key和所有指定文件的注册表子项11.启用和禁用注册表winreg.DisableReflectionKey(key)#Disablewinreg.EnableReflectionKey(key)#Enable12.是否禁用反射状态winreg.QueryReflectionKey(key)#如果结果为True,则表示禁用13.关联指定键上的值winreg.SetValue(key,sub_key,type,value)#Addkeyandvaluewinreg.SetValueEx(key,value_name,reserved,type,value)#将数据存储在一个打开的注册表键值域中#value_name:字符串名称的注册表子键#type:值类型#value:子键的键值可以看出它们的区别,前者的值类型只能指定为“winreg.REG_SZ”,后者可以是任何类型。14.找到应用程序的位置并打开它。我们已经介绍了几乎所有“winreg”的方法。首先找到它的位置并打开它。接着小编开始表演:1)。找到360SecurityGuard的注册表项:1))。打开系统注册表编辑器,然后搜索关键字:2))。找到注册表路径3)。打开注册表项,通过我们找到的子项搜索得到处理对象的句柄"reg"reg=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\360保安人员")4).找到应用程序的绝对路径并打印它。通过值名查找值数据,path=winreg.QueryValueEx(reg,'DisplayIcon')这样就找到了应用程序的绝对路径,返回值就是一个祖先。我们使用indexaccess:path[0]看到成功打印了我们要找的应用程序的绝对路径,然后就可以愉快的打开了。打开方式有很多种,“os”、“subprocess”、“ctypes”、“pywin32”等方法很多,但我还是觉得“os”最方便。os.popen(path[0])最后,不要忘记关闭对象句柄。#两种方法都可以关闭winreg.CloseKey(reg)reg.Close()4.总结使用“winreg”可以完成很多显示操作,还可以通过注册表设置系统启动项等操作,如果你想去黑客的发展。