Python实现操纵控制windows注册表的方法分析


Posted in Python onMay 24, 2019

本文实例讲述了Python实现操纵控制windows注册表的方法。分享给大家供大家参考,具体如下:

使用_winreg模块的话

基本概念:

  • KEY 键
  • Value 值

函数和作用:

CloseKey() - 关闭一个Key
ConnectRegistry() - 链接到其他机器的注册表
CreateKey() - 创建一个Key
DeleteKey() - 删除一个Key
DeleteValue() - 删除一个Key里面的值(value)
EnumKey() - 为已经打开的Key里面的子键建立索引
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)

4、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程序设计有所帮助。

Python 相关文章推荐
Python写的贪吃蛇游戏例子
Jun 16 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
python 二分查找和快速排序实例详解
Oct 13 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
python中int与str互转方法
Jul 02 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
Python使用ElementTree美化XML格式的操作
Mar 06 Python
python zip()函数的使用示例
Sep 23 Python
Python jieba库分词模式实例用法
Jan 13 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 #Python
Django框架中间件(Middleware)用法实例分析
May 24 #Python
python与字符编码问题
May 24 #Python
Python读取stdin方法实例
May 24 #Python
python实践项目之监控当前联网状态详情
May 23 #Python
了解不常见但是实用的Python技巧
May 23 #Python
python远程邮件控制电脑升级版
May 23 #Python
You might like
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
php中static 静态变量和普通变量的区别
2016/12/01 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
php命令行模式代码实例详解
2021/02/26 PHP
PHP 实现重载
2021/03/09 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
Antd中单个DatePicker限定时间输入范围操作
2020/10/29 Javascript
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
大学生军训感想
2014/02/16 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
民事赔偿协议书
2014/11/02 职场文书
入党政审材料范文
2014/12/24 职场文书
酒店前台辞职书
2015/02/26 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
女性健康讲座主持词
2015/07/04 职场文书
网络研修随笔感言
2015/11/18 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
详解Flask开发技巧之异常处理
2021/06/15 Python
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
PostgreSQL之连接失败的问题及解决
2023/05/08 PostgreSQL