**注册表**（英語：，中国大陆译作，台湾、港、澳译作）是Microsoft Windows操作系統和其應用程序中的一个重要的层次型数据库，用于存储系统和应用程序的设置信息。

早在Windows 3.0推出OLE技术的时候，注册表就已经出现。但是，从Windows 95开始，注册表才真正成为Windows用户经常接触的内容，并在其后的操作系统中继续沿用至今。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。

历史
--

### 前身

最初，Windows系统及应用程序的信息被存储在后缀名为ini的文本文件中，这就是注册表的前身。但是这么做有着致命弱点：因为每一个程序都会新安装一个或多个ini文件，来存储程序信息，导致信息的分布极为零乱；而且在16位系统下，ini文件的大小必须在64KB之内。所以ini文件被认为不便于使用和管理。

### 发布与发展

在最早出现于Windows 3.0的OLE技术出现后，微软为了存放系统中大量的软件组件信息，组织了一个reg.dat的数据库来存放这些信息。当时的注册表编辑器为16位版本的regedit.exe，功能较弱。

后来开发的Windows NT则更进一步使用相同的文件格式来存放系统的配置信息，以取代原有的ini文件。该系统为每一个用户在用户目录下创建了一个自身的注册表空间，而系统的设置被存放在系统文件夹中。由于Windows NT是一个32位操作系统，regedit.exe被升级为regedt32.exe，并增加了对权限的设置功能。

在Windows 95中，注册表首次得到广泛应用，逐渐淘汰了原有的ini文件。程序在安装时，不再将数据写入ini文件，而直接写入注册表。为了最大限度兼容旧程序，部分原来用于读写ini文件的专门API函数仍然可用，但现在是访问注册表（写入或读取）。Windows 95为了保持和Windows 3.x系列的兼容性，注册表的架构与Windows NT不同，为此专门开发了另一个32位版本的regedit.exe，它没有设置权限的功能。

在Windows 2000中，由于Windows 95家族已经深入人心，regedit.exe也得到广泛应用，相反regedt32.exe的界面相对比较丑陋，因此微软将windows 95系列的regedit.exe拿过来用。但由于移植过来的regedit.exe仍没有权限设置的功能，regedt32.exe仍然保留在系统中用作权限设置。

到Windows XP和Windows Server 2003中，regedit.exe已经增加了权限的功能，regedit32.exe由于失去作用而被剔除。同时，这个版本的注册表是64位的，这导致了一些兼容性问题，少数可以运行在旧版本Windows的程序在Windows XP中无法运作。

### 64位Windows的注册表

64位Windows中的注册表结构大致与32位版本相同，但32位程序的信息被放在HKEY\_LOCAL\_MACHINE\SOFTWARE\Wow6432Node而不是HKEY\_LOCAL\_MACHINE\SOFTWARE（64位程序的信息放于此处）。

数据结构
----

注册表由键（key，或称"项"）、子键（subkey，子项）和值项（value）构成。一个键就是树状数据结构中的一个节点，而子键就是这个节点的子节点，子键也是键。一个值项则是一个键的一条属性，由名称（name）、数据类型（datatype）以及数据（data）组成。一个键可以有一个或多个值，每个值的名称各不相同，如果一个值的名称为空，则该值为该键的默认值。

在注册表编辑器（Regedit.exe）中，数据结构显示如下，其中，**command**键是**open**键的子键，**(默认)**表示该值是默认值，值名称为空，其数据类型为**REG\_SZ**，数据值为**%systemroot%\system32\NOTEPAD.EXE "%1**

以上信息的意义是：txt类型的文件在右键菜单里的""一项使用的程序是"NOTEPAD.EXE"，即用记事本打开文件。

### 数据类型

注册表的数据类型主要有以下五种：

| 显示类型（在编辑器中） | 数据类型 | 说明 |
| --- | --- | --- |
| REG\_SZ | 字符串 | 文本字串 |
| REG\_BINARY | 二进制数 | 不定长度的二进制值，以十六进制显示 |
| REG\_DWORD | 双字 | 一个 32 位的二进制值，显示为 8 位的十六进制值 |
| REG\_MULTI\_SZ | 多字符串 | 含有多个文本值的字符串，此名来源于字符串间用 nul 分隔、结尾两个 nul |
| REG\_EXPAND\_SZ | 可擴充字符串 | 含有环境变量的字符串 |

