欢迎访问宙启技术站
智能推送

Python编程实现REG_DWORD键值的批量读取和修改

发布时间:2023-12-31 15:40:48

在Python中,可以使用winreg模块来实现对Windows注册表中REG_DWORD键值的批量读取和修改。下面是一个使用例子,共包含了四个功能:读取键值、修改键值、批量读取键值和批量修改键值。

首先,需要导入winreg模块:

import winreg

然后,通过winreg.ConnectRegistry函数连接到注册表,并选择要操作的注册表项:

reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
key_path = r"Software\Microsoft\Windows\CurrentVersion"
key = winreg.OpenKey(reg, key_path, 0, winreg.KEY_ALL_ACCESS)

接下来,可以实现具体的功能。

1. 读取键值

def read_dword_value(key, value_name):
    try:
        value, _ = winreg.QueryValueEx(key, value_name)
        print("键值{}的值为:{}".format(value_name, value))
    except FileNotFoundError:
        print("键值{}不存在".format(value_name))

使用winreg.QueryValueEx函数来读取指定键值的值。value是键值的值,_是键值的类型(我们只关心值,类型可忽略)。

2. 修改键值

def modify_dword_value(key, value_name, new_value):
    try:
        winreg.SetValueEx(key, value_name, 0, winreg.REG_DWORD, new_value)
        print("键值{}已修改为{}".format(value_name, new_value))
    except Exception as e:
        print("修改键值{}失败: {}".format(value_name, str(e)))

使用winreg.SetValueEx函数来修改指定键值的值。new_value是要修改的新值。

3. 批量读取键值

def read_dword_values(key):
    num_values = winreg.QueryInfoKey(key)[1]
    print("共有{}个键值".format(num_values))

    for i in range(num_values):
        value_name, value, _ = winreg.EnumValue(key, i)
        if _ == winreg.REG_DWORD:
            print("键值{}的值为:{}".format(value_name, value))

使用winreg.QueryInfoKey函数获取键值的个数,然后使用winreg.EnumValue函数遍历每个键值。value_name是键值的名称,value是键值的值,_是键值的类型。通过判断类型为winreg.REG_DWORD,筛选出REG_DWORD类型的键值进行打印。

4. 批量修改键值

def modify_dword_values(key, new_value):
    num_values = winreg.QueryInfoKey(key)[1]
    print("共有{}个键值".format(num_values))

    for i in range(num_values):
        value_name, _, _ = winreg.EnumValue(key, i)
        try:
            winreg.SetValueEx(key, value_name, 0, winreg.REG_DWORD, new_value)
            print("键值{}已修改为{}".format(value_name, new_value))
        except Exception as e:
            print("修改键值{}失败: {}".format(value_name, str(e)))

同样使用winreg.QueryInfoKey函数获取键值的个数,然后使用winreg.EnumValue函数遍历每个键值。通过winreg.SetValueEx函数修改键值的值。

最后,记得关闭注册表:

winreg.CloseKey(key)
winreg.CloseKey(reg)

完整的代码如下:

import winreg

def read_dword_value(key, value_name):
    try:
        value, _ = winreg.QueryValueEx(key, value_name)
        print("键值{}的值为:{}".format(value_name, value))
    except FileNotFoundError:
        print("键值{}不存在".format(value_name))

def modify_dword_value(key, value_name, new_value):
    try:
        winreg.SetValueEx(key, value_name, 0, winreg.REG_DWORD, new_value)
        print("键值{}已修改为{}".format(value_name, new_value))
    except Exception as e:
        print("修改键值{}失败: {}".format(value_name, str(e)))

def read_dword_values(key):
    num_values = winreg.QueryInfoKey(key)[1]
    print("共有{}个键值".format(num_values))

    for i in range(num_values):
        value_name, value, _ = winreg.EnumValue(key, i)
        if _ == winreg.REG_DWORD:
            print("键值{}的值为:{}".format(value_name, value))

def modify_dword_values(key, new_value):
    num_values = winreg.QueryInfoKey(key)[1]
    print("共有{}个键值".format(num_values))

    for i in range(num_values):
        value_name, _, _ = winreg.EnumValue(key, i)
        try:
            winreg.SetValueEx(key, value_name, 0, winreg.REG_DWORD, new_value)
            print("键值{}已修改为{}".format(value_name, new_value))
        except Exception as e:
            print("修改键值{}失败: {}".format(value_name, str(e)))

# 连接到注册表
reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
key_path = r"Software\Microsoft\Windows\CurrentVersion"

# 打开注册表项
key = winreg.OpenKey(reg, key_path, 0, winreg.KEY_ALL_ACCESS)

# 功能1:读取键值
read_dword_value(key, "键值名称")

# 功能2:修改键值
modify_dword_value(key, "键值名称", 100)

# 功能3:批量读取键值
read_dword_values(key)

# 功能4:批量修改键值
modify_dword_values(key, 200)

# 关闭注册表和注册表项
winreg.CloseKey(key)
winreg.CloseKey(reg)

注意:在实际使用时,请谨慎操作注册表,避免对系统造成不可逆的损坏。