winreg — Windows 注册表访问


这些函数将 Windows 注册表 API 公开给 Python。不使用整数作为注册表句柄,而是使用句柄对象来确保正确关闭句柄,即使程序员疏忽忘记显式关闭句柄。

3.3 版中已更改: 此模块中的几个函数过去会引发WindowsError,现在是OSError的别名。

函数

此模块提供以下函数

winreg.CloseKey(hkey)

关闭先前打开的注册表项。hkey 参数指定先前打开的项。

注意

如果未使用此方法(或通过hkey.Close())关闭hkey,则在 Python 销毁hkey 对象时会将其关闭。

winreg.ConnectRegistry(computer_name, key)

建立与另一台计算机上预定义的注册表句柄的连接,并返回句柄对象

computer_name 是远程计算机的名称,格式为r"\\computername"。如果为None,则使用本地计算机。

key 是要连接到的预定义句柄。

返回值是打开密钥的句柄。如果函数失败,则会引发 OSError 异常。

引发 审核事件 winreg.ConnectRegistry,参数为 computer_namekey

版本 3.3 中已更改: 请参阅 上文

winreg.CreateKey(key, sub_key)

创建或打开指定密钥,返回 句柄对象

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

sub_key 是一个字符串,用于命名此方法打开或创建的密钥。

如果 key 是预定义密钥之一,则 sub_key 可以是 None。在这种情况下,返回的句柄与传递给函数的密钥句柄相同。

如果密钥已存在,此函数将打开现有密钥。

返回值是打开密钥的句柄。如果函数失败,则会引发 OSError 异常。

引发 审核事件 winreg.CreateKey,参数为 keysub_keyaccess

引发 审核事件 winreg.OpenKey/result,参数为 key

版本 3.3 中已更改: 请参阅 上文

winreg.CreateKeyEx(key, sub_key, reserved=0, access=KEY_WRITE)

创建或打开指定密钥,返回 句柄对象

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

sub_key 是一个字符串,用于命名此方法打开或创建的密钥。

reserved 是保留整数,必须为零。默认值为零。

access 是一个整数,用于指定描述密钥所需安全访问的访问掩码。默认值为 KEY_WRITE。有关其他允许值,请参阅 访问权限

如果 key 是预定义密钥之一,则 sub_key 可以是 None。在这种情况下,返回的句柄与传递给函数的密钥句柄相同。

如果密钥已存在,此函数将打开现有密钥。

返回值是打开密钥的句柄。如果函数失败,则会引发 OSError 异常。

引发 审核事件 winreg.CreateKey,参数为 keysub_keyaccess

引发 审核事件 winreg.OpenKey/result,参数为 key

在版本 3.2 中添加。

版本 3.3 中已更改: 请参阅 上文

winreg.DeleteKey(key, sub_key)

删除指定的密钥。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

sub_key 是一个字符串,必须是 key 参数标识的密钥的子密钥。此值不得为 None,并且密钥可能没有子密钥。

此方法无法删除具有子项的项。

如果方法成功,则会删除整个项,包括其所有值。如果方法失败,则会引发 OSError 异常。

引发 审核事件 winreg.DeleteKey,其参数为 keysub_keyaccess

版本 3.3 中已更改: 请参阅 上文

winreg.DeleteKeyEx(key, sub_key, access=KEY_WOW64_64KEY, reserved=0)

删除指定的密钥。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

sub_key 是一个字符串,必须是 key 参数标识的密钥的子密钥。此值不得为 None,并且密钥可能没有子密钥。

reserved 是保留整数,必须为零。默认值为零。

access 是指定访问掩码的整数,该掩码描述了对该项所需的安全性访问。默认值为 KEY_WOW64_64KEY。在 32 位 Windows 上,将忽略 WOW64 常量。有关其他允许的值,请参见 访问权限

此方法无法删除具有子项的项。

如果方法成功,则会删除整个项,包括其所有值。如果方法失败,则会引发 OSError 异常。

在不受支持的 Windows 版本上,将引发 NotImplementedError

引发 审核事件 winreg.DeleteKey,其参数为 keysub_keyaccess

在版本 3.2 中添加。

版本 3.3 中已更改: 请参阅 上文

winreg.DeleteValue(key, value)

从注册表项中删除一个已命名的值。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

value 是一个字符串,用于标识要删除的值。

引发 审核事件 winreg.DeleteValue,其参数为 keyvalue

winreg.EnumKey(key, index)

枚举打开的注册表项的子项,并返回一个字符串。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

index 是一个整数,用于标识要检索的项的索引。

该函数每次调用时都会检索一个子项的名称。通常会重复调用它,直到引发 OSError 异常,表示没有更多可用值。

