注册表
注册表(Registry,台湾、港澳译作登錄檔,中国大陆译作注册表)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。早在Windows 3.0推出OLE技术的时候,注册表就已经出现。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。但是,从Windows 95开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统中继续沿用至今。
目录
数据结构
注册表由键(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的版本变化而不同。尤其是Windows NT系列操作系统和Windows 95系列的存储方式有很大区别。注册表被分成多个文件存储,称为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
Windos95家族的配置文件
名称 | 注册表分支 | 作用 |
---|---|---|
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项下的一个子项之中。[1]
使用脚本
在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系统及应用程序的信息被存储在后缀名为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已经增加了权限的功能,regedt32.exe由于失去作用而被剔除。同时,这个版本的注册表是64位的,这导致了一些兼容性问题,少数可以运行在旧版本Windows的程序在Windows XP中无法运作。
64位Windows的注册表
64位Windows中的注册表结构大致与32位版本相同,但32位程序的信息被放在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node而不是HKEY_LOCAL_MACHINE\SOFTWARE(64位程序的信息放于此处)。
分散与集中之争
关于分散的文本文件和集中的注册表两种软件配置方式的优劣,目前仍有争论。主流操作系统中,Linux操作系统一直使用单独的文本文件来存放配置信息。而Windows平台下基于.NET框架的软件对注册表的依赖性也大大减弱。事实上,.NET软件通常使用纯文本的XML(称为app.config)文件而不是注册表进行配置,这在某种意义上是向当初的ini文本配置方式的一种回归。部分绿色软件支持者认为,集中式的注册表要求软件需要进行专门的安装步骤才可以正常运行,而单独的文本配置文件则可以不需要安装,只要将软件的文件目录拷贝过来就可以使用;当不再需要软件的时候,除删除相关文件外对于注册表也需要进行卸载步骤,才有可能不在系统中留下痕迹(很多软件即使提供了卸载步骤,仍然会留下痕迹),如果使用文本配置文件,则能做得更干净。但是,文本配置方式导致某些系统软件的配置较为困难且缺乏统一的界面(如Linux中的情况),也是不争的事实,尽管现在已经有很多软件可以方便进行系统配置,但仍存在标准不够统一的问题。
著名开源软件Fetchmail的作者Eric S. Raymond在《UNIX编程艺术》一书中有如下叙述[2]:
对比terminfo数据库和Windows注册表,我们发现注册表出名地容易受到错误代码的破坏。这可能会使整个系统都无法使用。即使系统没有瘫痪,但如果破坏本身干扰了专用的注册表编辑工具,恢复工作就会很困难。
从2000年以来部分恶性病毒如熊猫烧香等的破坏情形看,的确存在“破坏本身干扰注册表编辑器”的问题。在某些情况下,病毒程序会监视系统进程列表,并强行关闭名为regedit的任何程序。这使得受损用户难以直接通过编辑注册表进行恢复。
注册表是Windows操作系统的核心,越来越多的黑客程序将攻击对象转向了注册表。一些程序(尤其是恶意程序),为了达到随系统自动启动的目的,会在注册表创建启动项,因此监控注册表能够有效地预防该类恶意程序的攻击。[3]
风险
不当使用“注册表编辑器”可能会造成严重的问题,甚至可能需要重新安装操作系统。无法保证能够顺利解决因不当使用“注册表编辑器”所造成的问题。您必须自行承担使用“注册表编辑器”的风险。建议您在编辑登录前,先行备份。
注释
- ^将配置单元加载到注册表. Microsoft TechNet库. Microsoft Corporation. 2005-01[2013-01-08].
- ^此段文字来自该书简体中文版,繁体版的具体译文可能不同于此。
- ^注册表监控
参考资料
- Windows XP专业版从入门到精通(中文版),Mark Minasi著,王珺、屈马珑等译,ISBN 7-5053-7569-5
- Unix编程艺术(简体中文版),Eric S. Raymond著,姜宏 何源 蔡晓俊 译,电子工业出版社 ISBN 7-121-02116-1
参见
====================================================================================================================================
本文内容
概要
更多信息
注册表说明
《英汉双解微软计算机辞典》(第 5 版)对注册表的定义是:注册表包含 Windows 在运行期间不断引用的信息,例如,每个用户的配置文件、计算机上安装的应用程序以及每个应用程序可以创建的文档类型、文件夹和应用程序图标的属性表设置、系统上存在哪些硬件以及正在使用哪些端口。
注册表取代了 Windows 3.x 和 MS-DOS 配置文件(例如,Autoexec.bat 和 Config.sys)中使用的绝大多数基于文本的 .ini 文件。虽然多个 Windows 操作系统都有注册表,但这些操作系统的注册表存在一些差异。
注册表配置单元 | 支持文件 |
HKEY_LOCAL_MACHINE\SAM | Sam、Sam.log、Sam.sav |
HKEY_LOCAL_MACHINE\Security | Security、Security.log、Security.sav |
HKEY_LOCAL_MACHINE\Software | Software、Software.log、Software.sav |
HKEY_LOCAL_MACHINE\System | System、System.alt、System.log、System.sav |
HKEY_CURRENT_CONFIG | System、System.alt、System.log、System.sav、Ntuser.dat、Ntuser.dat.log |
HKEY_USERS\DEFAULT | Default、Default.log、Default.sav |
注意:通过使用 Windows NT、Windows 2000、Windows XP、Windows Server 2003 和 Windows Vista 中的安全功能,管理员可以控制对注册表项的访问。
下表列出了系统使用的预定义项。项名的最大长度是 255 个字符。
文件夹/预定义项 | 描述 |
HKEY_CURRENT_USER | 包含当前登录的用户的配置信息的根目录。该用户的文件夹、屏幕颜色和“控制面板”设置都存储在这里。这些信息与用户的配置文件相关联。此项有时缩写为“HKCU”。 |
HKEY_USERS | 包含计算机上的所有以活动方式加载的用户配置文件。HKEY_CURRENT_USER 是 HKEY_USERS 的子项。HKEY_USERS 有时缩写为“HKU”。 |
HKEY_LOCAL_MACHINE | 包含特定于计算机的配置信息(用于任何用户)。此项有时缩写为“HKLM”。 |
HKEY_CLASSES_ROOT | 是 HKEY_LOCAL_MACHINE\Software 的子项。存储在这里的信息可确保使用 Windows 资源管理器打开文件时能打开正确的程序。此项有时缩写为“HKCR”。从 Windows 2000 开始,这些信息同时存储在 HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER 项下。HKEY_LOCAL_MACHINE\Software\Classes 项包含可应用于本地计算机上的所有用户的默认设置。HKEY_CURRENT_USER\Software\Classes 项包含覆盖默认设置并且只应用于交互用户的设置。HKEY_CLASSES_ROOT 项提供合并上述两个来源的信息的注册表视图。HKEY_CLASSES_ROOT 还为针对早期版本的 Windows 设计的程序提供这种合并视图。要更改交互用户的设置,必须在 HKEY_CURRENT_USER\Software\Classes 下进行更改,而不是在 HKEY_CLASSES_ROOT 下更改。要更改默认设置,必须在 HKEY_LOCAL_MACHINE\Software\Classes 下进行更改。如果将项写到 HKEY_CLASSES_ROOT 下的一个项,系统会将信息存储在 HKEY_LOCAL_MACHINE\Software\Classes 下。如果将值写到 HKEY_CLASSES_ROOT 下的一个项,并且 HKEY_CURRENT_USER\Software\Classes 下已经存在该项,系统会将信息存储在前面的注册表项下,而不是存储在 HKEY_LOCAL_MACHINE\Software\Classes 下。 |
HKEY_CURRENT_CONFIG | 包含有关本地计算机在系统启动时使用的硬件配置文件的信息。 |
下表列出了 Windows 当前定义和使用的数据类型。值名称的最大大小如下:
- Windows Server 2003、Windows XP 和 Windows Vista:16,383 个字符
- Windows 2000:260 个 ANSI 字符或 16,383 个 Unicode 字符
- Windows Millennium Edition/Windows 98/Windows 95:255 个字符
- Windows NT 4.0/Windows 2000/Windows XP/Windows Server 2003/Windows Vista:可用内存
- Windows Millennium Edition/Windows 98/Windows 95:16,300 字节
名称 | 数据类型 | 描述 |
二进制值 | REG_BINARY | 原始二进制数据。大多数硬件组件信息作为二进制数据存储,以十六进制的格式显示在注册表编辑器中。 |
DWORD 值 | REG_DWORD | 由 4 字节长(32 位整数)的数字表示的数据。设备驱动程序和服务的许多参数都是此类型,以二进制、十六进制或十进制格式显示在注册表编辑器中。与之有关的值是 DWORD_LITTLE_ENDIAN(最不重要的字节在最低位地址)和 REG_DWORD_BIG_ENDIAN(最不重要的字节在最高位地址)。 |
可扩展字符串值 | REG_EXPAND_SZ | 长度可变的数据字符串。这种数据类型包括程序或服务使用该数据时解析的变量。 |
多字符串值 | REG_MULTI_SZ | 多字符串。包含用户可以阅读的列表或多个值的值通常就是这种类型。各条目之间用空格、逗号或其他标记分隔。 |
字符串值 | REG_SZ | 长度固定的文本字符串。 |
二进制值 | REG_RESOURCE_LIST | 一系列嵌套的数组,用于存储硬件设备驱动程序或它控制的某个物理设备所使用的资源列表。此数据由系统检测并写入 \ResourceMap 树,作为二进制值以十六进制的格式显示在注册表编辑器中。 |
二进制值 | REG_RESOURCE_REQUIREMENTS_LIST | 一系列嵌套的数组,用于存储一个设备驱动程序(或其控制的某个物理设备)可以使用的硬件资源列表。系统将此列表的子集写入 \ResourceMap 树。此数据由系统检测,作为二进制值以十六进制的格式显示在注册表编辑器中。 |
二进制值 | REG_FULL_RESOURCE_DESCRIPTOR | 一系列嵌套的数组,用于存储物理硬件设备使用的资源列表。此数据由系统检测并写入 \HardwareDescription 树,作为二进制值以十六进制的格式显示在注册表编辑器中。 |
无 | REG_NONE | 没有任何特定类型的数据。此数据由系统或应用程序写到注册表,作为二进制值以十六进制的格式显示在注册表编辑器中。 |
链接 | REG_LINK | 一个 Unicode 字符串,它命名一个符号链接。 |
QWORD 值 | REG_QWORD | 由 64 位整数数字表示的数据。此数据在注册表编辑器中作为二进制值显示,并且是在 Windows 2000 中引入的。 |
备份注册表
在您编辑注册表之前,导出该注册表中您打算编辑的项,或者备份整个注册表。如果出现问题,则可以按照“还原注册表”部分中的步骤进行操作以将注册表还原为其以前的状态。若要备份整个注册表,请使用“备份”实用工具来备份系统状态。系统状态包括注册表、COM+ 类注册数据库以及启动文件。有关如何使用备份实用工具备份系统状态的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:编辑注册表
若要修改注册表数据,程序必须使用以下 MSDN 网站中定义的注册表函数: 管理员可以通过使用注册表编辑器(Regedit.exe 或 Regedt32.exe)、组策略、系统策略、注册表 (.reg) 文件或通过运行脚本(例如,VisualBasic 脚本文件)来修改注册表。使用 Windows 用户界面
我们建议您使用 Windows 用户界面更改系统设置,而不是手动编辑注册表。但是,在有些情况下,解决产品问题的最佳方法可能是编辑注册表。如果在 Microsoft 知识库中介绍了此问题,应该会有一篇文章详细说明如何编辑注册表来解决该问题。我们建议您严格按照这些说明操作。使用注册表编辑器
警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能会出现严重问题。这些问题可能需要重新安装操作系统才能解决。Microsoft 不能保证可以解决这些问题。修改注册表需要您自担风险。可使用注册表编辑器执行下列操作:
- 查找子树、项、子项或值
- 添加子项或值
- 更改值
- 删除子项或值
- 重命名子项或值
使用组策略
Microsoft 管理控制台 (MMC) 托管可用于管理网络、计算机、服务和其他系统组件的各种管理工具。通过使用“组策略”MMC 管理单元,管理员可以定义应用于计算机或用户的策略设置。您可以在本地计算机上通过使用本地“组策略”MMC 管理单元 Gpedit.msc 实施组策略。您也可以在 Active Directory 中通过使用“Active Directory 用户和计算机”MMC 管理单元实施组策略。有关如何使用组策略的更多信息,请参阅相应的“组策略”MMC 管理单元中的帮助主题。使用注册项 (.reg) 文件
创建包含注册表更改的注册项 (.reg) 文件,然后在要进行更改的计算机上运行该 .reg 文件。您可以手动运行 .reg 文件,也可以通过使用登录脚本运行它。有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:使用 Windows 脚本宿主
Windows 脚本宿主允许您直接在操作系统中运行 VBScript 和 JScript 脚本。您可以创建使用 Windows 脚本宿主方法的 VBScript 和 JScript 文件来删除、读取和写入注册表项和值。有关这些方法的更多信息,请访问下面的 Microsoft 网站:RegDelete 方法
RegRead 方法
RegWrite 方法
使用 Windows Management Instrumentation
Windows Management Instrumentation (WMI) 是 Microsoft Windows 操作系统的一个组件,也是基于 Web 的企业管理 (WBEM) 的 Microsoft 实现。WBEM 是一个行业计划,旨在开发在企业环境中访问管理信息的标准技术。您可以使用 WMI 在企业环境中自动执行管理任务(如编辑注册表)。您可以在具有 Windows 引擎并且能够处理 Microsoft ActiveX 对象的脚本语言中使用 WMI。还可以使用 WMI 命令行实用工具 (Wmic.exe) 来修改 Windows 注册表。有关 WMI 的更多信息,请访问下面的 Microsoft 网站: 有关 WMI 命令行实用工具的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
使用 Windows 控制台注册表工具
您可以使用 Windows 控制台注册表工具 (Reg.exe) 编辑注册表。若要获取 Reg.exe 工具的使用帮助,请在命令提示符处键入 reg /?,然后单击“确定”。还原注册表
若要还原注册表,请使用适当的方法。还原注册表项
若要还原已导出的注册表子项,请双击您在“导出注册表子项”部分中保存的注册项 (.reg) 文件。也可以从备份中还原整个注册表。有关如何还原整个注册表的更多信息,请参见本文中后面的“还原整个注册表”部分。还原整个注册表
若要还原整个注册表,请从备份中还原系统状态。有关如何从备份中还原系统状态的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:注意:备份系统状态还将在 %SystemRoot%\Repair 文件夹中创建注册表文件的更新的副本。如果您在编辑注册表后无法启动 Windows XP,则可以通过执行以下 Microsoft 知识库文章的“第一部分”部分中介绍的步骤,手动替换这些注册表文件。
参考
属性
这篇文章中的信息适用于:
- Windows Vista Enterprise
- Windows Vista Business
- Windows Vista Ultimate
- Windows Vista Home Premium
- Windows Vista Home Basic
- Windows Vista Starter
- Windows Vista Business 64-bit edition
- Windows Vista Ultimate 64-bit edition
- Windows Vista Home Premium 64-bit edition
- Windows Vista Home Basic 64-bit edition
- Windows Vista Enterprise 64-bit edition
- Microsoft Windows Server 2003, Enterprise x64 Edition
- Microsoft Windows Server 2003 Datacenter Edition
- Microsoft Windows Server 2003 Enterprise Edition
- Microsoft Windows Server 2003 Standard Edition
- Microsoft Windows Server 2003 Web Edition
- Microsoft Windows XP Professional x64 Edition
- Microsoft Windows XP Home Edition
- Microsoft Windows XP Professional Edition
- Microsoft Windows XP Media Center Edition 2005 Update Rollup 2
- Microsoft Windows XP Tablet PC Edition
- Microsoft Windows 2000 Server
- Microsoft Windows 2000 Advanced Server
- Microsoft Windows 2000 Professional Edition
- Microsoft Windows NT Server 4.0 Standard Edition
- Microsoft Windows NT Server 4.0 企业版
- Microsoft Windows NT Workstation 4.0 开发员版
- Microsoft Windows 95
- Microsoft Windows Small Business Server 2003 Premium Edition
- Microsoft Windows Small Business Server 2003 Standard Edition
关键字: | kbresolve kbenv kbinfo kbregistry KB256986 |
Windows系统注册表知识完全揭密
作者:佚名 转贴自:天极论坛 点击数:4825
Windows 注册表是帮助Windows控制硬件、软件、用户环境和Windows界面的一套数据文件,注册表包含在Windows目录下两个文件system.dat和user.dat里,还有它们的备份system.da0和user.da0。通过Windows目录下的regedit.exe程序可以存取注册表数据库。在以前,在windows的更早版本(在Win95以前),这些功能是靠win.ini,system.ini和其他和应用程序有关联的.ini文件来实现的.
在windows操作系统家族中,system.ini和win.ini这两个文件包含了操作系统所有的控制功能和应用程序的信息,system.ini管理计算机硬件而win.ini管理桌面和应用程序。所有驱动、字体、设置和参数会保存在.ini文件中,任何新程序都会被记录在.ini文件中。这些记录会在程序代码中被引用。因为受win.ini和system.ini文件大小的限制,程序员添加辅助的.INI文件以用来控制更多的应用程序。举例来说,微软的Excel有一个office excel.ini文件,它包含着选项、设置、缺省参数和其他关系到Excel运行正常的信息。在system.ini和win.ini中只需要指出excel.ini的路径和文件名即可。
早在Dos和Win3.x的时代,大部分的应用程序都是采用了 ini 文件(初始化文件)来保存一些配置信息,如设置路径,环境变量等。system.ini和win.ini控制着所有windows和应用程序的特征和存取方法,它在少数的用户和少数应用程序的环境中工作的很好。随着应用程序的数量和复杂性越来越大,则需要在.ini文件中添加更多的参数项。
这样下来,在一个变化的环境中,在应用程序安装到系统中后,每个人都会更改.ini文件。然而,没有一个人在删除应用程序后删除.ini文件中的相关设置,所以system.ini和win.ini这个两个文件会变的越来越大。每增加的内容会导致系统性能越来越慢。而且每次应用程序的升级都出现这样的难题:升级会增加更多的参数项但是从来不去掉旧的设置。而且还有一个明显的问题,一个.ini文件的最大尺寸是64KB。为了解决这个问题,软件商自己开始支持自己的.ini文件,然后指向特定的ini文件如win.ini和system.ini文件。这样下来多个.ini文件影响了系统正常的存取级别设置。如果一个应用程序的.ini文件和WIN.INI文件设置起冲突,究竟是谁的优先级更高呢?
注册表最初被设计为一个应用程序的数据文件相关参考文件,最后扩展成对于32位操作系统和应用程序包括了所有功能下的东东。注册表是一套控制操作系统外表和如何响应外来事件工作的文件。这些“事件”的范围从直接存取一个硬件设备到接口如何响应特定用户到应用程序如何运行等等。注册表因为它的目的和性质变的很复杂,它被设计为专门为32位应用程序工作,文件的大小被限制在大约40MB。利用一个功能强大的注册表数据库来统一集中地管理系统硬件设施,软件配置等信息,从而方便了管理,增强了系统的稳定性。最直观的一个实例就是,为什么windows下的不同用户可以拥有各自的个性化设置,如不同的墙纸,不同的桌面。这就是通过注册表来实现的。
由此可见,注册表(Registry)是Windows9x/Me/NT/2000操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”;是一个巨大的树状分层的数据库。它记录了用户安装在机器上的软件和每个程序的相互关联关系;它包含了计算机的硬件配置,包括自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据等。
一、注册表都做些什么?
注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件。16位驱动在Windows NT下无法工作,所以所有设备都通过注册表来控制,一般这些是通过BIOS来控制的。在Win9x下,16位驱动会继续以实模式方式设备工作,它们使用system.ini来控制。16位应用程序会工作在NT或者Win9x 下,它们的程序仍然会参考win.ini和system.ini文件获得信息和控制。
在没有注册表的情况下,操作系统不会获得必须的信息来运行和控制附属的设备和应用程序及正确响应用户的输入。
在系统中注册表是一个记录32位驱动的设置和位置的数据库。当操作系统需要存取硬件设备,它使用驱动程序,甚至设备是一个BIOS支持的设备。无BIOS支持的设备安装时必须需要驱动,这个驱动是独立于操作系统的,但是操作系统需要知道从哪里找到它们,文件名、版本号、其他设置和信息,没有注册表对设备的记录,它们就不能被使用。
当一个用户准备运行一个应用程序,注册表提供应用程序信息给操作系统,这样应用程序可以被找到,正确数据文件的位置被规定,其他设置也都可以被使用。
注册表保存关于缺省数据和辅助文件的位置信息、菜单、按钮条、窗口状态和其他可选项。它同样也保存了安装信息(比如说日期),安装软件的用户,软件版本号和日期,序列号等。根据安装软件的不同,它包括的信息也不同。
然而,一般来说,注册表控制所有32位应用程序和驱动,控制的方法是基于用户和计算机的,而不依赖于应用程序或驱动,每个注册表的参数项控制了一个用户的功能或者计算机功能。用户功能可能包括了桌面外观和用户目录。所以,计算机功能和安装的硬件和软件有关,对所以用户来说项都是公用的。
有些程序功能对用户有影响,有些时作用于计算机而不是为个人设置的,同样的,驱动可能是用户指定的,但在很多时候,它们在计算机中是通用的。
二、注册表的结构划分及相互关系
WINDOWS的注册表有六大根键,相当于一个硬盘被分成了六个分区。
在“运行”对话框中输入RegEdit,然后单击“确定”按钮,则可以运行注册表编辑器。
Windows 98中文版的注册表Registry(System.dat、User.dat、Config.pol)的数据组织结构。
注册表的根键共六个。这些根键都是大写的,并以HKEY_为前缀;这种命令约定是以Win32 API的Registry函数的关键字的符号变量为基础的。
虽然在注册表中,六个根键看上去处于一种并列的地位,彼此毫无关系。但事实上,HKEY_CLASSES_ROOT和HKEY_CURRENT_CONFIG中存放的信息都是HKEY_LOCAL_MACHINE中存放的信息的一部分,而HKEY_CURRENT_USER中存放的信息只是HKEY_USERS存放的信息的一部分。
HKEY_LOCAL_MACHINE包括HKEY_CLASSES_ROOT和HKEY_CURRENT_USER中所有的信息。在每次系统启动后,系统就映射出HKEY_CURRENT_USER中的信息,使得用户可以查看和编辑其中的信息。
实际上,HKEY_LOCAL_MACHINE\SOFTWARE\Classes就是HKEY_CLASSES_ROOT,为了用户便于查看和编辑,系统专门把它作为一个根键。同理,HKEY_CURRENT_CONFIG\SY-STEM\Current Control就是HKEY_LOCAL_MACHINE\SYSTEM\Current Control。
HKEY_USERS中保存了默认用户和当前登录用户的用户信息。HKEY_CURRENT_USER中保存了当前登录用户的用户信息。
HKEY_DYN_DATA保存了系统运行时的动态数据,它反映出系统的当前状态,在每次运行时都是不一样的,即便是在同一台机器上。
根据上面的分析,注册表中的信息可以分为HKEY_LOCAL_MACHINE和HKEY_USERS两大类,这两大类的详细内容请看后面的介绍。
三、六大根键的作用
在注册表中,所有的数据都是通过一种树状结构以键和子键的方式组织起来,十分类似于目录结构。每个键都包含了一组特定的信息,每个键的键名都是 和它所包含的信息相关的。如果这个键包含子键,则在注册表编辑器窗口中代表这个键的文件夹的左边将有“+”符号,以表示在这个文件夹中有更多的内容。如果这个文件夹被用户打开了,那么这个“+”就会变成“-”。
1.HKEY_USERS
该根键保存了存放在本地计算机口令列表中的用户标识和密码列表。每个用户的预配置信息都存储在HKEY_USERS根键中。HKEY_USERS是远程计算机中访问的根键之一。
2.HKEY_CURRENT_USER
该根键包含本地工作站中存放的当前登录的用户信息,包括用户登录用户名和暂存的密码(注:此密码在输入时是隐藏的)。用户登录Windows 98时,其信息从HKEY_USERS中相应的项拷贝到HKEY_CURRENT_USER中。
3.HKEY_CURRENT_CONFIG
该根键存放着定义当前用户桌面配置(如显示器等)的数据,最后使用的文档列表(MRU)和其他有关当前用户的Windows 98中文版的安装的信息。
4.HKEY_CLASSES_ROOT
根据在Windows 98中文版中安装的应用程序的扩展名,该根键指明其文件类型的名称。
在第一次安装Windows 98中文版时,RTF(Rich Text format)文件与写字板(WordPad)&127;联系起来,但在以后安装了中文Word 6.0后,双击一个RTF文件时,将自动激活Word。存放在SYSTEM.DAT中的HKEY_CLASSES_ROOT,将替代WIN.INI文件中的[Extensions]&127;小节中的设置项,它把应用程序与文件扩展名联系起来,它也替代了Windows 3.x中的Reg.dat文件中的相似的设置项。
5.HKEY_LOCAL_MACHINE
该根键存放本地计算机硬件数据,此根键下的子关键字包括在SYSTEM.DAT中,用来提供HKEY_LOCAL_MACHINE所需的信息,或者在远程计算机中可访问的一组键中。
该根键中的许多子键与System.ini文件中设置项类似。
6.HKEY_DYN_DATA
该根键存放了系统在运行时动态数据,此数据在每次显示时都是变化的,因此,此根键下的信息没有放在注册表中。
四、注册表部分重要内容
注册表是一个大型数据库Registry。要详细地分析该数据库,不是一两页就能介绍完。我曾经用了半年多时间分析此数据库结构。下面只介绍部分重要内容。
(一)HKEY_CLASS_ROOT
1.HKEY_CLASS_ROOT/Paint.Pricture/DefaultIcon双击窗口右侧的默认字符串,在打开的对话框中删除原来的“键值”,输入%1。重新启动后,在“我的电脑”中打开Windows目录,选择“大图标”,然后你看到的Bmp文件的图标再也不是千篇一律的MSPAINT图标了,而是每个Bmp文件的略图(前提是未安装ACDSee等看图软件)。
(二)HKEY_CURRENT_USER
1.HKEY_CURRENT_USER\Control Panel\Desktop 中新建串值名MenuShowDelay=0 可使“开始”菜单中子菜单的弹出速度提高。
2.在HKEY_CURRENT_USER\Control Panel\Deskt-op\WindowsMeterics中新建串值名MinAnimate,值为1启动动画效果开关窗口,值为0取消动画效果。
(三) HKEY_LOCAL_MACHINE
1.HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\explorer\user shell folders 保存个人文件夹、收藏夹的路径。
2.HKEY_LOCAL_MACHINE\system\currentControl-Set\control\keyboard Layouts 保存键盘使用的语言以及各种中文输入法。
3.HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\uninstall 保存已安装的Windows应用程序卸载信息。
4.HKEY_LOCAL_MACHINE\system\CurrentControl-Set\services\class 保存控制面板-增添硬件设备-设备类型目录。
5.HKEY_LOCAL_MACHINE\system\Current-ControlSet\control\update 设置刷新方式。值为00设置为自动刷新,01设置为手工刷新[在资源管理器中按F5]。
6.HKEY_LOCAL_MACHINE\software\microsoft\win-dows\currentVersion\run 保存由控制面板设定的计算机启动时运行程序的名称,其图标显示在任务条右边。在“启动”文件夹程序运行时图标也在任务条右边。
7.HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\Policies\Ratings 保存IE4.0中文版“安全”\“分级审查”中设置的口令(数据加密),若遗忘了口令,删除 Ratings 中的数据即可解决问题。
8.HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\explorer\desktop\nameSpace 保存桌面中特殊的图标,如回收站、收件箱、MS Network等。
(四) HKEY_USERS
1.HKEY_USERS\.Default\software\microsoft\internet explorer\typeURLs保存IE4.0浏览器地址栏中输入的URL地址列表信息。清除文档菜单时将被清空。
2.HKEY_USERS\.Default\so..\mi..\wi..\current-Version\ex..\menuOrder\startMenu保留程序菜单排序信息。
3.HKEY_USERS\.Default\so..\microsoft\windows\current-Version\explorer\RunMRU保存“开始 \ 运行...”中运行的程序列表信息。清除文档菜单时将被清空。
4.HKEY_USERS\.Default\so..\microsoft\windows\current-Version\explorer\RecentDocs 保存最近使用的十五个文档的快捷方式(删除掉可解决文档名称重复的毛病),清除文档菜单时将被清空。
5.HKEY_USERS\.default\software\microsoft\windows\currentVersion\applets 保存Windows应用程序的记录数据。
6.HKEY_USERS\.default\software\microsoft\windows\currentVersion\run保存由用户设定的计算机启动时运行程序的名称,其图标显示在任务条右侧。
五、与注册表有关的术语:
①、注册表:是一个树状分层的数据库。从物理上讲,它是System.dat和User.dat两个文件;从逻辑上讲,它是用户在注册表编辑器中看到的配置数据。
②、HKEY :“根键”或“主键”,它的图标与资源管理器中文件夹的图标有点儿相像。Windows98将注册表分为六个部分,并称之为 HKEY_name,它意味着某一键的句柄。
③、key(键):它包含了附加的文件夹和一个或多个值。
④、subkey(子键):在某一个键(父键)下面出现的键(子键)。
⑤、branch(分支):代表一个特定的子键及其所包含的一切。一个分支可以从每个注册表的顶端开始,但通常用以说明一个键和其所有内容。
⑥、value entry(值项):带有一个名称和一个值的有序值。每个键都可包含任何数量的值项。每个值项均由三部分组成:名称,数据类型,数据。
★ 名称:不包括反斜杠的字符、数字、代表符、空格的任意组合。同一键中不可有相同的名称。
★ 数据类型:包括字符串、二进制、双字三种。
字符串(REG_SZ):顾名思义,一串ASCII码字符。如“Hello World”,是一串文字或词组。在注册表中,字符串值一般用来表示文件的描述、硬件的标识等。通常它由字母和数字组成。注册表总是在引号内显示字符串。
二进制(REG_BINARY):如 F03D990000BC ,是没有长度限制的二进制数值,在注册表编辑器中,二进制数据以十六进制的方式显示出来。
双 字(REG_DWORD):从字面上理解应该是Double Word ,双字节值。由1-8个十六进制数据组成,我们可用以十六进制或十进制的方式来编辑。如 D1234567 。
★ 数据: 值项的具体值,它可以占用到64KB。
⑦、 Default(缺省值):每一个键至少包括一个值项,称为缺省值(Default),它总是一个字串。