此外，注册表还有其他的数据类型，但是均不常用：

* REG\_DWORD\_BIG\_ENDIAN - DWORD 的大头版本，下面同理
* REG\_DWORD\_LITTLE\_ENDIAN
* REG\_FULL\_RESOURCE\_DESCRIPTOR
* REG\_QWORD - DWORD 的四字（64 位）版本
* REG\_FILE\_NAME

### 注册表的分支结构

注册表有五个一级分支，下面是这五个分支的名称及作用：

| 名称 | 作用 |
| --- | --- |
| HKEY\_CLASSES\_ROOT | 存储Windows可识别的文件类型的详细列表，以及相关联的程序。 |
| HKEY\_CURRENT\_USER | 存储当前用户设置的信息。 |
| HKEY\_LOCAL\_MACHINE | 包括安装在计算机上的硬件和软件的信息。 |
| HKEY\_USERS | 包含使用计算机的用户的信息。 |
| HKEY\_CURRENT\_CONFIG | 这个分支包含计算机当前的硬件配置信息。 |

### 注册表的存储方式

Windows NT系列操作系统和Windows 9x系列的存储方式有很大区别。注册表被分成多个文件存储，称为Registry Hives，每一个文件被称为一个配置单元。

在早期的Windows 3.x系列中，注册表仅包含一个reg.dat文件，所存放的内容后来演变为HKEY\_CLASSES\_ROOT分支。

Windows NT家族的配置单元文件：

| 名称 | 注册表分支 | 作用 |
| --- | --- | --- |
| SYSTEM | HKEY\_LOCAL\_MACHINE\SYSTEM | 存储计算机硬件和系统的信息 |
| NTUSER.DAT | HKEY\_CURRENT\_USER | 存储用户参数选择的信息（此文件放置于用户个人目录，和其他注册表文件是分开的） |
| SAM | HKEY\_LOCAL\_MACHINE\SAM | 用户及密码的数据库 |
| SECURITY | HKEY\_LOCAL\_MACHINE\SECURITY | 安全性设置信息 |
| SOFTWARE | HKEY\_LOCAL\_MACHINE\SOFTWARE | 安装的软件信息 |
| DEFAULT | HKEY\_USERS\.DEFAULT | 缺省启动用户的信息 |
| USERDIFF | HKEY\_USERS | 管理员对用户强行进行的设置 |

* 假设Windows安装于C盘，则在Windows XP以前，文件存放于C:\WINNT\SYSTEM32\CONFIG，而XP及以后则存放于C:\WINDOWS\SYSTEM32\CONFIG

Windows 9x家族的配置文件

| 名称 | 注册表分支 | 作用 |
| --- | --- | --- |
| CLASSES | HKEY\_CLASSES\_ROOT | 存储软件组件库有关信息 |
| USER.DAT | HKEY\_USERS | 存储用户参数选择的信息 |
| SYSTEM.DAT | HKEY\_LOCAL\_MACHINE | 系统信息 |

编辑注册表
-----

### 使用注册表编辑器

Microsoft公司不建議用户自行更改注册表，因为如果对注册表进行了不当修改，就有可能造成Windows系统的某些功能失效，甚至导致系统崩溃。但是，Microsoft公司仍然在Windows中提供了注册表编辑器，它位于%systemroot%\regedit.exe。在Windows NT中使用的则是界面有所不同的REGEDT32.exe。而在Windows 2000中，两个程序同时存在于系统中。部分的原因是Windows 2000版本的regedit.exe尚不支持对注册表数据设置安全性。但在Windows XP及以后的操作系统中，regedit.exe已经能够支持注册表安全设置了，因此REGEDT32.exe失去了存在的必要。不过它仍被保留，只是该程序执行时仅仅会自动调用regedit.exe。

除了编辑本台计算机上注册表数据之外，注册表编辑器亦可以通过文件菜单下的"加载配置单元"菜单项编辑直接编辑文件系统上的注册表数据文件。该功能可以允许用户打开文件系统中的RegHive文件，并将其中的数据映射到HKEY\_USERS或者HKEY\_LOCAL\_MACHINE项下的一个子项之中。

