python操作注册表

一、前言

Python操作注册表有两种方法,一种是使用pywin32模块,还有一种是使用winreg模块,今天我们要讲的是winreg模块,winreg有一些我们需要知道的常识,如下:

1.HKEY_ 常量
winreg.HKEY_CLASSES_ROOT
本注册表键下的注册表项定义了文件的类型(或类别)及相关属性。Shell 和 COM 应用程序将使用该注册表键下保存的信息。

winreg.HKEY_CURRENT_USER
属于该注册表键的表项定义了当前用户的偏好。这些偏好值包括环境变量设置、程序组数据、颜色、打印机、网络连接和应用程序参数。

winreg.HKEY_LOCAL_MACHINE
属于该注册表键的表项定义了计算机的物理状态,包括总线类型、系统内存和已安装软硬件等数据。

winreg.HKEY_USERS
属于该注册表键的表项定义了当前计算机中新用户的默认配置和当前用户配置。

winreg.HKEY_PERFORMANCE_DATA
属于该注册表键的表项可用于读取性能数据。这些数据其实并不存放于注册表中;注册表提供功能让系统收集数据。

winreg.HKEY_CURRENT_CONFIG
包含有关本地计算机系统当前硬件配置的信息。

winreg.HKEY_DYN_DATA
Windows 98 以上版本不使用该注册表键。
2.访问权限
winreg.KEY_ALL_ACCESS
组合了 STANDARD_RIGHTS_REQUIRED 、KEY_QUERY_VALUE 、 KEY_SET_VALUE 、 KEY_CREATE_SUB_KEY 、 KEY_ENUMERATE_SUB_KEYS 、 KEY_NOTIFY 和 KEY_CREATE_LINK 访问权限。

winreg.KEY_WRITE
组合了 STANDARD_RIGHTS_WRITE 、 KEY_SET_VALUE 和 KEY_CREATE_SUB_KEY 访问权限。

winreg.KEY_READ
组合了 STANDARD_RIGHTS_READ 、 KEY_QUERY_VALUE 、 KEY_ENUMERATE_SUB_KEYS 和 KEY_NOTIFY 。

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
保留给系统使用。

winreg.KEY_WOW64_64KEY
表示一个应用程序在 64 位 Windows 上应当在 64 位的注册表视图上进行操作。 在 32 位 Windows 上,此常量会被忽略。

winreg.KEY_WOW64_32KEY
表示一个应用程序在 64 位 Windows 上应当在 32 位的注册表视图上进行操作。 在 32 位 Windows 上,此常量会被忽略。
3.64位的具体应用
winreg.KEY_WOW64_64KEY #在64位Windows应用程序应该运行在64位注册表视图
winreg.KEY_WOW64_32KEY #在64位Windows应用程序应该运行在32位注册表视图
4.注册表值的类型
winreg.REG_BINARY
任意格式的二进制数据。

winreg.REG_DWORD
32 位数字。

winreg.REG_DWORD_LITTLE_ENDIAN
32 位低字节序格式的数字。相当于 REG_DWORD。

winreg.REG_DWORD_BIG_ENDIAN
32 位高字节序格式的数字。

winreg.REG_EXPAND_SZ
包含环境变量(%PATH%)的字符串,以空字符结尾。

winreg.REG_LINK
Unicode 符号链接。

winreg.REG_MULTI_SZ
一串以空字符结尾的字符串,最后以两个空字符结尾。Python 会自动处理这种结尾形式。

winreg.REG_NONE
未定义的类型。

winreg.REG_QWORD
64 位数字。

winreg.REG_QWORD_LITTLE_ENDIAN
64 位低字节序格式的数字。相当于 REG_QWORD。

winreg.REG_RESOURCE_LIST
设备驱动程序资源列表。

winreg.REG_FULL_RESOURCE_DESCRIPTOR
硬件设置。

winreg.REG_RESOURCE_REQUIREMENTS_LIST
硬件资源列表。

winreg.REG_SZ
空字符结尾的字符串。
(摘自Python文档)

5.连接远程计算机注册表
reg=winreg.ConnectRegistry(‘\远程计算机名’,主键)#返回主键句柄
在访问之前得先判断是否有管理员权限,如下:

import ctypes
import sys
def gly():
ab=ctypes.windll.shell32.IsUserAnAdmin()
return ab

