极语言官方网站

注册表

注册表是系统定义的数据库,应用程序和系统组件在其中存储和检索配置数据。

存储在注册表中的数据因 Microsoft Windows 版本而异。

应用程序使用注册表 API 检索、修改或删除注册表数据。

除非绝对必要,否则不应编辑不属于应用程序的注册表数据。

如果注册表中存在错误,则表示系统可能无法正常工作。

如果发生这种情况,可以将注册表还原到上次成功启动计算机时的状态。


注册表的结构

注册表是一个分层数据库,其中包含对 Windows 的操作以及 Windows 上运行的应用程序和服务至关重要的数据。

数据以树格式进行结构化。 树中的每个节点称为 键。

每个键可以同时包含 子项 和数据条目(称为 值)。

有时,密钥的存在是应用程序所需的所有数据;其他时候,应用程序会打开一个密钥并使用与该键关联的值。

键可以有任意数量的值,值可以采用任何形式。

有关详细信息,请参阅注册表值类型和注册表元素大小限制。

每个键都有一个由一个或多个可打印字符组成的名称。

键名称不区分大小写。 键名称不能包含反斜杠字符 (\) ,但可以使用任何其他可打印字符。

值名称和数据可以包含反斜杠字符。每个子项的名称对于层次结构中紧靠在它的上方的键而言是唯一的。

键名称未本地化为其他语言,但值可能为 。

下图是注册表编辑器显示的示例注册表项结构。

注册表编辑器窗口

每个值都包含一个值名称及其关联的数据。注册表树的深度可以为 512 级。

通过单个注册表 API 调用,一次最多可以创建 32 个级别。


注册表存储空间

尽管应用程序可以在注册表中存储的数据的类型和大小几乎没有技术限制,但存在某些实用准则以提高系统效率。

应用程序应将配置和初始化数据存储在注册表中,并将其他类型的数据存储在其他地方。

通常超过一两千字节的数据应存储为文件,并使用注册表中的键引用,而不是作为值存储。

应用程序应将数据保存为文件并引用文件,而不是在注册表中复制大块数据。

可执行的二进制代码绝不应存储在注册表中。

值项使用的注册表空间比键少得多。为了节省空间,应用程序应将类似数据分组为结构,

并将结构存储为值,而不是将每个结构成员存储为单独的键。

注册表文件的视图在计算机缓存地址空间中映射。

因此,无论注册表数据的大小如何,其费用不超过 4 MB。注册表配置单元的最大大小为 2 GB,系统配置单元除外。


预定义键

应用程序必须先打开密钥,然后才能将数据添加到注册表。

若要打开密钥,应用程序必须向注册表中已打开的另一个项提供句柄。

系统定义始终打开的预定义密钥。

预定义键可帮助应用程序在注册表中导航,并可以开发允许系统管理员操作数据类别的工具。

将数据添加到注册表的应用程序应始终在预定义键的框架中工作,因此管理工具可以找到并使用新数据。

应用程序可以使用这些键的句柄作为注册表的入口点。

尽管这些句柄的使用可能因平台而异,但这些句柄对所有注册表实现都有效。

此外,已针对特定平台定义了其他预定义句柄。

下面是预定义键的句柄。

