使用Python(winreg)访问Windows注册表

2025 年 1 月 4 日 | 阅读 6 分钟

Windows 注册表

Windows 注册表(Registry)包含一些主要根键,每个根键都包含子键和值。基本根键如下:

  • HKEY_CLASSES_ROOT (HKCR):有关已注册应用程序、文件关联和 COM 对象的信息。
  • HKEY_CURRENT_USER (HKCU):当前登录用户的配置信息。
  • HKEY_LOCAL_MACHINE (HKLM):本地计算机的配置信息,包括硬件和软件设置。
  • HKEY_USERS (HKU):关于 PC 上所有用户配置文件的信息。
  • HKEY_CURRENT_CONFIG (HKCC):本地计算机的硬件配置配置文件。

每个键都可以包含子键和值。值可以是多种类型,包括字符串、双精度数据和 DWORD(32 位整数)。

Windows Registry Access Using Python (winreg)

winreg 模块简介

winreg 模块(在 Python 2 中曾称为 _winreg)允许您与 Windows 注册表进行交互。以下是 winreg 提供的主要功能的概述:

  • winreg.OpenKey:打开一个现有的键。
  • winreg.CreateKey:创建新键或打开现有键。
  • winreg.QueryValueEx:检索与指定名称相关联的值。
  • winreg.SetValueEx:将数据存储在指定的注册表值字段中。
  • winreg.DeleteValue:从注册表键中删除指定的名称值。
  • winreg.DeleteKey:删除指定的注册表键。
Windows Registry Access Using Python (winreg)

打开注册表键

要对注册表键执行任何操作,您首先需要打开它。winreg.OpenKey 函数用于此目的。

在此示例中,我们在 HKEY_CURRENT_USER 下打开 MySoftware 键。字符串前的 r 表示原始字符串,确保反斜杠被字面处理。

读取值

要从打开的注册表键读取值,请使用 winreg.QueryValueEx 函数。

输出

 
The value is: 1   

在这里,我们查询 MySoftware 键下名为 MyValue 的值。该函数返回一个元组,其中包含值和存储在注册表中的数据的类型。

写入值

要向注册表键写入值,请使用 winreg.SetValueEx 函数。

在此示例中,我们以写入权限 (winreg.KEY_SET_VALUE) 打开 MySoftware 键,然后将 MyValue 的值设置为 NewValue。winreg.REG_SZ 参数表示该值是字符串。

创建新键

要创建新键,请使用 winreg.CreateKey 函数。

此脚本在 HKEY_CURRENT_USER 下创建名为 MyNewSoftware 的新键,并设置一个名为 MyValue 的值。

删除值

要从注册表键中删除值,请使用 winreg.DeleteValue 函数。

在这里,我们删除 MySoftware 键下名为 MyValue 的值。

删除键

要删除注册表键,请使用 winreg.DeleteKey 函数。

此脚本删除 MyNewSoftware 键。请注意,该键必须为空(即,不包含任何子键或值)才能被删除。

实际示例和用例

让我们看一些使用 Python 控制 Windows 注册表的实际示例和用例。

示例 1:检查软件安装情况

假设您需要通过查找其注册表项来检查特定软件是否已安装在系统中。

输出

 
Some Software is installed.   

此函数检查 Uninstall 注册表项,以确定预定的软件是否已列出。

说明

该示例使用 winreg 模块与 Windows 注册表进行交互,特别是检查软件是否已安装在系统中。它定义了一个名为 is_software_installed 的函数,该函数以软件名称作为输入。在该函数中,它尝试打开注册表中的 Uninstall 键,软件项通常存储在该位置。通过遍历此键下的子键并检查其 DisplayName 值,它确定是否找到预定的软件。

最后,它根据函数的返回值打印一条消息,指示软件是否已安装。此方法提供了一种直接从 Windows 注册表查询软件安装状态的清晰方法。

示例 2:将应用程序添加到启动项

要将应用程序添加到系统启动项,您可以在 Run 键下创建一个注册表项。

输出

 
Chrome added to startup   

说明

该示例使用 winreg 模块将应用程序添加到系统启动项。它定义了一个名为 add_to_startup 的函数,该函数以应用程序名称及其完整路径作为参数。在该函数中,它访问当前用户注册表配置单元下的 Run 键。然后,它使用 winreg.SetValueEx 设置一个注册表值,其名称和路径与提供的应用程序名称和路径相匹配,从而有效地指示 Windows 在启动时启动该应用程序。成功添加项后,它会关闭注册表键。最后,它打印一条确认消息,表明该应用程序已添加到启动项。此方法提供了一种通过注册表控制来自动化 Windows 系统上应用程序启动行为的直接方法。

此脚本将应用程序添加到启动列表,以便在用户登录时自动运行。

示例 3:读取系统信息

您可以使用注册表读取系统信息,例如 Windows 版本。

此函数从注册表中检索并打印 Windows 版本信息。

处理注册表权限

在操作注册表时,您可能会遇到权限问题。某些注册表键受到保护,需要提升的权限(管理员权限)才能修改。您可以通过捕获异常并通知用户来处理这些问题。

在此示例中,我们捕获 PermissionError 异常,并在操作因权限不足而失败时打印一条消息。

高级注册表操作

枚举子键和值

您可以使用 winreg.EnumKey 和 winreg.EnumValue 来枚举键内的子键和值。

此函数列出指定注册表键下的所有子键和值。

修改二进制和 DWORD 值

winreg 模块支持多种值类型,包括二进制 (winreg.REG_BINARY) 和 DWORD (winreg.REG_DWORD)。以下是读取和写入这些类型值的方法。

结论

该主题展示了一种使用 Python 和 winreg 模块将应用程序添加到 Windows 系统启动项的清晰方法。通过访问 Windows 注册表中的 Run 键,脚本设置了一个具有应用程序名称和路径的注册表值,确保在用户登录时自动启动指定的应用程序。此方法提供了一种方便的方式来定制系统启动行为,允许用户通过自动化常用应用程序的启动来简化工作流程。然而,在对 Windows 注册表进行更改时,务必谨慎行事,因为不正确的修改可能会影响系统稳定性。总而言之,此脚本提供了一种简单而有效的方法来自动化管理 Windows 系统上的启动应用程序。