引发 审核事件 winreg.EnumKey,其参数为 keyindex

版本 3.3 中已更改: 请参阅 上文

winreg.EnumValue(key, index)

枚举打开注册表项的值,返回一个元组。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

index 是一个整数,标识要检索的值的索引。

该函数每次调用时检索一个子项的名称。它通常被重复调用,直到引发 OSError 异常,表示没有更多值。

结果是一个包含 3 个项的元组

索引

含义

0

标识值名称的字符串

1

保存值数据且类型取决于底层注册表类型的对象

2

标识值数据类型的整数(请参阅 SetValueEx() 文档中的表格)

引发 审核事件 winreg.EnumValue,其参数为 keyindex

版本 3.3 中已更改: 请参阅 上文

winreg.ExpandEnvironmentStrings(str)

扩展字符串中类似 REG_EXPAND_SZ 的环境变量占位符 %NAME%

>>> ExpandEnvironmentStrings('%windir%')
'C:\\Windows'

引发 审核事件 winreg.ExpandEnvironmentStrings,其参数为 str

winreg.FlushKey(key)

将项的所有属性写入注册表。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

不必调用 FlushKey() 来更改密钥。注册表会使用其惰性刷新器将注册表更改刷新到磁盘。注册表更改也会在系统关闭时刷新到磁盘。与 CloseKey() 不同,FlushKey() 方法仅在所有数据写入注册表后才返回。如果应用程序需要绝对确定注册表更改已在磁盘上,则应仅调用 FlushKey()

注意

如果您不知道是否需要 FlushKey() 调用,则可能不需要。

winreg.LoadKey(key, sub_key, file_name)

在指定密钥下创建一个子密钥,并将指定文件中的注册信息存储到该子密钥中。

key 是由 ConnectRegistry() 返回的句柄,或常量 HKEY_USERSHKEY_LOCAL_MACHINE 之一。

sub_key 是标识要加载的子密钥的字符串。

file_name 是要从中加载注册表数据的的文件的名称。此文件必须使用 SaveKey() 函数创建。在文件分配表 (FAT) 文件系统下,文件名可能没有扩展名。

如果调用进程没有 SE_RESTORE_PRIVILEGE 权限,则对 LoadKey() 的调用将失败。请注意,权限不同于许可 - 有关更多详细信息,请参阅 RegLoadKey 文档

如果 key 是由 ConnectRegistry() 返回的句柄,则 file_name 中指定路径相对于远程计算机。

引发 审计事件 winreg.LoadKey,参数为 keysub_keyfile_name

winreg.OpenKey(key, sub_key, reserved=0, access=KEY_READ)
winreg.OpenKeyEx(key, sub_key, reserved=0, access=KEY_READ)

打开指定键,返回句柄对象

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

sub_key 是标识要打开的子键的字符串。

reserved 是保留整数,必须为零。默认值为零。

access 是指定访问掩码的整数,该掩码描述了对键的所需安全访问。默认值为 KEY_READ。有关其他允许值,请参见访问权限

结果是指定键的新句柄。

如果函数失败,则会引发OSError

引发审核事件 winreg.OpenKey,其参数为 keysub_keyaccess

引发 审核事件 winreg.OpenKey/result,参数为 key

在版本 3.2 中更改:允许使用命名参数。

版本 3.3 中已更改: 请参阅 上文

winreg.QueryInfoKey(key)

以元组形式返回有关键的信息。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

结果是一个包含 3 个项的元组

索引

含义

0

一个整数,给出此键拥有的子键数。

1

一个整数,给出此键拥有的值数。

2

一个整数,给出键上次修改的时间(如果可用),单位为自 1601 年 1 月 1 日起以来的 100 纳秒。

引发审核事件 winreg.QueryInfoKey,其参数为 key

winreg.QueryValue(key, sub_key)

以字符串形式检索键的未命名值。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

sub_key 是一个字符串,其中包含与该值关联的子键的名称。如果此参数为 None 或为空,则该函数将检索 SetValue() 方法为 key 标识的键设置的值。

注册表中的值具有名称、类型和数据组件。此方法检索名称为 NULL 的键的第一个值的 data。但基础 API 调用不会返回类型,因此如果可能,请始终使用 QueryValueEx()

引发 审计事件 winreg.QueryValue,带有参数 keysub_keyvalue_name

winreg.QueryValueEx(key, value_name)

检索与打开的注册表键关联的指定值名称的类型和数据。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

value_name 是一个字符串,表示要查询的值。

结果是 2 个项目的元组

索引

含义

0

注册表项的值。

1

一个整数,给出此值的注册表类型(请参阅 SetValueEx() 文档中的表格)