中文名称英文名称数值作用
表键类根HKEY_CLASSES_ROOT0x80000000从属于此项的注册表项定义类型 (或类) 文档以及与这些类型关联的属性。 Shell 和 COM 应用程序使用此密钥下存储的信息。
表键当前HKEY_CURRENT_USER0x80000001从属于此键的注册表项定义当前用户的首选项。包括环境变量的设置、有关程序组、颜色、打印机、网络连接和应用程序首选项的数据。
表键本机HKEY_LOCAL_MACHINE0x80000002从属于此键的注册表项定义计算机的物理状态,包括有关总线类型、系统内存以及已安装硬件和软件的数据。
表键用户HKEY_USERS0x80000003从属于此项的注册表项定义本地计算机上新用户的默认用户配置和当前用户的用户配置。
表键数据HKEY_PERFORMANCE_DATA0x80000004从属于此键的注册表项允许访问性能数据。数据实际上不存储在注册表中;注册表函数会导致系统从其源收集数据。
表键配置HKEY_CURRENT_CONFIG0x80000005包含有关本地计算机系统的当前硬件配置文件的信息。信息仅描述了当前硬件配置与标准配置之间的差异。
表键首选HKEY_CURRENT_USER_LOCAL_SETTINGS0x80000007从属于此项的注册表项定义当前用户的首选项,这些首选项是计算机的本地用户。漫游用户配置文件的按用户注册表部分不包括这些条目。
表键英语HKEY_PERFORMANCE_TEXT0x80000050从属于此键的注册表项引用描述美国英语计数器的文本字符串。
表键本语HKEY_PERFORMANCE_NLSTEXT0x80000060从属于此键的注册表项引用以运行计算机系统的区域的本地语言描述计数器的文本字符串。

注册表配置单元

配置单元是注册表中键、子项和值的逻辑组,在操作系统启动或用户登录时这些键、子项和值具有一组加载到内存中的支持文件

每次新用户登录到计算机时,都会为该用户创建一个新的配置单元,其中包含用于用户配置文件的单独文件。

这称为 用户配置文件配置单元。

用户的配置单元包含与用户的应用程序设置、桌面、环境、网络连接和打印机相关的特定注册表信息。

用户配置文件配置单元位于 HKEY_USERS 键下。

配置单元的大多数支持文件位于 %SystemRoot%\System32\Config 目录中。 每次用户登录时,这些文件都会更新。

这些目录中文件的文件扩展名(或在某些情况下缺少扩展名)指示它们包含的数据类型。

下表列出了这些扩展以及文件中数据的说明。

扩展名说明
配置单元数据的完整副本。
.Alt关键 HKEY_LOCAL_MACHINE\System 配置单元的备份副本。 只有 System 键具有 .alt 文件。
.log配置单元中键和值条目的更改的事务日志。
.sav配置单元的备份副本。.sav 文件用于还原配置单元数据。

下表列出了标准配置单元及其支持文件。
注册表配置单元支持文件
HKEY_CURRENT_CONFIGSystem、System.alt、System.log、System.sav
HKEY_CURRENT_USERNtuser.dat、Ntuser.dat.log
HKEY_LOCAL_MACHINE\SAMSam、Sam.log、Sam.sav
HKEY_LOCAL_MACHINE\SecuritySecurity、Security.log、Security.sav
HKEY_LOCAL_MACHINE\SoftwareSoftware、Software.log、Software.sav
HKEY_LOCAL_MACHINE\SystemSystem、System.alt、System.log、System.sav
HKEY_USERS\.DEFAULTDefault、Default.log、Default.sav

数据的类别

在将数据放入注册表之前,应用程序应将数据分为两类:计算机特定的数据和用户特定的数据。

通过进行此区分,应用程序可以支持多个用户,并通过网络查找特定于用户的数据,

并在不同的位置使用该数据,从而允许与位置无关的用户配置文件数据。

安装应用程序后,它应在 HKEY_LOCAL_MACHINE 键下记录特定于计算机的数据。

具体而言,它应为公司名称、产品名称和版本号创建密钥,如以下示例所示:

**HKEY_LOCAL_MACHINE\Software\**MyCompany\MyProduct\1.0

如果应用程序支持 COM,则应在 HKEY_LOCAL_MACHINE\Software\Classes下记录该数据。

应用程序应在 HKEY_CURRENT_USER 键下记录特定于用户的数据,如以下示例所示:

**HKEY_CURRENT_USER\Software\**MyCompany\MyProduct\1.0

注册表数据类型