if gly()==1: #如果有管理员权限便可打开远程注册表
winreg.ConnectRegistry(‘\远程计算机名’,主键)
else:
if sys.version_info[0]==3: #python3
ctypes.windll.shell32.ShellExecuteW(None, “runas”, sys.executable, file, None, 1)
else: #python2
ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(file), None, 1)
连接之后不想用了,想要关闭,也很简单,有两种方法,如下:

winreg.CloseKey(reg)
reg.Close()
句柄的值也可以打印出来。

6.创建注册表项
有两个函数都可以实现,如下:

winreg.CreateKey(key, sub_key)
winreg.CreateKeyEx(key, sub_key, reserved=0, access=KEY_WRITE)
创建或打开特定的键,返回一个 handle 对象。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

sub_key 是用于命名该方法所打开或创建的键的字符串。

reserved 是一个保留的整数,必须是零。默认值为零。

access 为一个整数,用于给键的预期安全访问指定访问掩码。默认值为 KEY_WRITE。参阅 Access Rights 了解其它允许值。

如果 key 是预定义键之一,sub_key 可能会是 None。该情况下,返回的句柄就是传入函数的句柄。

如果键已经存在,则该函数打开已经存在的该键。

返回值是所开打键的句柄。如果函数失败,则引发一个 OSError 异常。
(摘自Python文档)

因为创建注册表的第一个参数为打开的键的句柄,因此我们需要先打开一个键,这里我们用到如下函数:

winreg.OpenKey(key, sub_key, reserved=0, access=KEY_READ)
winreg.OpenKeyEx(key, sub_key, reserved=0, access=KEY_READ)
打开指定的注册表键,返回 handle对象。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

sub_key 是个字符串,标识了需要打开的子键。

reserved 是个保留整数,必须为零。默认值为零。

access 是个指定访问掩码的整数,掩码描述了注册表键所需的安全权限。默认值为 KEY_READ。其他合法值参见 访问权限。

返回结果为一个新句柄,指向指定的注册表键。

如果调用失败,则会触发 OSError 。

触发 审计事件 winreg.OpenKey,附带参数为 key 、sub_key 、 access。

引发一个 审计事件 winreg.OpenKey/result,附带参数 key。
(摘自Python文档)

下面我们来创建一个注册表的子项,如下:

#打开的键的句柄
key= reg.OpenKey(reg.HKEY_CURRENT_USER,“Software”,0,reg.KEY_SET_VALUE)

#创建一个子项
reg.CreateKey(key, ‘test’)
创建完后,我们还要给他一些值和数据,如下:

创建值和数据

reg.SetValue(key, ‘test’,reg.REG_SZ, ‘hello world’)
所有的工作做完后,我们只需要关闭就好了,如下:

#关闭打开的键
reg.CloseKey(key)
这个时候,我们可以通过打开和关闭的注册表的键的句柄的值来判断是什么情况,如下:图片

可以看到,值完全不一样,我们再来看看我们创建的注册表的项,如图:

图片

可以看到,此时的名称是默认,并没有设置,如果想设置我们想要的名称,这里需要使用SetValueEx,如下:

reg.SetValueEx(key1, “user”,0,reg.REG_SZ, “hello world 123”)
此时我们就可以将值和数据添加到对应的键上了,如图:

图片

创建.rar: https://url18.ctfile.com/f/7715018-960795864-b5cede?p=6511 (访问密码: 6511)

7.修改注册表
winreg.SetValue(key, sub_key, type, value)
将值与指定的注册表键关联。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

sub_key 是个字符串,用于命名与该值相关的子键。

type 是个整数,用于指定数据的类型。目前这必须是 REG_SZ ,意味着只支持字符串。请用 SetValueEx() 函数支持其他的数据类型。

value 是设置新值的字符串。

如果 sub_key 参数指定的注册表键不存在,SetValue 函数会创建一个。

值的长度受到可用内存的限制。较长的值(超过 2048 字节)应存为文件,并将文件名存入配置注册表。这有助于提高注册表的使用效率。

由 key 参数标识的注册表键,必须已用 KEY_SET_VALUE 方式打开。

触发 审计事件 winreg.SetValue,附带参数 key、 sub_key 、 type 、 value。

winreg.SetValueEx(key, value_name, reserved, type, value)
将数据存入已打开的注册表键的值中。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

value_name 是个字符串,用于命名与值相关的子键。

