Python操纵Windows注册表:_winreg与win32api实战及64位重定向问题
本文详细解析Python中操纵Windows注册表的方法,重点对比_winreg与win32api模块。针对32位Python在64位系统下因注册表重定向导致的访问异常,深入剖析Wow6432Node机制,并提供使用win32con.KEY_WOW64_64KEY标志绕过重定向的完整解决方案,确保跨平台兼容性。
Python注册表操作概述
本文详细介绍利用Python语言对Windows注册表进行读写控制的实现方案,旨在为开发者提供实用的参考指南。
若需直接操作注册表,可调用内置的_winreg模块。
_winreg核心概念与函数
理解以下核心概念至关重要:
- KEY(注册表键)
- Value(键值)
掌握相关函数及其具体作用如下:
CloseKey():关闭已打开的注册表键。 ConnectRegistry():连接到远程计算机的注册表。 CreateKey():创建新的注册表键。 DeleteKey():删除指定的注册表键。 DeleteValue():删除指定键下的特定值(Value)。 EnumKey():枚举已打开键下的所有子键。 EnumValue():枚举已打开键下的所有值。 FlushKey():将注册表中的所有属性更改立即写入磁盘。 LoadKey():从指定文件加载键信息到注册表。 OpenKey():打开一个现有的注册表键。 OpenKeyEx():打开注册表键的扩展版本。 QueryValue():检索指定键的路径信息。 QueryValueEx():检索指定键的详细路径及值信息。 QueryInfoKey():获取关于键的元数据信息。 SaveKey():将注册表键保存至文件。 SetValue():设置指定键的值。 SetValueEx():设置指定键的详细值信息。
注册表基本操作示例
1、读取注册表数据
import _winreg
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,r"Software\Microsoft\Windows\CurrentVersion\Explorer")
#获取该键的所有键值,因为没有方法可以获取键值的个数,所以只能用这种方法进行遍历
try:
i = 0
while1:
#EnumValue方法用来枚举键值,EnumKey用来枚举子键
name, value, type = _winreg.EnumValue(key, i)
print repr(name),
i +=1
except WindowsError:
print
#如果知道键的名称,也可以直接取值
value, type = _winreg.QueryValueEx(key, "EnableAutoTray")
2、创建与修改注册表项
import _winreg
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,r"Software\Microsoft\Windows\CurrentVersion\Explorer")
#删除键
_winreg.DeleteKey(key, "Advanced")
#删除键值
_winreg.DeleteValue(key, "IconUnderline")
#创建新的键
newKey = _winreg.CreateKey(key,"MyNewkey")
#给新创建的键添加键值
_winreg.SetValue(newKey,"ValueName",0,"ValueContent")
3、访问远程计算机注册表
#第二参数必须是HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等预先定义好的值,拿到返回的key后就可以进行操作了
key = _winreg.ConnectRegisty("IP地址或者机器名",_winreg.HKEY_CURRENT_USER)
win32api模块简介
4、使用win32api模块
win32api模块提供的函数与_winreg类似,通常以“Reg”为前缀,基本调用方式一致,此处不再赘述具体示例代码。
32位Python在64位系统下的重定向问题
在常规应用场景中,使用_winreg模块已足够。然而,当32位Python解释器运行于64位Windows操作系统时,会遭遇注册表重定向问题。由于系统机制限制,32位程序无法直接访问64位应用程序的注册表路径。该问题在Python2.6及更早版本中未得到解决,直到Python2.7通过补丁修复(参考http://bugs.python.org/issue7347)。
_winreg重定向缺陷演示
以下示例演示该问题:假设操作系统为64位,且安装了32位Python,执行如下代码:
import _winreg
key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,r"Software\Microsoft\Windows")
newKey = _winreg.CreateKey(key,"MyNewkey")
上述代码的执行结果并不会如预期那样创建目标键:
“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows”
而是会创建如下路径的键:
“HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows”
在64位Windows系统中,64位与32位应用程序的注册表是隔离的。32位程序对注册表的读写操作会被自动重定向至Wow6432Node节点下,而64位程序则不受影响。因此,若32位应用程序需要访问原本属于64位程序的注册表路径,便会遇到障碍。鉴于_winreg模块在此场景下的支持不足及封装Bug,建议改用win32api模块。
使用win32api绕过重定向
利用win32api提供的接口,修改上述代码如下:
import win32api
import win32con
key = win32api.RegCreateKeyEx(win32con.HKEY_LOCAL_MACHINE, r"Software\Microsoft\Windows", win32con.WRITE_OWNER |win32con.KEY_WOW64_64KEY|win32con.KEY_ALL_ACCESS)
win32api.RegSetValueEx (key,"MyNewkey", 0, win32con.REG_SZ, keyValue)
代码中win32con.KEY_WOW64_64KEY参数的含义是直接访问64位注册表视图,禁止系统重定向。默认情况下,该参数为win32con.KEY_WOW64_32KEY。
如需了解更多Python文件、目录、数据结构、函数及字符串操作技巧,可参阅本站相关专题:《Python文件与目录操作技巧汇总》、《Python文本文件操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》。
希望上述内容对您的Python编程实践有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