中文名称英文名称数值作用
表无形REG_NONE0没有定义的值类型。
表文本REG_SZ1以 0 结尾的字符串。
表环境REG_EXPAND_SZ2包含对环境变量 (例如“%PATH%”) 的未扩展引用的 0 终止字符串。
表数据REG_BINARY3任意格式的二进制数据。
表整数REG_DWORD432 位数字。
表大端REG_DWORD_BIG_ENDIAN5采用高位在前大端序格式的32位数字。
表链接REG_LINK6Unicode 符号链接。
表宽字REG_MULTI_SZ7以两个 0 结尾的字符串数组,宽字符。
表资源REG_RESOURCE_LIST8设备驱动程序资源列表。
表描述REG_FULL_RESOURCE_DESCRIPTOR9完整资源描述符
表需求REG_RESOURCE_REQUIREMENTS_LIST10资源需求列表
表大数REG_QWORD1164 位数字。

打开、创建和关闭键

应用程序必须先创建或打开密钥,然后应用程序才能将数据添加到注册表。

若要创建或打开密钥,应用程序始终将密钥引用为当前打开的密钥的子项。

始终打开以下预定义键:表键本机、表键类根、 表键用户和表键当前。

应用程序使用 打开表密 函数打开密钥,并使用 创建表密 函数创建密钥。

注册表树的深度可以为 512 级。 通过单个注册表 API 调用,一次最多可以创建 32 个级别。

应用程序可以使用 关闭表项 函数关闭某个键,并将它包含的数据写入注册表。

关闭表项 在返回之前不一定将数据写入注册表;缓存刷新到硬盘可能需要几秒钟的时间。

如果应用程序必须将注册表数据显式写入硬盘,则可以使用 更新表项 函数。

但是,更新表项 使用许多系统资源,并且仅在绝对必要时才应调用。


写入和删除注册表数据

应用程序可以使用 改子项值 函数将值及其数据与键相关联。

有关 改子项值 支持的值类型的列表,请参阅 注册表值类型。

若要从键中删除值,应用程序可以使用 删除值名 函数。

若要删除密钥,可以使用 删除子项 函数。

在关闭该密钥的最后一个句柄之前,不会删除已删除的密钥。

在写入操作期间无法锁定注册表项以同步对数据的访问。

但是,可以使用安全属性控制对注册表项的访问。

有关详细信息,请参阅 注册表项安全和访问权限。

可以在单个事务中执行多个注册表操作。 若要将注册表项与事务关联,应用程序可以使用 表键事务 或 表项事务 函数。


从注册表检索数据

若要从注册表中检索数据,应用程序通常会枚举项的子项,直到找到特定的项,然后从与其关联的值检索数据。

应用程序可以调用 枚举表项 函数来枚举给定密钥的子项。

若要检索有关特定子项的详细数据,应用程序可以调用 查询表项 函数。

表项信息 函数检索保护密钥的安全描述符的副本。

应用程序可以使用 枚举项值 函数枚举给定键的值,并使用 查询值项 函数检索键的特定值。

应用程序通常调用 枚举项值 来确定值名称,然后 调用 查询值项 来检索名称的数据。

查询项值 函数检索与打开的注册表项关联的值名称列表的类型和数据。

此函数对于动态密钥提供程序很有用,因为它通过在原子操作中检索多个值来确保数据的一致性。

由于其他应用程序可以在应用程序读取值并使用该值之间更改注册表值中的数据,

因此可能需要确保应用程序具有最新数据。

可以使用 表项变动 函数在注册表项的属性或内容发生更改时通知调用线程,或者如果删除了该键。

函数向事件对象发出信号,以通知调用方。

如果调用 表项变动 的线程退出,则会发出事件信号,并停止对注册表项的监视。

可以通过使用通知筛选器或标志来控制或指定应报告哪些更改。

通常,更改是通过向函数发出指定的事件信号来报告的。

请注意 表项变动 函数不适用于远程句柄。


注册表文件

应用程序可以将注册表的一部分保存在文件中,然后将文件的内容加载回注册表。

当正在操作大量数据、在注册表中创建多个条目时,或者当数据是临时的并且必须加载然后再次卸载时,

注册表文件非常有用。备份和还原部分注册表的应用程序可能使用注册表文件。

若要将键及其子项和值保存到注册表文件,应用程序可以调用 修改子项 或 改子项值 函数。

修改子项 和 改子项值 使用 archive 属性创建文件。