reserved 可以是任意数据 —— 传给 API 的总是 0。

type 是个整数,用于指定数据的类型。请参阅 Value Types 了解可用的类型。

value 是设置新值的字符串。

本方法也可为指定的注册表键设置额外的值和类型信息。注册表键必须已用 KEY_SET_VALUE 方式打开。

请用 CreateKey() 或 OpenKey() 方法打开注册表键。

值的长度受到可用内存的限制。较长的值(超过 2048 字节)应存为文件,并将文件名存入配置注册表。这有助于提高注册表的使用效率。

触发 审计事件 winreg.SetValue,附带参数 key、 sub_key 、 type 、 value。
修改注册表其实就是相当于将我们注册表的值对应的数据改变了,如图:

图片

修改.rar: https://url18.ctfile.com/f/7715018-960795885-cfea81?p=6511 (访问密码: 6511)

8.查询注册表
1).查询指定的键
winreg.QueryInfoKey(key)
以元组形式返回某注册表键的信息。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

结果为3元素的元组。

索引 含意

0 整数值,给出了此注册表键的子键数量。

1 整数值,给出了此注册表键的值的数量。

2 整数值,给出了此注册表键的最后修改时间,单位为自 1601 年 1 月 1 日以来的 100 纳秒。

触发 审计事件 winreg.QueryInfoKey,附带参数为 key。

图片

查询键.rar: https://url18.ctfile.com/f/7715018-960795858-a946eb?p=6511 (访问密码: 6511)

2).查询指定的值
winreg.QueryValue(key, sub_key)
读取某键的未命名值,形式为字符串。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

sub_key 是个字符串,用于保存与某个值相关的子键名称。如果本参数为 None 或空,函数将读取由 SetValue() 方法为 key 键设置的值。

注册表中的值包含名称、类型和数据。本方法将读取注册表键值的第一个名称为 NULL 的数据。可是底层的 API 调用不会返回类型,所以只要有可能就一定要使用 QueryValueEx()。

触发 审计事件 winreg.QueryValue,附带参数为 key、 sub_key 、 value_name。

winreg.QueryValueEx(key, value_name)
读取已打开注册表键指定值名称的类型和数据。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

value_name 是字符串,表示要查询的值。

结果为二元组:

索引 含意

0 注册表项的值。

1 整数值,给出该值的注册表类型(请查看文档中的表格了解 SetValueEx() )。

触发 审计事件 winreg.QueryValue,附带参数为 key、 sub_key 、 value_name。

图片

查询值.rar: https://url18.ctfile.com/f/7715018-960795861-e3f473?p=6511 (访问密码: 6511)

9.删除注册表
1).删除指定的键
winreg.DeleteKey(key, sub_key)
winreg.DeleteKeyEx(key, sub_key, access=KEY_WOW64_64KEY, reserved=0)
删除指定的键。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

sub_key 这个字符串必须是由 key 参数所指定键的一个子项。该值项不可以是 None,同时键也不可以有子项。

reserved 是一个保留的整数,必须是零。默认值为零。

access 是一个指定描述注册表键所需的安全权限的访问掩码的整数。默认值为 KEY_WOW64_64KEY。在 32-bit Windows 上,WOW64 常量会被忽略。请参阅 访问权限 了解其他可用的值。

该方法不能删除带有子项的键。

如果方法成功,则整个键,包括其所有值项都会被移除。如果方法失败,则引发一个 OSError 异常。

在不支持的 Windows 版本之上,将会引发 NotImplementedError 异常。

引发一个 审计事件 winreg.DeleteKey,附带参数 key, sub_key, access。
这里有个小坑,就是我的子键下若是有其它子键,那么删除就会报错,如图:

图片

图片

所以这个时候我们可以选择递归删除,但是这种删除方法最后会导致所有的东西都删除了,就连子键本身都会被删除。

删除键.rar: https://url18.ctfile.com/f/7715018-960795876-8b36ae?p=6511 (访问密码: 6511)

2).删除指定的值
winreg.DeleteValue(key, value)
从某个注册键中删除一个命名值项。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

value 为标识所要删除值项的字符串。
这个很容易实现,如图:

图片

删除值.rar: https://url18.ctfile.com/f/7715018-960795879-91325e?p=6511 (访问密码: 6511)

10.枚举注册表
1).枚举指定的键
winreg.EnumKey(key, index)
列举某个已经打开注册表键的子项,并返回一个字符串。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