### 使用命令行工具（CLI）

Windows自带了一个管理注册表的命令行工具——**reg**。只需在命令提示符中运行并指定参数，即可以命令行的形式对注册表进行各项管理操作。支持的操作有增删改查、导入导出注册表文件（reg文件）、导入导出或加载配置单元（RegHive）等。

### 使用脚本

在Windows 98以后的操作系统中，增加了一个脚本语言解释器，可以用来执行一些系统任务。它可以支持VBScript和JavaScript两种脚本语言，都提供了访问注册表的功能。某些病毒就利用这一点通过修改注册表进行传播。

### 使用第三方或自行编写的软件

访问注册表的系统功能对编程人员是开放的，因此有许多软件都有读写注册表的功能。事实上，Windows平台下开发的软件几乎都在不同程度上修改注册表，以便保存一些在程序多次运行之间需要保留的信息，以及让软件可以通过某种特定方式（例如，右键菜单）启动。也有一些软件是专门开发出来对注册表进行优化和设置的。

### 使用reg文件

reg文件也是一种修改注册表的方式。在注册表编辑器中，用户可以通过"文件"菜单中的"导出"菜单项来备份注册表中的某些项目到一个reg文件之中；之后用户可以再次通过"导入"菜单项将这些项目还原。reg文件本身也在系统中被关联到regedit.exe，因此直接双击打开reg文件也会起到将其中的项目导入到注册表中的效果。

而事实上，reg文件是根据一定格式编写的纯文本文件。因此，熟练的用户可以直接使用文本编辑器（比如记事本）来创建自己的reg文件，这样做无需在注册表中根据路径一级一级地访问，而且可以直接对大量项目进行批量修改。这些文件还可以被分发给非专业的用户，帮助他们快速地完成注册表的编辑，以减少出错的可能。

### Registry APIs

Windows SDK提供了访问注册表的接口。创建或打开的键，必须作为当前已经打开的键的子键。HKEY\_LOCAL\_MACHINE, HKEY\_CLASSES\_ROOT, HKEY\_USERS, HKEY\_CURRENT\_USER等预定义的键总是已经打开。使用RegOpenKeyEx打开键；使用RegCreateKeyEx创建键。注册表允许最大512层子键深度。通过一个注册表API调用允许一次打开或创建32层深度的注册表的子键。 RegCloseKey关闭已经打开的键，把数据写回注册表。RegFlushKey把内存中缓存的注册表已修改数据写回到硬盘上，因此代价高昂，要慎重调用。

RegSetValueEx把一个值项与其数据关联到一个键上。RegDeleteVaule从键上删除一个值项。RegDeleteKey删除一个键，但直到关闭相应的注册表句柄（handle）才真正完成删除操作。

RegEnumKeyEx枚举一个键下的所有子键。RegEnumValue枚举一个键下的所有值项。RegQueryValueEx获取一个值项的数据。

RegSaveKeyEx可以把一个键及所有子键保存到一个文件中。RegLoadKey把一个注册表文件装入到系统的注册表，RegUnLoadKey把系统注册表恢复到原状态。

缺點
--

評論家將Windows 95的注册表視作「單點故障」，因為不當使用「登錄編輯程式」可能會造成嚴重的問題，甚至可能需要重新安裝作業系統。無法保證能夠順利解決因不當使用「登錄編輯程式」所造成的問題。您必須自行承擔使用「登錄編輯程式」的風險。建議您在編輯登錄前，先行備份。

### 分散与集中之争

关于分散的文本文件和集中的注册表两种软件配置方式的优劣，目前仍有争论。主流操作系统中，Linux操作系统一直使用单独的文本文件来存放配置信息。而Windows平台下基于.NET框架的软件对注册表的依赖性也大大减弱。事实上，.NET软件通常使用纯文本的XML（称为app.config）文件而不是注册表进行配置，这在某种意义上是向当初的ini文本配置方式的一种回归。部分绿色软件支持者认为，集中式的注册表要求软件需要进行专门的安装步骤才可以正常运行，而单独的文本配置文件则可以不需要安装，只要将软件的文件目录拷贝过来就可以使用；当不再需要软件的时候，除删除相关文件外对于注册表也需要进行卸载步骤，才有可能不在系统中留下痕迹（很多软件即使提供了卸载步骤，仍然会留下痕迹），如果使用文本配置文件，则能做得更干净。但是，文本配置方式导致某些系统软件的配置较为困难且缺乏统一的界面（如Linux中的情况），也是不争的事实，尽管现在已经有很多软件可以方便进行系统配置，但仍存在标准不够统一的问题。

