python winreg

1、python winreg是python的一个标准库,用来对windows注册表的操作。

2、何谓注册表

注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用。这些作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等。

3、注册表的数据结构

注册表由键(也叫主键或称“项”)、子键(子项)和值项构成。一个键就是分支中的一个文件夹,而子键就是这个文件夹当中的子文件夹,子键同样它也是一个键。一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。
在注册表编辑器(regedit.exe)中,数据结构显示如下,其中,command键是open键的子键,(默认)表示该值是默认值,值名称为空,其数据类型为REG_SZ,数据值为%systemroot%/system32/notepad.exe"%1数据类型。
注册表的数据类型主要有以下四种:显示类型(在编辑器中)数据类型说明
REG_SZ:字符串:文本字符串
REG_MULTI_SZ:多字符串值:含有多个文本值的字符串
REG_BINARY:二进制数:二进制值,以十六进制显示,
REG_DWORD:双字值;一个32位的二进制值,显示为8位的十六进制值。

4、注册表编辑器的打开方式

python winreg_第1张图片

5、常用的winreg应用函数

1)winreg.OpenKey

OpenKey获得句柄handle:

winreg.OpenKey(keysub_key[, res[, sam]])

python winreg_第2张图片

用捕获异常来遍历某个文件夹下面所有key

>>> 
>>> i = 0
>>> run = True
>>> while run:
	subkey = r'Control Panel\PowerCfg\PowerPolicies\{}'.format(i) # 可能有多个core,按照索引获取键
	try:
		key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey)
		print('open key success.')
	except WindowsError as e:
		run = False
		print(e)
	try:
		j = 0
		while True:
			# EnumValue方法用来枚举键值,EnumKey用来枚举子键
			name,value,typeNo = winreg.EnumValue(key, j)
			print (repr(name), value, typeNo)
			j += 1
	except WindowsError as e:
		print(e)
		# 记得关闭key
		if key:
			winreg.CloseKey(key)
			print('close key success.')
	i += 1

	
open key success.
'Name' Home/Office Desk 1
'Description' This scheme is suited to most home or desktop computers that are left plugged in all the time. 1
'Policies' b'\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x01\x00\x0022\x00\x03\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00,\x01\x00\x00\x00\x00\x00\x00X\x02\x00\x00\x01\x01dPdd\x00\x00' 3
[WinError 259] 没有可用的数据了。
close key success.
open key success.
'Name' Portable/Laptop 1
'Description' This scheme is designed for extended battery life for portable computers on the road. 1
'Policies' b'\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00,\x01\x00\x0022\x03\x03\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00,\x01\x00\x00\x08\x07\x00\x00,\x01\x00\x00\x01\x01dPdd\x00\x00' 3
[WinError 259] 没有可用的数据了。
close key success.
open key success.
'Name' Presentation 1
'Description' This scheme keeps the monitor on for doing presentations. 1
'Policies' b'\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x03\x00\x0022\x03\x02\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x01\x00\x00\x01\x01PPdd\x00\x00' 3
[WinError 259] 没有可用的数据了。
close key success.
open key success.
'Name' Always On 1
'Description' This scheme keeps the computer running so that it can be accessed from the network.  Use this scheme if you do not have network wakeup hardware. 1
'Policies' b'\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0022\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00\x84\x03\x00\x00\x00\x00\x00\x00\x08\x07\x00\x00\x00\x01dddd\x00\x00' 3
[WinError 259] 没有可用的数据了。
close key success.
open key success.
'Name' Minimal Power Management 1
'Description' This scheme keeps the computer on and optimizes it for high performance. 1
'Policies' b'\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x01\x00\x0022\x03\x03\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00,\x01\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x00\x01dddd\x00\x00' 3
[WinError 259] 没有可用的数据了。
close key success.
open key success.
'Name' Max Battery 1
'Description' This scheme is extremely aggressive for saving power. 1
'Policies' b'\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00x\x00\x00\x0022\x03\x02\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00<\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x01\x01d2dd\x00\x00' 3
[WinError 259] 没有可用的数据了。
close key success.
[WinError 2] 系统找不到指定的文件。
[WinError 6] 句柄无效。
>>> 

用先获取个数来遍历某个文件夹下面所有key:

>>> 
>>> key_one = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Control Panel\PowerCfg\PowerPolicies\0', 0, winreg.KEY_QUERY_VALUE)
>>> count_key = winreg.QueryInfoKey(key_one)[1]  # index 1获取个数
>>> key_list = []
>>> for i in range(count_key):
	name, key_value, value_type = winreg.EnumValue(key_one, i)
	key_list.append((name,key_value,value_type))

	
>>> print(key_list)
[('Name', 'Home/Office Desk', 1), ('Description', 'This scheme is suited to most home or desktop computers that are left plugged in all the time.', 1), ('Policies', b'\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x01\x00\x0022\x00\x03\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00,\x01\x00\x00\x00\x00\x00\x00X\x02\x00\x00\x01\x01dPdd\x00\x00', 3)]
>>> if key_one:
	winreg.CloseKey(key)
	print('close key success.')

	
close key success.
>>> 

2)winreg.CreateKey(key,sub_key) 在key下创建一个subkey,返回值指向subkey

>>> winreg.CreateKey(winreg.HKEY_CURRENT_USER,r'Control Panel\PowerCfg\PowerPolicies\test')

>>> 

python winreg_第3张图片

 

3、winreg.SetValueEx(key, value_name, reserved, type, value)

    Stores data in the value field of an open registry key.

    key is an already open key, or one of the predefined HKEY_* constants.

    value_name is a string that names the subkey with which the value is associated.

    type is an integer that specifies the type of the data. See Value Types for the available types.

    reserved can be anything – zero is always passed to the API.

    value is a string that specifies the new value.

    This method can also set additional value and type information for the specified key. The key identified by the key parameter must have been opened with KEY_SET_VALUE access.

    To open the key, use the CreateKey() or OpenKey() methods.

    Value lengths are limited by available memory. Long values (more than 2048 bytes) should be stored as files with the filenames stored in the configuration registry. This helps the registry perform efficiently.
 

>>> 
>>> key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Control Panel\PowerCfg\PowerPolicies\test', 0, winreg.KEY_SET_VALUE)
>>> winreg.SetValueEx(key, 'MyKeyName', 0, winreg.REG_SZ, 'MyKetValueHello')
>>> if key:
	winreg.CloseKey(key)
	print('close key success.')

	
close key success.
>>> 

python winreg_第4张图片

 

参考:https://docs.python.org/2/library/_winreg.html#bit-specific

你可能感兴趣的:(Python)