index 为一个整数,用于标识所获取键的索引。

每次调用该函数都会获取一个子项的名字。通常它会被反复调用,直到引发 OSError 异常,这说明已经没有更多的可用值了。

引发一个 审计事件 winreg.EnumKey,附带参数 key, index。

图片

枚举键.rar: https://url18.ctfile.com/f/7715018-960795870-44077e?p=6511 (访问密码: 6511)

2).枚举指定的值
winreg.EnumValue(key, index)
列举某个已经打开注册表键的值项,并返回一个元组。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

index 为一个整数,用于标识要获取值项的索引。

每次调用该函数都会获取一个子项的名字。通常它会被反复调用,直到引发 OSError 异常,这说明已经没有更多的可用值了。

结果为3元素的元组。

索引 含意

0 用于标识值项名称的字符串。

1 保存值项数据的对象,其类型取决于背后的注册表类型。

2 标识值项数据类型的整数。(请查阅 SetValueEx() 文档中的表格)

引发一个 审计事件 winreg.EnumValue,附带参数 key, index。

图片

枚举值.rar: https://url18.ctfile.com/f/7715018-960795873-5d8e9d?p=6511 (访问密码: 6511)

11.读取保存注册表
winreg.LoadKey(key, sub_key, file_name)
在指定键之下创建一个子键,并将指定文件中的注册表信息存入该子键中。

key 是由 ConnectRegistry() 返回的句柄,或者是常量 HKEY_USERS 或 HKEY_LOCAL_MACHINE。

sub_key 是个字符串,用于标识需要载入的子键。

file_name 是要加载注册表数据的文件名。该文件必须是用 SaveKey() 函数创建的。在文件分配表(FAT)文件系统中,文件名可能不带扩展名。

如果调用 LoadKey() 的进程没有 SE_RESTORE_PRIVILEGE 特权则调用将失败。请注意特权与权限是不同的 – 更多细节请参阅 RegLoadKey 文档。

如果 key 是由 ConnectRegistry() 返回的句柄,那么 file_name 指定的路径是相对于远程计算机而言的。

引发一个 审计事件 winreg.LoadKey,附带参数 key, sub_key, file_name。

winreg.SaveKey(key, file_name)
将指定注册表键及其所有子键存入指定的文件。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

file_name 是要保存注册表数据的文件名。该文件不能已存在。如果文件名包括扩展名,也不能在文件分配表(FAT)文件系统中用于 LoadKey() 方法。

如果 key 是代表远程计算机上的注册表键,那么 file_name 所描述的路径就是相对于远程计算机的。本方法的调用方必须拥有 SeBackupPrivilege 安全特权。请注意特权与权限是不同的 – 更多细节请参阅 Conflicts Between User Rights and Permissions 文档。

本函数将 NULL 传给 API 的 security_attributes。

引发一个 审计事件 winreg.SaveKey,附带参数 key, file_name。
12.刷新注册表键
winreg.FlushKey(key)
将某个键的所有属性写入注册表。

key 为某个已经打开的键,或者预定义的 HKEY_* 常量 之一。

没有必要调用 FlushKey() 去改动注册表键。注册表的变动是由其延迟刷新机制更新到磁盘的。在系统关机时,也会将注册表的变动写入磁盘。与 CloseKey() 不同, FlushKey() 方法只有等到所有数据都写入注册表后才会返回。只有需要绝对确认注册表变动已写入磁盘时,应用程序才应去调用 FlushKey()。

备注 如果不知道是否要调用 FlushKey() ,可能就是不需要。
13.启用禁用注册表
winreg.DisableReflectionKey(key) #禁用
winreg.EnableReflectionKey(key) #启用
另外还有两个关于开启和关闭网络代理以及关联右键菜单的注册表键操作,如下:

winreg开启关闭系统网络代理模式案例.rar: https://url18.ctfile.com/f/7715018-960852603-8b368b?p=6511 (访问密码: 6511)

关联到右键菜单.rar: https://url18.ctfile.com/f/7715018-960852606-03fb0c?p=6511 (访问密码: 6511)

上面就是一些关于Python操作注册表的知识了,大家对什么技术感兴趣,可以在下方发消息给我,感谢大家的支持。更多精彩好文请关注公众号“”简易编程网“”,提前查看最新好文。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_30852573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值