文件在本地密钥进程的当前目录中创建,在远程密钥的 %systemroot%\system32 目录中创建。

注册表文件具有以下两种格式:标准格式和最新格式。

标准格式是 Windows 2000 支持的唯一格式。

为了向后兼容,更高版本的 Windows 也支持它。修改子项 以标准格式创建文件。

从 Windows XP 开始,支持最新格式。 无法在 Windows 2000 上加载以此格式创建的注册表文件。

改子项值 可以通过指定REG_STANDARD_FORMAT或REG_LATEST_FORMAT,

以任一格式保存注册表文件。

因此,它可用于将使用标准格式的注册表文件转换为最新格式。

若要将注册表文件写回到注册表,应用程序可以使用 加载子项 替换表项 或 读取表项 函数,如下所示。

加载子项 将注册表数据从指定文件加载到调用应用程序的计算机上或远程计算机上的 HKEY_USERS 或

HKEY_LOCAL_MACHINE 下的指定子项中。

如果指定的子项尚不存在,则函数将创建该子项。

调用此函数后,应用程序可以使用 卸载子项 函数将注册表还原到其以前的状态。

替换表项 将注册表项及其注册表中的所有子项和值替换为指定文件中包含的数据。

新数据在下次启动系统时生效。

读取表项 将注册表数据从指定文件加载到调用应用程序的计算机上或远程计算机上的指定键中。

此函数将指定键下面的子项和值替换为文件中顶级键后面的子项和值。

连接表项 函数与另一台计算机上的预定义注册表句柄建立连接。

应用程序使用此函数主要用于从网络环境中其他计算机上的远程注册表访问信息,也可以使用注册表编辑器执行此操作。

你可能想要访问远程注册表以备份注册表或规范对它的网络访问。

请注意,必须具有适当的权限才能使用此函数访问远程注册表。


注册表项安全和访问权限

Windows 安全模型使你能够控制对注册表项的访问。

有关安全性的详细信息,请参阅 访问控制模型

调用 创建表密 或 改表信息 函数时,可以为注册表项指定安全描述符。

如果指定0则密钥将获取默认安全描述符。密钥的默认安全描述符中的ACL继承自其直接父密钥。

若要获取注册表项的安全描述符,请调用 表项信息、 取名安全 或 取安全符 函数。

注册表项的有效访问权限包括 DELETE、READ_CONTROL、WRITE_DAC和WRITE_OWNER 标准访问权限。

注册表项不支持 SYNCHRONIZE 标准访问权限。

注册表访问权限

英文名称数值作用
KEY_ALL_ACCESS0xF003F合并 全权访问、查询值、设置值、创建子项、枚举子项、更改通知和创建链接访问权限。
KEY_CREATE_LINK0x0020预留给系统使用。
KEY_CREATE_SUB_KEY0x0004创建注册表项的子项所必需的。
KEY_ENUMERATE_SUB_KEYS0x0008枚举注册表项的子项所必需的。
KEY_EXECUTE0x20019等效于 KEY_READ。
KEY_NOTIFY0x0010请求对注册表项或注册表项的子项的更改通知是必需的。
KEY_QUERY_VALUE0x0001查询注册表项的值所必需的。
KEY_READ0x20019合并 读取信息、查询值、枚举子项和更改通知值。
KEY_SET_VALUE0x0002创建、删除或设置注册表值所必需的。
KEY_WOW64_32KEY0x0200指示 64 位 Windows 上的应用程序应在 32 位注册表视图上运行。32 位 Windows 会忽略此标志。必须使用 OR 运算符将此标志与此表中查询或访问注册表值的其他标志结合使用。
KEY_WOW64_64KEY0x0100指示 64 位 Windows 上的应用程序应在 64 位注册表视图上运行。 32 位 Windows 会忽略此标志。必须使用 OR 运算符将此标志与此表中查询或访问注册表值的其他标志结合使用。
KEY_WRITE0x20006合并 读写信息、设置值和创建子项 访问权限。