著名开源软件Fetchmail的作者Eric S. Raymond在《UNIX编程艺术》一书中有如下叙述：

> 对比terminfo数据库和Windows注册表，我们发现注册表出名地容易受到错误代码的破坏。这可能会使整个系统都无法使用。即使系统没有瘫痪，但如果破坏本身干扰了专用的注册表编辑工具，恢复工作就会很困难。
> 
> 

从2000年以来部分恶性病毒如熊猫烧香等的破坏情形看，的确存在"破坏本身干扰注册表编辑器"的问题。在某些情况下，病毒程序会监视系统进程列表，并强行关闭名为regedit的任何程序。这使得受损用户难以直接通过编辑注册表进行恢复。

注册表是Windows操作系统的核心，越来越多的黑客程序将攻击对象转向了注册表。一些程序（尤其是恶意程序），为了达到随系统自动启动的目的，会在注册表创建启动项，因此监控注册表能够有效地预防该类恶意程序的攻击。

参考资料
----

* Windows XP专业版从入门到精通（中文版），Mark Minasi著，王珺、屈马珑等译，ISBN 7-5053-7569-5
* Unix编程艺术（简体中文版），Eric S. Raymond著，姜宏 何源 蔡晓俊 译，电子工业出版社 ISBN 7-121-02116-1

参见
--

* Microsoft Windows

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
Microsoft Windows组件 |
| --- |
|  |
| 管理工具 | 
* 命令提示字元
* + 元件列表
* 裝置管理員
* 磁碟清理
* 磁碟重組工具
* 驅動程式檢查器
* 事件檢視器
* IExpress
* 管理控制台
* Netsh
* 修復主控台
* 資源監視器
* 性能监视器
* 設定
* Sysprep
* 系統設定
* 系統文件檢查器
* 系統策略编辑器
* 系統還原
* 任务管理器
* Windows輕鬆傳輸
* Windows錯誤報告
* Windows Installer
* Windows PowerShell
* Windows Update
* WinPE
* WinRE
* WMI

 |
|  |
| 應用程式 | 
* 3D 檢視器
* 
* 小算盤
* 字元對應表
* Cortana
* DVD播放器
* Edge
* 傳真和掃描
* 
* 取得協助（英语：）
* Groove
* Internet Explorer
* 放大鏡
* 郵件
* 地圖
* Media Player
* MSN應用（新聞，天氣，體育，財經）
* 電影與電視
* 行動中心
* 朗讀程式
* 記事本
* 
* OneDrive
* OneNote
* 小畫家 3D
* 小畫家
* 
* 照片
* 遠端協助（英语：）
* 剪取工具
* 語音辨識
* 
* 
* 提示（英语：）
* 錄音機
* Windows Ink
* WordPad
* Xbox
* XPS查看器
* 

 |
|  |
| Shell | 
* 重要訊息中心
* Aero
* 自動播放
* 自動執行
* ClearType
* 檔案總管
* 搜尋
	+ 索引服务
	+ IFilter
	+ 儲存的搜尋
	+ 命名空間
	+ 特殊文件夹
* 開始功能表
* 工作列
* 任务视图
* Windows XP主題

 |
|  |
| 服務 | 
* 服务控制管理器
* 后台智能传输服务
* 通用日志文件系统
* 多媒體類別排程器（英语：）
* 磁碟區陰影複製服務
* 工作排程器
* 錯誤報告
* 無線零配置
* 推送通知服務

 |
|  |
| 文件系統 | 
* CDFS
* DFS
* exFAT
* 可安装文件系统
* FAT
* NTFS
	+ 硬链接
	+ 連接點
	+ 挂载点
	+ 重解析点
	+ 符號連結
	+ TxF（英语：）
	+ EFS
