在Windows系统中,注册表本质上就是一个数据库,其中存放着硬件、软件、用户、操作系统以及程序相关设置信息。我们除了使用Windows系统自带的regedit程序,也可以通过Python编程读取并操作系统注册表。
键(主键、项)key
:相当于文件夹
子键(子项)sub_key
:相当于子文件夹
值value
:相当于文件,包括类型(相当于文件类型:type)、数据(相当于文件内容data)
如下图:
常见的注册表值的数据类型一共有4种:
语法:
key = winreg.OpenKey(key, sub_key[, res[, sam]])
winreg.CloseKey(key)
import winreg
from icecream import ic
HKCU = winreg.HKEY_CURRENT_USER
for subkey in ['test', 'test2', 'test3']:
try:
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey) # 只读
if key:
winreg.CloseKey(key)
else:
ic(key)
except FileNotFoundError:
ic(f'找不到键:{subkey}')
写入打开
import winreg
mainkey = winreg.HKEY_CURRENT_USER
sub_key = r'Software\Microsoft\Internet Explorer\Main'
key = winreg.OpenKey(mainkey, subkey, 0, winreg.KEY_WRITE)
创建键就是在key下创建一个subkey,返回值指向subkey
语法:subkey = winreg.CreateKey(key,sub_key)
删除键就是删除指定的键的子健
语法:winreg.DeleteKey(key,sub_key)
import winreg
from icecream import ic
HKCU = winreg.HKEY_CURRENT_USER
sub_key1 = winreg.CreateKey(HKCU, 'test')
sub_key2 = winreg.CreateKey(HKCU, r'test2\t2') # 连续创建键
ic(sub_key2)
sub_key3 = winreg.CreateKey(HKCU, 'test2')
winreg.DeleteKey(sub_key3, 't2')
说明:
1、已存在键后,再创建键不会报错。
2、若要删除的键存在子健,则无法删除。
import winreg
from icecream import ic
HKCU = winreg.HKEY_CURRENT_USER
all_subkey = []
key = winreg.OpenKey(HKCU, 'System') # 只能以只读形式打开,否则会报错
try:
step = 0
while True:
all_subkey.append(winreg.EnumKey(key, step))
step += 1
except WindowsError:
ic('已获取全部子健!')
except Exception as err:
ic('发生错误,错误原因:{}'.format(err))
finally:
if key:
winreg.CloseKey(key)
ic(all_subkey)
15:12:08|> ‘已获取全部子健!’
15:12:08|> all_subkey: [‘CurrentControlSet’, ‘GameConfigStore’]
注意:
1、只能获取到目标键的子健,无法获取更下一层的键。
from icecream import ic
import winreg
HKCU = winreg.HKEY_CURRENT_USER
subkey = r'SOFTWARE\360FileBrowser'
key = winreg.OpenKey(HKCU, subkey)
ic(winreg.QueryInfoKey(key)) # 第一个为键的子健数,第二个为键的值数
16:20:28|> winreg.QueryInfoKey(key): (3, 7, 133383550399900567)
from icecream import ic
import winreg
HKCU = winreg.HKEY_CURRENT_USER
subkey = r'SOFTWARE\360FileBrowser'
key = winreg.OpenKey(HKCU, subkey)
try:
j = 0
while True:
# EnumValue方法用来枚举子健下面的值项,EnumKey用来枚举子键
value, data, typeNo = winreg.EnumValue(key, j)
ic(value, data, typeNo)
j += 1
except WindowsError as e:
ic(e)
# 记得关闭key
if key:
winreg.CloseKey(key)
ic('关闭键成功')
16:15:15|> value: ‘guide’, data: 1, typeNo: 4
16:15:16|> value: ‘dot’, data: 0, typeNo: 4
16:15:16|> value: ‘maximize’, data: 1, typeNo: 4
16:15:16|> value: ‘wnd_left’, data: 4294965696, typeNo: 4
16:15:16|> value: ‘wnd_top’, data: 0, typeNo: 4
16:15:16|> value: ‘wnd_right’, data: 0, typeNo: 4
16:15:16|> value: ‘wnd_bottom’, data: 860, typeNo: 4
16:15:16|> e: OSError(22, ‘没有可用的数据了。’, None, 259, None)
16:15:16|> ‘关闭键成功’
from icecream import ic
import winreg
HKCU = winreg.HKEY_CURRENT_USER
subkey = r'Software\Microsoft\Internet Explorer\Main'
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey)
value = "UseClearType"
data, type_no = winreg.QueryValueEx(key, value)
ic(data, type_no)
16:29:24|> data: ‘no’, type_no: 1
import winreg
HKCU = winreg.HKEY_CURRENT_USER
subkey = r'test'
Key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey, 0, winreg.KEY_WRITE)
# 字符串格式(REG_SZ)修改:
winreg.SetValueEx(Key, "zifuchuan", 0, winreg.REG_SZ, 'zfc') # 将`Key`下的`zifuchuan`值的数据修改为'zfc'
# 十六进制格式修改(REG_DWORD)
winreg.SetValueEx(Key, 'shiliujinzhi', 0, winreg.REG_DWORD, 0x00000001) # 将`Key`下的`shiliujinzhi`值的数据修改为'0x00000001'
# 二进制格式修改(REG_BINARY)
jrx = b'abc'
winreg.SetValueEx(Key, 'erjinzhi', 0, winreg.REG_BINARY, jrx) # 将`Key`下的`erjinzhi`值的数据修改为b'abc'
import winreg
from icecream import ic
HKCU = winreg.HKEY_CURRENT_USER
key = winreg.OpenKey(HKCU, r'test2\t2', 0, winreg.KEY_WRITE)
ic(winreg.DeleteValue(key, '新值'))
15:52:39|> winreg.DeleteValue(key, ‘新值’): None