注册表的结构类似于一个树状结构,由多个分支和叶子节点组成。最上层为HKEY_CLASSES_ROOT、HKEY_CURRENT_USER等分支节点,每个节点下面包含着若干个子项,子项下面则包含着若干个键值对,也就是存储着实际配置信息的数据单元。[5][4]
Windows 3.1首次引入了注册表,至今仍被广泛使用。[4]注册表已经取代了autoexec.bat、config.sys以及几乎所有早期版本的Windows中的INI文件,成为了配置和管理系统的主要方式。极大地简化了系统配置和管理的过程。[6]
在注册表问世之前,Windows系统和应用程序的信息通常被存储在后缀名为ini的文本文件中。然而,由于每个程序都会新安装一个或多个ini文件来存储程序信息,导致信息的分布极为零乱,不便于使用和管理。[7][8]
1993年,微软推出了Windows NT 3.1操作系统。[9]NT注册表的结构和功能与后续的Windows版本基本保持一致。注册表以一个层次化的树形结构组织,类似于文件系统中的文件夹和文件的结构。使用户更方便地管理系统配置和应用程序设置。在NT 4.0中,更新了HKEY_CURRENT_CONFIG子树以提供对硬件配置文件的支持。[10]
1998年6月25日,微软公司发布了Windows 98电脑操作系统。[11]代码处理注册表的速度更快、更健壮,并且当出现某些问题时,操作系统能够自动检测和修复。同时,注册表服务使用更少的实模式内存和保护模式记忆,具备更优秀的缓存支持,缩短在注册表中查找值所需的时间。这些优化措施使得Windows 98操作系统的性能有了明显的提升。[12]
2000年2月17日,微软公司发布了Windows 2000操作系统。[13]Windows 2000首次引入了注册表事务日志的概念,以提高注册表的可靠性。在Windows 2000中,写入注册表文件时可以使用事务日志。具体的实现方式是,在数据被写入注册表之前,将其存储在事务日志中。如果由于锁定或者其他原因导致无法直接写入注册表的活页,那么系统会使用事务日志进行恢复。[14]
2006年11月30日,微软公司发布了Windows Vista操作系统。[15]Windows Vista引入了注册表虚拟化技术,这是一项应用程序兼容性技术。注册表虚拟化使得具有全局影响的注册表写入操作可以重定向到每个用户的位置。对于读取或写入注册表的应用程序来说,这个重定向操作是透明的。[16]
2009年10月,微软公司发布了Windows 7的操作系统,其核心版本号为Windows NT 6.1。在Windows 7中,注册表主要由“键”和“键值”构成,类似于我的电脑中的文件夹。同时,注册表中记录了用户安装在计算机上的软件和每个程序的相关信息,通过它可以控制硬件、软件、用户环境和操作系统界面的数据信息文件。[2][4]
2013年10月17日,微软公司发布了Windows 8.1操作系统。[17]Windows 8.1引入了新的注册表事务日志格式,以提升系统的可靠性和性能。新的日志格式采用了环形缓冲区的工作方式,其中最老的数据将被新的数据覆盖。每个日志条目都包括序列号和注册表偏移量,从而能够轻松确定写入的顺序和页面位置。[14]
2015年7月,微软公司发布了Windows 10的操作系统。相较于早期版本的Windows操作系统,Windows 10的注册表具有一些新的功能和改进。例如,如果用户已更新了Windows 10 KB4571756或KB4566782补丁,则支持通过编辑注册表开启Windows1020H2中的一个全新功能。此外,还有一些实用但小众的功能,如解除文件路径长度限制等,这些功能只能通过编辑注册表或组策略来开启。[18][19]
注册表是一个分层数据库。层次结构的顶部是用户的计算机。在它下面,会发现主要的分支,被称为“蜂巢”。这些配置单元中有注册表项。项可以包含子项和注册表值。键值有三种类型:String、Binary 或 DWORD。字符串是一行文本。二进制即表示为 1 和 0 的值。DWORD 是一个四字节数字。这些值通常用于存储布尔值,因此 1 或 0 可以表示“启用”和“禁用”。[2]
HKEY_CLASSES_ROOT 通常简称为 HKCR,是 Windows 注册表中的一个注册表单元,包含文件扩展名关联信息以及程序标识符 (ProgID)、类标识符 (CLSID) 和接口标识符 (IID) 数据。这个注册表配置单元包含必要的信息,当用户需要 Windows 执行某些操作时,它就会知道该怎么做,比如查看驱动器的内容或打开某种类型的文件等。[20]
KEY_CLASSES_ROOT子树包含两种类型的数据:一种是与文件类型相关联的数据,用于关联文件类型与程序;另一种是用于配置COM对象、Visual Basic程序或其他自动化数据的数据。文件类型的子项与文件扩展名同名,如 .exe。文件类型关联存储在注册表中,但更改它们应使用Windows资源管理器。而配置子项则使用程序ID或其他信息类作为父键,如COM、Visual Basic、自动化和脚本的信息类钥匙,如CLSID、Interface、TypeLib、AppId等。[21]
HKEY_CURRENT_USER,经常缩写为HKCU,是Windows注册表中的几个主要注册表配置单元之一,也是Windows注册表的重要组成部分。它包含Windows和特定于当前登录用户的软件的配置信息。例如,位于该配置单元下的各种注册表键中的各种注册表值控制着诸如已安装的打印机、桌面墙纸、显示设置、环境变量、键盘布局、映射的网络驱动器等用户级设置。许多在控制面板中的小程序中配置的设置实际上都存储在这个配置单元中。[22]
HKEY_CURRENT_USER子树仅存储当前用户子项的SID指针,并不直接包含数据。它提供对数据的更轻松访问,每次用户登录时都会创建新的子树,数据来自用户的配置文件。如果没有可用的配置文件,子树将根据默认用户的设置生成,这些设置存储在系统驱动器中的Ntuser.dat文件中。[23]
HKEY_LOCAL_MACHINE,通常缩写为HKLM,是组成Windows注册表的几个注册表配置单元之一。该子树包含有关本地计算机系统的信息,包括硬件和操作系统数据,如总线类型、系统内存、设备驱动程序和启动控制参数。[24]
HKEY_USERS,有时被视为HKU,是Windows注册表中的许多注册表配置单元之一。它包含计算机上所有当前活动用户的特定用户配置信息。HKEY_USERS配置单元下的每个注册表项都对应于系统上的一个用户,并使用该用户的安全标识符或SID命名。每个SID下的注册表项和注册表值控制该用户的特定设置,如映射的驱动器、安装的打印机、环境变量、桌面背景等,并在用户首次登录时加载。[25]
HKEY_CURRENT_CONFIG(HKCC)子树并不直接包含数据,而是存储指向当前硬件配置文件内容的指针,这些数据实际上位于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current子项中。HKCC提供了一个更便捷的访问方式,使用户能够在任何位置查看和更改这些硬件配置信息。[26]该子树包含在运行时收集的信息,存储在此键中的信息不会永久存储在磁盘上,而是在启动时重新生成。它是键“HKEY_LOCAL_MACHINESystemCurrentControlSetHardware ProfilesCurrent”的句柄,该键最初为空,但在启动时通过加载存储在“HKEY_LOCAL_MACHINESystemCurrentControlSetHardware Profiles”中的其他子键之一进行填充。[27]
配置单元是注册表中键、子项和值的逻辑组,用于在操作系统启动或用户登录时加载到内存中的支持文件。每个新用户登录计算机时,都会为其创建一个新的用户配置文件配置单元,其中包含与用户的应用程序设置、桌面、环境、网络连接和打印机相关的特定注册表信息。这些配置单元可以使用标准格式或最新格式的注册表文件存储,并存放在%SystemRoot%\System32\Config目录中。其中,标准格式在Windows XP及更高版本的操作系统中仍被支持,而最新格式则在支持最新格式的Windows版本中使用。每次用户登录时,这些文件都会更新。[28]
部分扩展文件数据说明[28]
分机 | 说明 |
.alt | 关键 HKEY_LOCAL_MACHINE\System 配置单元的备份副本。 只有 System 键具有 .alt 文件 |
.log | 配置单元中键和值条目的更改的事务日志 |
.sav | 在Windows Server 2003和Windows XP/2000中,配置单元备份副本是在安装程序的文本模式阶段结束时创建的。安装程序分为两个阶段:文本模式和图形模式。在文本模式阶段之后,配置单元会被复制到.sav文件中,以防止在安装图形模式阶段失败时可能发生的错误。如果在图形模式阶段安装失败,则在计算机重启时,仅重复图形模式阶段;.sav文件用于还原配置单元数据 |
每个值都可以存储具有可变长度和编码的任意数据,但这些数据与定义如何分析此数据的符号类型(定义为数值常量)相关联。[29]
标准注册表值类型列表[29]
符号类型名称 | 注册表值中存储的数据的含义和编码 | 符号类型名称 | 注册表值中存储的数据的含义和编码 |
REG_NONE | 无类型 | REG_SZ | 一个值,通常以 LE 形式存储和公开(使用 Win32 API 函数的 Unicode 版本时),通常以 NUL 字符结尾 |
REG_EXPAND_SZ | 一个“可扩展”字符串值,可以包含 ,通常以 UTF-16LE 存储和公开,通常以 NUL 字符结尾 | REG_BINARY | 二进制数据(任何任意数据) |
REG_DWORD_LITTLE_ENDIAN | 采用 little-endian 格式的 64 位数字。 等效于 REG_QWORD | REG_DWORD_BIG_ENDIAN | 32 位数字,采用 big-endian 格式 |
REG_LINK | 指向另一个注册表键值的符号链接(UNICODE),指定根键值和目标键值的路径 | REG_MULTI_SZ | 多字符串值,是一个非空字符串的有序列表,通常以 Unicode 编码存储和显示,每个字符串以一个空字符结束,列表通常以第二个空字符结束 |
REG_RESOURCE_LIST | 资源列表(用于即插即用硬件枚举和配置) | REG_FULL_RESOURCE_DESCRIPTOR | 资源需求列表(用于即插即用硬件枚举和配置) |
REG_RESOURCE_REQUIREMENTS_LIST | 资源需求列表(用于即插即用硬件枚举和配置) | REG_QWORD / REG_QWORD_LITTLE_ENDIAN | 一个 QWORD 值,64 位整数(可以是 big-endian 或 little-endian,也可以是未指定的) |
应用程序在注册表中存储数据时,应遵循一些实用准则以提高系统效率。建议将配置和初始化数据存储在注册表中,而将其他类型的数据存储在其他地方。超过一两千字节的数据应存储为文件,并使用注册表中的键进行引用。此外,应将类似的数据分组为结构,并将结构存储为值,以节省空间。在 Windows 操作系统中,注册表文件的视图映射到分页池内存或计算机缓存地址空间中,无论数据大小如何,费用不超过 4 MB。注册表配置单元的最大大小为 2 GB,但系统配置单元除外。在某些版本的 Windows 中,尽管没有显式限制分页池内存和磁盘空间中的配置单元可能占用的总空间量,但系统配额可能会影响实际的最大大小。从 Windows Server 2003 Service Pack 2 (SP2) 开始,注册表配置单元的最大大小限制为 2 GB。[30]
系统配置单元的最大大小受物理内存限制[30]
系统 | 系统配置单元的最大大小 |
基于 x86 的系统 | 物理内存的 50%,最大为 400 MB。带 SP2 的 Windows Server 2003、SP1 的 Windows Server 2003、Windows Server 2003 和 Windows XP: 物理内存的 25%,最大为 200 MB |
基于 x64 的系统 | 物理内存的 50%,最大为 1.5 GB。Windows Server 2003 SP2: 25% 的系统内存,最大为 200 MB。Windows Server 2003 SP1、Windows Server 2003 和 Windows XP 64 位版本: 32 MB |
基于 Intel Itanium 的系统 | 物理内存的 50%,最大为 1 GB。Windows Server 2008、Windows Vista、Windows Server 2003 SP2、Windows Server 2003 SP1、Windows Server 2003 和 Windows XP 64 位版本: 32 MB |
注册表文件记录了用户安装在计算机上的软件和每个程序的相互关联信息,包括计算机的硬件配置,如自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据。此外,注册表也存放着各种参数,直接控制着Windows的启动、硬件驱动程序的装载以及一些Windows应用程序的运行,从而在整个系统中起着核心作用。应用程序可以使用一些特定的函数来将注册表的一部分保存到文件中,并在需要时将文件的内容加载回注册表。[31]
注册表元素大小限制[32]
Registry 元素 | 大小限制 |
项名 | 255 个字符,包括注册表中项的绝对路径,始终从基键开始,例如,HKEY_LOCAL_MACHINE |
值名称 | 16,383 个字符,Windows 2000 限制为 260 个 ANSI 字符或 16,383 个 Unicode 字符 |
值 | 可用内存,最新格式为 1 MB,标准格式为不到 4KB。对于超过 2,048 字节的长值,应将其存储在文件中,文件的位置应存储在注册表中。可以在值的名称或数据中指定文件位置,每个反斜杠前必须有另一个反斜杠作为转义字符 |
树 | 注册表树的深度可以为 512 级。 通过单个注册表 API 调用,一次最多可以创建 32 个级别 |
这些限制是为了确保注册表的稳定性和可靠性,同时还能满足处理各种类型和大小的数据的需要 |
注册表函数是Windows操作系统提供的一种用于处理注册表的API,其功能丰富,包括检索注册表的注册表函数是Windows操作系统提供的一种用于处理注册表的API,其功能丰富,包括检索注册表的当前大小以及允许注册表在系统上达到的最大大小,关闭指定注册表项的句柄,与另一台计算机上的预定义注册表句柄建立连接,将指定的注册表项及其值和子项复制到指定的目标键等。[33]
以下是一些常用的函数和相关说明[33]
函数 | 说明 | 函数 | 说明 |
GetSystemRegistryQuota | 检索注册表的当前大小以及允许注册表在系统上达到的最大大小 | RegUnLoadKey | 从注册表中卸载指定的注册表项及其子项 |
RegCloseKey | 关闭指定注册表项的句柄 | RegSetValueEx | 设置注册表项下指定值的数据和类型 |
RegConnectRegistry | 与另一台计算机上的预定义注册表句柄建立连接 | RegRestoreKey | 读取指定文件中的注册表信息,并将其复制到指定的键上 |
RegCopyTree | 将指定的注册表项及其值和子项复制到指定的目标键 | RegQueryReflectionKey | 确定已为指定的键禁用或启用反射 |
RegCreateKeyEx | 创建指定的注册表项 | RegLoadMUIString | 从指定的键和子项加载指定的字符串 |
这里只是简单阐明了函数的作用,具体使用场景以及参数介绍等相关信息可以去相关网站查看 |
注册表编辑器是Windows操作系统中的一个重要工具,用于查看和维护注册表。注册表是Windows操作系统中的一个核心数据库,存放着各种系统参数和应用程序的设置信息。[34]通过注册表编辑器,用户可以修改注册表中的内容,以实现一些特定的功能,例如加快启动速度、修改系统设置、修复系统问题等。[35]
注册表编辑器的使用
任务需求 | 说明 | 效果展示 |
编辑注册表 | 打开编辑注册表后,展开注册表树并找到要查找的值,然后双击要更改的值即可[36] | |
备份注册表 | 在注册表编辑器中,通过导航树找到要备份的注册表分支。选中要备份的分支,然后点击"文件"菜单,选择"导出"选项。在弹出的"导出注册表文件"对话框中,选择备份的保存位置和文件名,确保选择的文件类型为"注册表文件(*.reg)"。确认导出选项,包括勾选"选择分支"和"选定的分支",然后点击"保存"。完成备份后,将获得一个.reg后缀的注册表备份文件[37] | |
添加新的项和值 | 导航到想要添加注册表项的位置。例如,要在"HKEY_CURRENT_USER"下添加一个新的注册表项,依次展开该分支。在所选位置上,点击"编辑"菜单,选择"新建",然后选择想创建的注册表项类型,如"键值”、“子项"等。如果选择"键值",将为该值创建一个新的键值,并在右侧窗格中显示。双击新创建的键值,可以更改其名称和值数据。根据用户的需要,选择适当的数据类型,并将所需数值输入到"数值数据"字段。如果选择"子项",将创建一个新的子项。右键单击已创建的子项,选择"新建",然后选择所需的键值类型,并进行相应设置[38] |
是否应该编辑注册表:除非别无选择,否则不要直接编辑注册表。 注册表编辑器会忽略标准的安全措施,从而使得这些设置可能降低性能、破坏系统,甚至要求用户重新安装 Windows。 用户可以使用控制面板或 Microsoft 管理控制台 (MMC) 中的程序安全地更改大多数注册表设置。 如果必须直接编辑注册表,请先进行备份。[39]
使用 reg 命令可以对注册表项中的注册表子项信息和值执行操作,可以查看或配置本地或远程计算机上的注册表项,但使用 reg 配置远程计算机的注册表会限制在某些操作中可以使用的参数,因此需要检查每个操作的语法和参数,以确保它们可以在远程计算机上使用。[39]
reg 命令的使用
语法\参数 | 说明 | 语法\参数 | 说明 |
reg add | 将新的子项或项添加到注册表中 | reg compare | 比较指定的注册表子项或项 |
reg copy | 将注册表项复制到本地或远程计算机上的指定位置 | reg delete | 从注册表中删除子项或条目 |
reg export | 将本地计算机的指定子项、项和值复制到文件,以便传输到其他服务器 | reg import | 将包含导出的注册表子项、条目和值的文件内容复制到本地计算机的注册表中 |
reg load | 将保存的子项和项写入注册表中的不同子项 | reg query | 返回位于注册表中指定子项下的下一层子项和条目的列表 |
reg restore | 将保存的子项和项写回到注册表 | reg save | 将注册表的指定子项、项和值的副本保存在指定的文件中 |
除了使用reg.exe 实用程序执行所有典型的注册表操作。还有另一种选择——Windows PowerShell。PowerShell 提供了大量工具,用于在本地计算机上或远程与 Microsoft Windows 注册表进行交互。[40]
PowerShell编辑注册表[40]
任务需求 | 说明 | 效果展示\代码展示 |
获取注册表项值 | 通过Get-ItemProperty获取指定路径下注册表项的值。其中,HKLM:\ 表示 HKEY_LOCAL_MACHINE, -Path 参数指定要读取的注册表项路径, -Name 参数指定要获取的值的名称。运行该命令后,将显示该值的名称和数据 | |
远程获取注册表项值 | 若要远程编辑注册表,首先需要使用 Enter-PSSession cmdlet 连接到该注册表。系统将提示用户输入指定用户帐户的密码。身份验证后,将能够在远程计算机上使用 PowerShell 命令 | |
注册表中搜索 | 若要在注册表中查找特定项,可以使用如下所示的脚本,该脚本在注册表中搜索名称中包含“VMware”的项 | |
编辑注册表 | 如果要更改注册表项的参数之一,则需要使用 Set-ItemProperty cmdlet。例如,可以使用以下命令为“Run”键的“VMware User Process”参数设置新的字符串值 | |
重命名注册表项或参数 | 若要重命名注册表项,可以使用 Rename-Item指令 | |
创建注册表项 | 首先使用 New-Item 创建名为 “dummy” 的子项。 然后用New-ItemProperty在“dummy\NetwrixKey” 下创建名为 “NetwrixParam” 的属性,值为 “NetwrixValue”,属性类型为 “String” | |
删除注册表项或参数 | 首先将删除 HKCU:\dummyNetwrixKey 注册表项中的名为 “NetwrixParam” 的属性/值。然后递归地删除 HKCU:\dummyNetwrixKey 注册表项及其所有子项。最后使用通配符 * 删除名为 HKCU:\dummyNetwrixKey* 的注册表项及其所有子项 | |
注册表项管理是相当简单和快速的——但请记住,即使是一个小小的改变也可能导致用户的操作系统进入蓝屏死机 |
Windows 注册表的缺点包括迁移困难、单点故障的问题以及容易受到用户恶意和无意损坏的风险。尽管通过事务日志和多级日志文件可以在一定程度上防止损坏和修复问题,但其集中式和分层结构仍使注册表成为系统中的薄弱环节。因此,在使用注册表时需要谨慎,并且定期进行备份是很重要的。[41]
展开
[1]Registry.microsoft. [2023-11-22].
[2]注册表的结构.Microsoft. [2023-11-17].
[3]Windows 3.1 is officially 30 years old.windowscentral. [2023-11-28].
[4]预定义密钥.Microsoft. [2023-11-17].
[5]注册表层次结构.Microsoft. [2023-11-23].
[6]What Is the Windows Registry?.lifewire. [2023-11-30].
[7]Configure an Ini File Item.microsoft. [2023-11-24].
[8]Unix Configuration File.fileinfo. [2023-11-24].
[9]Happy 20th birthday, Windows NT 3.1: Microsoft's server outrider.theregister. [2023-11-28].
[10]Editing the Windows NT Registry.itprotoday. [2023-11-29].
[11]Windows 98 发布|历史上的今天.腾讯网. [2023-12-06].
[12]Chapter 31 - Windows 98 Registry. Windows 98 注册表. [2023-12-06].
[13]Remembering Windows 2000, Microsoft's Forgotten Masterpiece.howtogeek. [2023-11-24].
[14]Just a moment....mandiant. [2023-12-06].
[15]微软Windows Vista.eyewated. [2023-12-06].
[16]Registry Virtualization.microsoft. [2023-12-06].
[17]微软公布Win8.1正式版发布时间:10月17免费升.IT之家. [2023-12-06].
[18]教你如何通过注册表开启 Win10 20H2 新功能,获得全新开始菜单.IT之家. [2023-11-29].
[19]最大路径长度限制.microsoft. [2023-11-29].
[20]HKEY.lifewire. [2023-12-07].
[21]HKEY_CLASSES_ROOT.microsoft. [2023-12-07].
[22]什么是HKEY_CURRENT_USER?.lifewire. [2023-12-07].
[23]HKEY_CURRENT_USER.Microsoft. [2023-11-17].
[24]HKEY_LOCAL_MACHINE.Microsoft. [2023-11-17].
[25]HKEY_USERS (HKU Registry Hive).lifewire. [2023-12-07].
[26]HKEY_CURRENT_CONFIG.Microsoft. [2023-11-17].
[27]Understanding the Registry on Windows.uconn. [2023-12-07].
[28]注册表配置单元.Microsoft. [2023-11-20].
[29]注册表数据类型.microsoft. [2023-11-30].
[30]注册表存储空间.Microsoft. [2023-11-17].
[31]注册表文件.Microsoft. [2023-11-20].
[32]注册表元素大小限制.Microsoft. [2023-11-20].
[33]注册表函数.Microsoft. [2023-11-20].
[34]使用 64 位版本的 Windows 查看系统注册表.microsoft. [2023-11-30].
[35]Hotfix information for Windows Server 2003.Microsoft支持. [2023-11-30].
[36]Overview of the Windows Registry.Microsoft. [2023-11-23].
[37]How to Back Up the Windows Registry.lifewire. [2023-11-22].
[38]如何添加、更改和删除注册表项和值.lifewire. [2023-11-22].
[39]reg 命令.microsoft. [2023-12-07].
[40]如何使用 PowerShell 获取、编辑、创建和删除注册表项.netwrix. [2023-12-07].
[41]Windows 注册表 - 缺点.liquisearch. [2023-12-07].
该页面最新编辑时间为 2024年4月14日