引发 审计事件 winreg.QueryValue,带有参数 keysub_keyvalue_name

winreg.SaveKey(key, file_name)

将指定的键及其所有子键保存到指定的文件中。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

file_name 是要将注册表数据保存到的文件名。此文件不能已存在。如果此文件名包含扩展名,则 LoadKey() 方法无法在文件分配表 (FAT) 文件系统上使用它。

如果 key 表示远程计算机上的键,则 file_name 描述的路径相对于远程计算机。此方法的调用者必须拥有 SeBackupPrivilege 安全特权。请注意,特权不同于权限 - 有关更多详细信息,请参阅 用户权限和权限之间的冲突文档

此函数将 NULL 传递给 API 的 security_attributes

引发 审计事件 winreg.SaveKey,其参数为 keyfile_name

winreg.SetValue(key, sub_key, type, value)

将一个值与指定键关联。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

sub_key 是一个字符串,用于命名与该值关联的子键。

type 是一个整数,用于指定数据的类型。目前,这必须是 REG_SZ,这意味着仅支持字符串。对于其他数据类型,请使用 SetValueEx() 函数。

value 是一个字符串,用于指定新值。

如果由 sub_key 参数指定的键不存在,则 SetValue 函数会创建该键。

值长度受可用内存的限制。较长的值(超过 2048 个字节)应存储为文件,并将文件名存储在配置注册表中。这有助于注册表高效运行。

key 参数标识的键必须使用 KEY_SET_VALUE 访问权限打开。

引发 审计事件 winreg.SetValue,其参数为 keysub_keytypevalue

winreg.SetValueEx(key, value_name, reserved, type, value)

将数据存储在打开的注册表键的值字段中。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

value_name 是一个字符串,用于命名与该值关联的子键。

reserved 可以是任何内容 - 始终将零传递给 API。

type 是一个整数,用于指定数据的类型。有关可用类型,请参见 值类型

value 是一个字符串,用于指定新值。

此方法还可以为指定的键设置其他值和类型信息。由 key 参数标识的键必须使用 KEY_SET_VALUE 访问权限打开。

要打开键,请使用 CreateKey()OpenKey() 方法。

值长度受可用内存的限制。较长的值(超过 2048 个字节)应存储为文件,并将文件名存储在配置注册表中。这有助于注册表高效运行。

引发 审计事件 winreg.SetValue,其参数为 keysub_keytypevalue

winreg.DisableReflectionKey(key)

禁用在 64 位操作系统上运行的 32 位进程的注册表反射。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

如果在 32 位操作系统上执行,通常会引发 NotImplementedError

如果键不在反射列表中,则该函数会成功,但不起作用。禁用键的反射不会影响任何子键的反射。

引发 审核事件 winreg.DisableReflectionKey,其参数为 key

winreg.EnableReflectionKey(key)

恢复已禁用键的注册表反射。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

如果在 32 位操作系统上执行,通常会引发 NotImplementedError

恢复键的反射不会影响任何子键的反射。

引发 审核事件 winreg.EnableReflectionKey,其参数为 key

winreg.QueryReflectionKey(key)

确定指定键的反射状态。

key 是已打开的密钥,或预定义 HKEY_* 常量 之一。

如果已禁用反射,则返回 True

如果在 32 位操作系统上执行,通常会引发 NotImplementedError

引发 审核事件 winreg.QueryReflectionKey,其参数为 key

常量

定义以下常量,以便在许多 winreg 函数中使用。

HKEY_* 常量

winreg.HKEY_CLASSES_ROOT

从属于此键的注册表项定义文档类型(或类)以及与这些类型关联的属性。Shell 和 COM 应用程序使用存储在此键下的信息。

winreg.HKEY_CURRENT_USER

从属于此键的注册表项定义当前用户的首选项。这些首选项包括环境变量的设置、程序组的数据、颜色、打印机、网络连接和应用程序首选项。

winreg.HKEY_LOCAL_MACHINE

从属于此键的注册表项定义计算机的物理状态,包括有关总线类型、系统内存以及已安装硬件和软件的数据。

winreg.HKEY_USERS

从属于此键的注册表项定义本地计算机上新用户的默认用户配置以及当前用户的用户配置。

winreg.HKEY_PERFORMANCE_DATA

从属于此键的注册表项允许你访问性能数据。数据实际上并未存储在注册表中;注册表函数导致系统从其源收集数据。

winreg.HKEY_CURRENT_CONFIG

包含有关本地计算机系统当前硬件配置文件的信息。

winreg.HKEY_DYN_DATA

此键在 98 之后的 Windows 版本中未使用。

访问权限

有关更多信息,请参阅 注册表项安全和访问

