python 注册表

        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】Winreg模块的使用-CSDN博客

python操作注册表 - 知乎 (zhihu.com)

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 参数:

  1. hKey:要打开的根键(如 win32con.HKEY_LOCAL_MACHINE 等)。
  2. lpSubKey:要打开的子键路径。

RegOpenKeyEx 参数:

  1. hKey:根键。
  2. lpSubKey:子键路径。
  3. ulOptions:操作选项(通常为 0)。
  4. 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博客

文件和程序关联 (注册表) (360doc.com)

测试成功的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用管理员身份打开再运行代码即可。特此记录! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值