* ReFS
* UDF
* WinFS

 |
|  |
| 伺服器 | 
* 網域（英语：）
* Active Directory
* DNS（英语：）
* 组策略
* 漫游用户配置文件
* 資料夾重新導向（英语：）
* 分散式交易協調器
* MSMQ
* Windows Media服務
* 活动目录权限管理服务（英语：）
* IIS
* 遠端桌面服務
* WSUS
* SharePoint
* 網路存取保護
* PWS
* 文件复制服务（英语：）
* 遠端差異壓縮（英语：）
* 適用於UNIX的列印服務（英语：）
* Windows部署服務（英语：）
* 系統資源管理員（英语：）
* Hyper-V
* 伺服器核心

 |
|  |
| 架構 | 
* Windows NT的架構
* 啟動處理程序（英语：）
* csrss.exe
* 桌面視窗管理員
* 可攜式格式
	+ EXE
	+ DLL
* 增强写入筛选器（英语：）
* 圖形裝置介面
* hal.dll
* I/O请求数据包
* 程式庫檔
* 核心交易管理員
* 庫
* 邏輯磁碟管理
* lsass
* MinWin（英语：）
* NTLDR
* Windows開機管理程式
* ntoskrnl.exe
* 物件管理
* Open XML紙張規範
* 注册表
* Windows资源保护
* 安全性帳戶管理員（英语：）
* 伺服器訊息區
* 磁碟區陰影複製服務
* SMSS
* 系统空闲进程
* 使用者（英语：）
* WHEA（英语：）
* Win32主控台
* Winlogon
* 华生医生（英语：）

 |
|  |
| 安全性 | 
* 安全性與維護
* BitLocker
* 資料執行防止
* 家長監護服務
* 內核修補程式保護
* 認證相符控制
* 受保护媒体路径
* 使用者帳戶控制
* 控制台元件列表
* Windows Defender
* Windows防火牆

 |
|  |
| 兼容性 | 
* COMMAND.COM
* DOS虚拟机（英语：）
* Windows on Windows
* WoW64
* 适用于 Linux 的 Windows 子系统

 |
|  |
| API | 
* 動態指令碼處理（英语：）
	+ WSH
	+ VBScript
	+ JScript
* COM
	+ ActiveX
	+ ActiveX文档（英语：）
	+ COM结构化存储
	+ DCOM
	+ OLE
	+ OLE自动化（英语：）
	+ Transaction Server
* DirectX
* .NET Framework
* Windows Holographic
* Windows Runtime
* 通用Windows平台（UWP）

 |
|  |
| 已經终止 | 

|  |  |
| --- | --- |
| 遊戲 | 
* 3D Pinball
* Chess Titans
* 新接龍
* 傷心小棧
* 中文輸入法練習
* 战鹰!（英语：）
* 筆跡球
* Hold 'Em
* Mahjong Titans
* 踩地雷
* Purble Place
* 黑白棋
* 纸牌
* 連環新接龍
* Tinker

 |
|  |
| 应用程序 | 
* ActiveMovie
* Anytime Upgrade
* 通訊錄（英语：）
* 備份與還原中心
* Cardfile（英语：）
* CardSpace
* 連絡人
* 桌面小工具
* 診斷（英语：）
* DriveSpace
* DVD製作程式
* 傳真（英语：）
* 檔案管理員
* 檔案保護
* 美食
* 健康
* HyperTerminal（英语：）
* Outlook Express
* Windows Mail
* 媒体中心
* 會議空間
* 訊息中心（英语：）
* Messenger
* Mobile裝置中心
* NetMeeting
* 下一代安全计算基础
* NTBackup
* 旅遊
* 相片圖庫
* 程序管理器（英语：）
* WinHelp
* WinSAT
* 小作家
* Windows To Go
* 日记
* Movie Maker

 |
|  |
| 其他 | 
* Windows Services for UNIX
	+ POSIX子系统
	+ Interix（英语：）
* ScanDisk
* Windows視訊
* Windows相片檢視器
* Windows SideShow（英语：）
* 媒體控制介面

 |

 |

 |