winreg.KEY_ALL_ACCESS

组合了 STANDARD_RIGHTS_REQUIRED、KEY_QUERY_VALUEKEY_SET_VALUEKEY_CREATE_SUB_KEYKEY_ENUMERATE_SUB_KEYSKEY_NOTIFYKEY_CREATE_LINK 访问权限。

winreg.KEY_WRITE

组合了 STANDARD_RIGHTS_WRITE、KEY_SET_VALUEKEY_CREATE_SUB_KEY 访问权限。

winreg.KEY_READ

组合 STANDARD_RIGHTS_READ、KEY_QUERY_VALUEKEY_ENUMERATE_SUB_KEYSKEY_NOTIFY 值。

winreg.KEY_EXECUTE

等同于 KEY_READ

winreg.KEY_QUERY_VALUE

必需才能查询注册表项的值。

winreg.KEY_SET_VALUE

必需才能创建、删除或设置注册表值。

winreg.KEY_CREATE_SUB_KEY

必需才能创建注册表项的子项。

winreg.KEY_ENUMERATE_SUB_KEYS

必需才能枚举注册表项的子项。

winreg.KEY_NOTIFY

必需才能请求注册表项或注册表项的子项的更改通知。

保留供系统使用。

64 位特定

有关详细信息,请参阅 访问备用注册表视图

winreg.KEY_WOW64_64KEY

指示 64 位 Windows 上的应用程序应在 64 位注册表视图上运行。在 32 位 Windows 上,此常量将被忽略。

winreg.KEY_WOW64_32KEY

指示 64 位 Windows 上的应用程序应在 32 位注册表视图上运行。在 32 位 Windows 上,此常量将被忽略。

值类型

有关更多信息,请参阅 注册表值类型

winreg.REG_BINARY

任何形式的二进制数据。

winreg.REG_DWORD

32 位数字。

winreg.REG_DWORD_LITTLE_ENDIAN

小端格式的 32 位数字。等同于 REG_DWORD

winreg.REG_DWORD_BIG_ENDIAN

大端格式的 32 位数字。

winreg.REG_EXPAND_SZ

包含对环境变量(%PATH%)引用的以 null 结尾的字符串。

Unicode 符号链接。

winreg.REG_MULTI_SZ

以两个 null 字符结尾的 null 结尾字符串序列。(Python 自动处理此终止。)

winreg.REG_NONE

无定义的值类型。

winreg.REG_QWORD

64 位数字。

在 3.6 版中添加。

winreg.REG_QWORD_LITTLE_ENDIAN

小端格式的 64 位数字。等同于 REG_QWORD

在 3.6 版中添加。

winreg.REG_RESOURCE_LIST

设备驱动程序资源列表。

winreg.REG_FULL_RESOURCE_DESCRIPTOR

硬件设置。

winreg.REG_RESOURCE_REQUIREMENTS_LIST

硬件资源列表。

winreg.REG_SZ

空终止字符串。

注册表句柄对象

此对象包装一个 Windows HKEY 对象,在对象销毁时自动关闭它。为保证清理,您可以在对象上调用 Close() 方法,或 CloseKey() 函数。

此模块中的所有注册表函数都返回这些对象之一。

此模块中接受句柄对象的注册表函数也接受整数,但是,建议使用句柄对象。

句柄对象为 __bool__() 提供语义 – 因此

if handle:
    print("Yes")

如果句柄当前有效(尚未关闭或分离),将打印 Yes

对象还支持比较语义,因此如果句柄对象都引用相同的底层 Windows 句柄值,它们将比较为 true。

句柄对象可以转换为整数(例如,使用内置 int() 函数),在这种情况下,将返回底层 Windows 句柄值。您还可以使用 Detach() 方法返回整数句柄,并将 Windows 句柄从句柄对象断开连接。

PyHKEY.Close()

关闭底层 Windows 句柄。

如果句柄已关闭,则不会引发错误。

PyHKEY.Detach()

将 Windows 句柄从句柄对象分离。

结果是一个整数,其中包含分离前的句柄值。如果句柄已分离或关闭,则将返回零。

调用此函数后,句柄实际上将失效,但不会关闭句柄。当您需要底层 Win32 句柄在句柄对象的生命周期之外存在时,将调用此函数。

引发 审核事件 winreg.PyHKEY.Detach,其中参数为 key

PyHKEY.__enter__()
PyHKEY.__exit__(*exc_info)

HKEY 对象实现 __enter__()__exit__(),因此支持 with 语句的上下文协议

with OpenKey(HKEY_LOCAL_MACHINE, "foo") as key:
    ...  # work with key

当控制离开 with 块时,将自动关闭