python操作Windows注册表的常见库有两个,一个是python内置库winreg,另外一个是第三方库pywin32,两者操作Windows注册表均有缺陷,前者创建注册表项目时出现权限错误,后者在删除注册表项的值时发生错误,所以要想实现操作Windows注册表功能,必须将两者结合起来使用,使用过程中以pywin32为主。
winreg创建注册表项目时出现权限错误,代码及错误如下:
import winreg
# 定义要创建的注册表项路径
key_path = r"SOFTWARE\MyApp112"
# 打开或创建指定的注册表项
key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, key_path)
# 关闭注册表项
winreg.CloseKey(key)
弹出的错误:
pywin32删除注册表项的值时发生错误
代码:
1.删除注册项的值
经验证可以成功运行的原始代码:
import win32api,win32con
# 定义要操作的注册表键路径和值名称
key_path = r"TestKey1"
value_name = "TestValue"
# HKEY_CURRENT_USER\TestKey1
# 打开注册表键
try:
hkey = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, key_path, 0, win32con.KEY_ALL_ACCESS)
except Exception as e:
print("无法打开注册表键:", e)
exit()
# 删除值
try:
win32api.RegDeleteValue(hkey, value_name)
print("值已成功删除")
except Exception as e:
print("删除值时出错:", e)
# 关闭注册表键
win32api.RegCloseKey(hkey)
一、winreg
winreg.OpenKey是winreg模块中的一个函数,用于打开指定的注册表项并返回一个句柄。
函数的语法如下:
winreg.OpenKey(key, sub_key, res, sam)
参数说明:
key:指定要打开的注册表根键(如winreg.HKEY_CURRENT_USER、winreg.HKEY_LOCAL_MACHINE等)。
sub_key:指定要打开的注册表项的路径。
res:保留参数,传入0即可。
sam:指定打开注册表项的访问权限,可以使用winreg.KEY_READ(只读权限)、winreg.KEY_WRITE(写权限)等常量。
2.创建注册表项
创建注册表项方法:winreg.CreateKey,语法如下:
winreg.CreateKey(key, sub_key)
key
:表示要操作的注册表根键(如winreg.HKEY_CURRENT_USER
等)。sub_key
:表示要创建的子键路径。
资料来源:
python 管理员权限权限操作注册表 HKEY_CLASSES_ROOT_mob649e816594b7的技术博客_51CTO博客
二、有用的资料
python winreg 判断 注册表是否存在_mob64ca12edad02的技术博客_51CTO博客
python winreg返回_mob649e815f0f18的技术博客_51CTO博客
winreg --- Windows 注册表访问 — Python 3.12.5 文档
二、pywin32
注册表相对路径的书写格式:
sub_key=r'AppEvents\EventLabels\.Default',name='DispFileName'
1.打开注册表
对注册表进行操作前,必须打开注册表。在Python中,可以使用以下两个函数:RegOpenKey和RegOpenKeyEx。其函数原型分别如下所示。
在 Python 的 pywin32
库中,RegOpenKey
和 RegOpenKeyEx
有以下一些区别:
参数不同:RegOpenKeyEx
比 RegOpenKey
多了一些参数,例如可以指定访问权限等。
功能扩展:RegOpenKeyEx
提供了更灵活的功能和选项,可以满足一些更复杂的需求。
以下是 RegOpenKey
和 RegOpenKeyEx
的常见参数:
RegOpenKey
参数:
hKey
:要打开的根键(如win32con.HKEY_LOCAL_MACHINE
等)。lpSubKey
:要打开的子键路径。
RegOpenKeyEx
参数:
hKey
:根键。lpSubKey
:子键路径。ulOptions
:操作选项(通常为 0)。samDesired
:访问权限(如win32con.KEY_READ
等)。
win32api.RegCreateKey(win32con.HKEY_CURRENT_USER, r'bai985')
2.关闭注册表
pywin32,一个超实用的Python库 - 知乎 (zhihu.com)
使用Python操作注册表_python win32api.regopenkey-CSDN博客
python 使用win32api操作注册表_python 修改注册表 api-CSDN博客
测试成功的pywin32的全部代码:
import win32api
import win32con
import winreg
name=win32api.GetComputerName()
print(name)
v=win32api.GetVersion()
print(v)
def OpenKeyItem(key,sub_key):
key = win32api.RegOpenKey(key, sub_key)
print(key,type(key))
def CreateKeyItem(key,sub_key): # 创建注册表项
key=win32api.RegCreateKey(key, sub_key)
print(key,type(key))
'''
win32api.RegCreateKeyEx() 未测试成功,总是遇到报错信息:
AttributeError: module 'win32con' has no attribute 'REG_OPTION_NON_VOLATILE'
'''
def DeleteKeyItem(key,sub_key): # 删除注册表项
win32api.RegDeleteKey(key, sub_key)
# OpenKeyItem(key=win32con.HKEY_CURRENT_USER,sub_key=r'bai985')
# CreateKeyItem(key=win32con.HKEY_CURRENT_USER,sub_key=r'baihe985')
# DeleteKeyItem(key=win32con.HKEY_CURRENT_USER,sub_key=r'baihe985')
def QueryKeyValue(key,sub_key,name=None): # 查询注册表的值
key = win32api.RegOpenKey(key, sub_key)
value, type = win32api.RegQueryValueEx(key, name)
print(value,type)
'''
win32api.RegQueryValueEx 的参数用法如下:
hKey:要查询的根键。
lpValueName:要查询的值的名称。如果没有指定具体的 lpValueName 参数,它将查询子键的默认值。
lpReserved:保留参数,通常为 0。
lpType:用于接收值的数据类型。
lpData:用于接收值的数据。
lpcbData:用于接收值的数据长度。
'''
# QueryKeyValue(key=win32con.HKEY_CURRENT_USER,sub_key=r'AppEvents\EventLabels\.Default',name='DispFileName')
def SetKeyValue(key,ValueName=None,ValueType=win32con.REG_SZ,Value=''):
reg_path = r'TestKey1'
# 创建注册表键
# 要创建的值的名称和数据
value_name = 'TestValue'
value_data = 'Hello, Registry!'
# 设置注册表值
win32api.RegSetValueEx(key,ValueName,0,ValueType,Value)
'''
win32api.RegSetValueEx 的参数如下:
hKey:要操作的根键。
lpValueName:值的名称,是一个注册表项对象。如果没有指定具体的 lpValueName 参数,它将查询子键的默认值
reserved:保留参数,通常为 0。
dwType:值的数据类型,参数值有以下几种:
win32con.REG_SZ:字符串类型。
win32con.REG_DWORD:双字(32 位整数)类型。
win32con.REG_BINARY:二进制类型。
win32con.REG_EXPAND_SZ:可扩展字符串类型。
win32con.REG_MULTI_SZ:多字符串类型。
lpData:值的数据。
'''
print(f'注册表键 {reg_path} 和值 {value_name} 已创建。')
key = win32api.RegCreateKey(win32con.HKEY_CURRENT_USER, r'TestKey1')
# SetKeyValue(key=key,ValueName='TestValue2',ValueType=win32con.REG_SZ,Value='Hello, World!')
SetKeyValue(key=key,Value='Hello, World!')
# HKEY_CURRENT_USER\AppEvents\EventLabels\.Default
def DeleteKeyValue_winreg(winreg_key, winreg_key_path, winreg_value_name):
key = winreg.OpenKey(winreg_key, winreg_key_path, 0, winreg.KEY_WRITE)
winreg.DeleteValue(key, winreg_value_name)
'''
使用pywin32删除注册表的值报错,因为没有权限,但是可以用winreg库实现该功能。
'''
# DeleteKeyValue(winreg_key=winreg.HKEY_CURRENT_USER,winreg_key_path=r"TestKey1",winreg_value_name="TestValue2")
def DeleteKeyValue(key,sub_key,value_name):
hkey = win32api.RegOpenKey(key, sub_key, 0, win32con.KEY_ALL_ACCESS)
win32api.RegDeleteValue(hkey, value_name)
pass
DeleteKeyValue(key=win32con.HKEY_CURRENT_USER,sub_key=r"TestKey1",value_name="TestValue")
注册表参数
Windows注册表的参数,比如: %* %0 %1 %2 %D %L %V %W_注册表用某个程序打开某个文件用什么参数-CSDN博客
解决缺乏windows权限的错误(经实测验证可行):
Python 使用winreg进行注册表操作时 报PermissionError 拒绝访问错误
在使用Python自带的winreg包进行OpenKey()方法时,会报错误:
这时我使用了网上给的方法,给注册表加用户权限、更改参数sam值、将python.exe程序添加用户权限,均失效,最后实测直接将IDE用管理员身份打开再运行代码即可。特此记录!