注册表元素大小限制
元素大小限制
项名255 个字符。 键名称包括注册表中项的绝对路径,始终从主键开始,例如,表键本机。
值名称16,383 个字符。 Windows 2000: 260 个 ANSI 字符或 16,383 个 Unicode 字符。
可用内存 (最新格式) 1 MB (标准格式)
注册表树的深度可以为 512 级。 通过单个注册表 API 调用,一次最多可以创建 32 个级别。

(超过 2,048 字节的长值) 应存储在文件中,文件的位置应存储在注册表中。 这有助于注册表高效执行。

文件位置可以是值的名称或值的数据。如果某个文件位置在键名称的 255 个字符限制内,则文件位置也可以是键的名称。


注册表中的 32 位和 64 位应用程序数据

在 64 位 Windows 上,部分注册表项分别存储为 32 位应用程序和 64 位应用程序,

并使用注册表重定向器和注册表反射映射到单独的逻辑注册表视图中,

因为 64 位版本的应用程序可能使用不同于 32 位版本的注册表项和值。

还有未重定向或反映的 共享注册表项 。

每个 64 位注册表节点的父节点是 Image-Specific 节点或 ISN。

注册表重定向程序以透明方式将应用程序的注册表访问定向到相应的 ISN 子节点。

注册表树中的重定向子节点由 WOW64 组件使用名称 Wow6432Node 自动创建。

因此,必须不命名创建 Wow6432Node 的任何注册表项。

KEY_WOW64_64KEY和KEY_WOW64_32KEY标志分别允许显式访问 64 位注册表视图和 32 位视图。

注册表函数

中文名称英文名称示例作用
关闭表项RegCloseKey关闭表项(表项)关闭指定注册表项的句柄。
连接表项RegConnectRegistryA连接表项(机名,主键,@表项)建立与另一台计算机上的预定义注册表项的连接。
创建表项RegCreateKeyA创建表项(主键,子项,@表项)创建指定的注册表项。如果注册表中已存在该项,则该函数将打开它。
创建表密RegCreateKeyExA创建表密(主键,子项,0,类,选项,权限,属性,@表项,处置)创建或打开指定的注册表项。键名称不区分大小写。属性;处置:1新建,2只读;选项
删除子项RegDeleteKeyA删除子项(主键,子项)删除注册表子项及其值。子项键名不区分大小写。
删除值名RegDeleteValueA删除值名(主键,值名)从指定的注册表项中删除命名值。值名称不区分大小写。
枚举子项RegEnumKeyA枚举子项(主键,序号,名称,长度)枚举指定的打开的注册表项的子项。(连续查询)
枚举表项RegEnumKeyExA枚举表项(主键,序号,名称,长度,0,类,数据,时间)枚举指定打开的注册表项的子项。 函数在每次调用时检索有关一个子项的信息。
枚举项值RegEnumValueA枚举项值(主键,序号,名称,长度,0,类,数据,大小)枚举指定的打开的注册表项的值。获取指定索引的值名称、数据类型和数据块。
更新表项RegFlushKey更新表项(主键)将指定的打开的注册表项的所有属性写入注册表。
表项信息RegGetKeySecurity表项信息(安全键,安全信息,@安全描述,@长度)检索保护指定打开的注册表项的安全描述符的副本。
加载子项RegLoadKeyA加载子项(主键,子项,文件名)在用户或本机主键下创建一个子项,并将指定注册表配置单元中的数据加载到该子项中。
表键事务RegCreateKeyTransactedA表键事务(主键,子项,0,类,选项,
权限,属性,@表项,处置,事务,0)
创建或打开指定的注册表项并将其与事务相关联。属性;处置:1新建,2只读;选项:1可变,4忽略权限
表项事务RegOpenKeyTransactedA表项事务(主键,子项,0,权限,@表项,事务,0)打开指定的注册表项并将其与事务相关联。键名称不区分大小写。
表项变动RegNotifyChangeKeyValue表项变动(主键,项,选项,事件,立即)通知调用方对指定注册表项的属性或内容的更改。项为真时包括子项变动,立即为真立即返回,选项=1子项变更 2密钥属性 4密钥值 8密钥描述
打开表项RegOpenKeyA打开表项(主键,子项,@表项)打开指定的注册表项。
打开表密RegOpenKeyExA打开表密(主键,子项,选项,权限,@表项)打开指定的注册表项。名称不区分大小写。选项:2链接
映射表项RegOverridePredefKey映射表项(主键,表项)将预定义的注册表项映射到指定的注册表项。
查询表项RegQueryInfoKeyA查询表项(主键,@类,@大小,0,@项数,@名长,@子类长,
@值数,@键长,@值长,@描述长,@时间)
检索有关指定注册表项的信息。
查询项值RegQueryMultipleValuesA查询项值(主键,值表,值数,数据,长度)检索与打开的注册表项关联的值名称列表的类型和数据。
查询值名RegQueryValueA查询值名(主键,子项,数据,长度)检索与指定注册表项的默认值或未命名值关联的文本数据。
查询值项RegQueryValueExA查询值项(主键,子项,0,类型,数据,长度)检索与打开的注册表项关联的指定值名称的类型和数据。
替换表项RegReplaceKeyA替换表项(主键,子项,新名,旧名)将支持注册表项及其所有子项的文件替换为另一个文件,下次启动系统时,此项使用新文件中。
读取表项RegRestoreKeyA读取表项(表项/主键,文件名,选项)读取指定文件中的注册表信息,并将其复制到指定的注册表项上。选项1不保存 8还原
保存表项RegSaveKeyA保存表项(表项/主键,文件名,属性)将指定的键及其所有子项和值以标准格式保存到新文件中。属性
保存表键RegSaveKeyExA保存表键(表项,文件名,属性,格式)将指定的键及其所有子项和值以标准格式保存到新文件中。属性;格式:1标准,2最新,4无压缩
改表信息RegSetKeySecurity改表信息(安全键,安全信息,安全描述)用于设置指定项的安全特性。安全描述
修改子项RegSetValueA修改子项(表项,子项,类型,数据,长度)设置指定注册表项的默认值或未命名值的数据。数据必须是文本字符串。
改子项值RegSetValueExA改子项值(表项,值名,0,类型,数据,长度)设置注册表项下指定值的数据和类型。
卸载子项RegUnLoadKeyA卸载子项(表项,子项)从注册表中卸载指定的注册表项及其子项。

