操作Windows注册表的简单的Python程序制作教程


Posted in Python onApril 07, 2015

通过Python操作注册表有两种方式,第一种是通过Python的内置模块 _winreg;另一种方式就是Win32 Extension For Python 的win32api模块,但是需要进行额外的安装。这里主要给出一些_winreg和win32api的Demo代码。

 

1、 _winrg

可以参考官方的参考文档:

http://docs.python.org/library/_winreg.html

http://www.python.org/doc/2.6.2/library/_winreg.html

 

1.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")

1.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")

1.3 访问远程注册表
 
1 #第二参数必须是HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等预先定义好的值,拿到返回的key后就可以进行操作了
2 key = _winreg.ConnectRegisty("IP地址或者机器名",_winreg.HKEY_CURRENT_USER)

2、 win32api

win32api 和 _winreg 的方法很类似,一般是多了一个前缀"Reg",使用方法很基本上一样,这里就不给具体的Demo代码了。

就一般的应用来说,使用_winreg就足够了,但是_winreg有一个问题,如果Python是32位的,并且是运行在64位的操作系统上时就会有一点小问题,由于操作系统会进行注册表的重定向,32位的程序无法访问64位应用程序的注册表。在Python2.6以前这个问题都没有解决,在Python2.7中通过补丁的形式修正了这个问题(http://bugs.python.org/issue7347)。

通过例子来说明一下这个问题,假设我们的操作系统是64位的,然后在上面安装了32位的Python,看如下的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本身的问题,它对这种情况的支持不太充分,对windows api的封装有一些bug,这个时候就需要用到 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 相关文章推荐
详解Django通用视图中的函数包装
Jul 21 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
使用python+whoosh实现全文检索
Dec 09 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
Pytest单元测试框架如何实现参数化
Sep 05 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
如何用python实现一个HTTP连接池
Jan 14 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 Python
编写简单的Python程序来判断文本的语种
Apr 07 #Python
Python实现在线程里运行scrapy的方法
Apr 07 #Python
Python实现从脚本里运行scrapy的方法
Apr 07 #Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 #Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 #Python
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 #Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 #Python
You might like
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
thinkPHP5.0框架安装教程
2017/03/25 PHP
js表数据排序 sort table data
2009/02/18 Javascript
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
Vue实现购物车功能
2017/04/27 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
施工员岗位职责
2014/03/16 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
Python list列表删除元素的4种方法
2021/11/01 Python