表密选项标志
英文名称作用解释
REG_OPTION_BACKUP_RESTORE4忽略 权限 参数,并尝试使用备份或还原密钥所需的访问权限打开密钥。
REG_OPTION_CREATE_LINK2此键是符号链接。 目标路径分配给键的 L“SymbolicLinkValue”值。 目标路径必须是绝对注册表路径。
REG_OPTION_NON_VOLATILE0此键不是易失的;这是默认值。信息存储在文件中,并在系统重启时保留。
REG_OPTION_VOLATILE1函数创建的所有键都是可变的。此信息存储在内存中,并且在卸载相应的注册表配置单元时不保留此信息。

安全描述类
中文名字英文名称长度作用解释
安全描述类SECURITY_DESCRIPTOR20包含与 对象关联的安全信息。 应用程序使用此结构来设置和查询对象的安全状态。
安全描述类 成员表
中文英文类型作用解释
修订Revision整形指定安全描述符的修订级别。
描述Control整形安全描述符的控制信息。
权人Owner整数指向所有者安全标识符的指针。
主组Group整数指向主组安全标识符的指针。
系统Sacl整数指向系统访问控制列表的指针 (SACL) 。
任意Dacl整数指向任意访问控制列表的指针 (DACL) 。

安全属性类
中文名字英文名称长度作用解释
安全属性类SECURITY_ATTRIBUTES12包含对象的安全描述符,并指定通过指定此结构检索的句柄是否可继承。
安全属性类 成员表
中文英文类型作用解释
长度nLength整数此结构的大小(以字节为单位)。
描述lpSecurityDescriptor整数指向控制对对象的访问的安全描述类结构的指针。
继承bInheritHandle整数一个布尔值,该值指定在创建新进程时是否继承返回的句柄。如果此成员为 TRUE,则新进程将继承句柄。