zoukankan      html  css  js  c++  java
  • 10#Windows注册表的那些事儿

    引言

       用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用。笔者是做软件开发的,使用的基本都是Windows系统,然而正正对其的了解也是寥寥无几,所以想乘此机会来对Windows系统进行一个系统的学习。

       善于维护电脑的人都常常会用到优化软件,然而我在使用优化软件的时候常常在想它优化的是那一部分?如果我知道了它优化的是哪一部分内容,那么我自己为什么不能使用软件的方式去实现它,当然这里我是说了一个大话,实现一个好的优化软件需要了解的知识远远在系统之上,希望读者不要见笑。

       其实我们在使用Windows系统的时候,多多少少都会遇到一些系统方面的问题,比如IE出现严重问题了,而又不能彻底卸载重装等等(这或许是Windows一个鸡肋所在,所有组件依赖性太强),当然在网上收集到的在设置层面无法解决的终极解决方案无过于就是直接进行注册表的修改等等,所以适当的了解了解注册表还是有必要的。

    注册表简介

       “注册表”是Windows系统的核心所在,早在Windows 3.0的时候就已经提出了注册表的概念,在后来的Windows版本中被广泛深度应用,直到现在的Windows XP,Windows 7中依旧被应用。

       说的确切一点,注册表就是Windows系统的核心数据库(数据库这个概念这里不做特殊讲解,其实就是一系列有组织的存储数据的文件),存放了Windows系统中的各种参数,包括软硬件的配置信息等重要数据,直接控制Windows系统的各种应用,所以说注册表是Windows的核心。

       对于一个Windows应用程序来说,注册表通常保存着硬件驱动的程序配置信息等,保存着用程序的位置信息、菜单数据、按钮工具、窗口状态等其他配置信息,同时还保存着安装信息、软件用户版本号、序列号等,以及其他Windows依赖的信息。所以注册表对于Windows系统至关重要,通常情况无必要就不要随便去动它;如果其遭到破坏或缺省就可能直接导致系统崩溃。大多数情况下,Windows系统的病毒都是通过破坏注册表来破坏你的Windows系统,导致你不得不重做系统。

    1.注册表数据文件

       注册表从功能上来讲分为系统注册表和用户注册表两类,注册表其实是一个数据文件。以Windows XP系统为例,系统默认设置和缺省用户配置数据存放在WINDOWSsystem32config文件夹下的default、SAM、SECURITY、software、userdiff和system六个文件中,而用户配置信息存放在“我的文档”(即当前用户文档目录中)文件夹下的ntuser.dat、ntuser.ini和ntuser.dat.log文件中(通常情况下这些文件是被隐藏的)。

       实质上对注册表中数据的操作对应与多上述文件的读写操作。

    2.注册表数据结构

       注册表以一种层次数据结构的组织方式进行组建,其数据主要是有注册表项(数据项,也成为键)组成的,当然一个键下包括可以包括多个其他的键,称为子健或子项。当然每个项都对应一个项值列表,列表主要包含名称、类型和数据值三种信息,通常情况下只有最底层的数据项包含一个值列表,其实值列表中保存的就是具体的注册表信息,项组成了其构造值的索引指向。或许有点模糊,不过你可以使用“regedit.exe”工具来查看注册表的具体结构信息,就会一目了然。

       下面介绍一下值列表的具体结构,值列表由名称、数据类型、数据值三部分组成,其中名称和数据值都是灵活的,名称就是一种标识,而值则是具体的数据内容,一般情况下就是一个命令语句或者一个对其它键的引用,而数据类型则是固定的,如下表:

    显示类型 描述类型 说明
    REG_SZ 字符串类型 表示值是一个文本字符串(最多256字节)
    REG_BINARY 二进制类型 表示值是二进制数值,以十六进制方式展示(1位)
    REG_DWORD DWORD(双字)类型 表示值是32位的二进制值,以十六进制方式展示(8字节)
    REG_MULTI_SZ 多字符串类型 表示值是长文本字符串
    REG_EXPAND_SZ 可扩充字符串类型 表示值是包含其他引用方式,例如环境变量等

    其中每个值记录中的数据值都必须与其指定的数据类型一致,否则可能会导致应用时错误。可以使用“regedit.exe”工具查看一下任意一个键的值列表信息,不过也有一个规律就是无名称的值记录都将会作为当前键的默认命令操作。

    3.注册表缺省项介绍

       注册表作为Windows核心,则必定随Windows系统构建而生成,最起码Windows的大多数应用要依赖与它。所以Windows定义来大多数的缺省项信息,用于直接指示Windows的引用信息。以XP系统为例,下面来简单介绍一下五大主项的作用。

       “HKEY_CLASSES_ROOT”,简写“HKCR”,是Windows类型系统的根结构,其中保存了各种Windows对象类型,包括文件类型、目录等的操作,例如打开方式等。同时还用于保存注册的Windows对象类型配置信息、版本信息等。Windows中“文件夹选项”模块中的“文件类型”中的设置对应在这个模块。

       “HKEY_LOCAL_MACHINE”,简写“HKLM”,是Windwos本机系统的根结构,其中保存了本地计算机的软硬件环境等信息。包括硬件驱动的配置信息、系统默认软件以及自定义安装软件的配置信息和环境信息等。Windows中的系统环境变量就保存在这个模块。

       “HKEY_USERS”,简写“HKU”,是Windows系统缺省用户的通用信息配置根结构,虽然Windows内的信息可以安装不同的用户继续权限划分,但是还是存在共同的信息的,这些所有用于共用的信息都配置在该模块下。

       “HKEY_CURRENT_USER”,简写“HKCU”,是Windows系统当前用户的信息配置根结构,一般情况下为“超级管理员”用户的配置信息。Windows中的软件安装信息、开始菜单信息等都出现在这个模块。

       “HKEY_CURRENT_CONFIG”,简写“HKCC”,是Windows当前配置的根结构,主要保存了一些硬件配置信息。

    注册表编程

       虽然注册表具有一定的权威性,但是只要知道某些常用键的位置,知道其值的特点和用法,也可以尝试自行修改注册表,来优化自己的电脑。当然在修改前一定要做好备份。下面来介绍一下Windows XP系统下常用的注册表修改方式。

    1.注册表编辑器

       注册表是Windows系统的核心信息数据库,在体现上是具有层次性的,在不同的机器上注册表的基本结构是相同的,其中的复杂数据会以不同的方式组合产生出一个绝对唯一的注册表。

       Windows系统自身默认提供了“regedit.exe”的注册表管理工具,(XP下有“regedit.exe”和“regedt32.exe”两种工具,其实指向的是一个工具),这个工具称为“注册表编辑器”,该工具存在WINDOWSsystem32目录中,可以通过在“运行”窗口或命令行窗口中输入名称进行启动。

       Windows注册表编辑器支持的功能较多,主要是以树形结构进行的注册表项的展示。支持新增项、新增和修改键值、删除项和键值等操作,还提供有复杂的授权操作等,其中较为重要的一个功能是支持导出注册表文件。这也是接下来要介绍的注册表文件。(更多的功能可以自行摸索使用)

    2.注册表文件

       注册表文件是一种保存注册表项及项值信息的文件,在Windows系统下以“.reg”作为扩展名。通常情况下“注册表编辑器”导出的文件就是一个注册表文件,在默认情况下双击一个注册表文件则可以导入到注册表中(这与注册表文件默认打开方式有关)。

       注册表文件是有一定语法规律的,可以使用注册表编辑器导出任意一个注册表项进行查看,其中可以分为声明、项定位、值列表三个部分。例如Windows XP系统中“HKEY_CLASSES_ROOT”下的“.txt”项的注册表文件构建:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT.txt]
    @="txtfile"
    "Content Type"="text/plain"
    "PerceivedType"="text"
    [HKEY_CLASSES_ROOT.txtPersistentHandler]
    @="{5e941d80-bf96-11cd-b579-08002b30bfeb}"
    [HKEY_CLASSES_ROOT.txtShellNew]
    "NullFile"=""

       其中第一个局为声明语句,表示当前文件为一个注册表文件,当然早期Windows系统可能声明部分不一样。其后有一个空行,然后是键的定义,使用“[]”引用键,使用“”进行上下层级分割,接下来可以看到的是值列表,其中使用"名称"="值"的方式,可以看成一个注册表文件的结构还是比较简单的。

    2.1.注册表文件的结构

    从上面的列子可以大概了解注册表文件的基本结构。注册表文件分为声明、内容两个部分,内容分为项和项值两个部分。基本结构如下:

    声明部分

    [项子项...]

    名称=值

    ……

    其中声明部分,各个版本的Windwos系统可能不太一致,在早期版本中主要使用“REGEDIT4”作为声明内容,而在XP后的版本中使用“Windows Registry Editor Version 5.00”作为声明内容。项部分使用“[]”括起来,并且使用“”作为项和子项之间的分隔符,项值部分则使用键值对的方式进行表述“名称=值”,注意一般情况下名称和值需要使用“""”括起来。总结一下注册表文件的规则:

    1.必须包含声明部分和内容部分,内容包括键部分和值部分。

    2.声明部分或多个内容部分通常情况下使用空行进行分割(非必须)。

    3.键部分必须使用“[]”引用并且键与子键之间使用“”进行层次关系分割,其中主键不能使用简写。

    4.值部分使用“名称=值”的键值对方式进行描述,通常情况下值和名称需要使用“""”引用。

    5.在定义值部分前必须要指定当前值所属的键路径,也就是说项部分不可缺少,紧接着项部分的值部分为当前项下的描述信息。

       上面介绍了注册表的值部分其实是一个多类型的列表结构,所以注册表文件中的值部分其实也是有多种表现形式的。其中名称部分使用“@”表示默认值(“@”不实用引号);值部分使用“hex:”前缀表示二进制格式的值,即“REG_BINARY”类型的值,使用“dWord:”前缀表示32位进制格式的值,即“REG_DWORD”类型的值,而默认情况下则表示字符串。表述方式如下:

    [项子项...]    (项路径描述)

    "名称"="值"     (字符串型键值描述)

    "名称"=hex:值   (二进制型键值描述)

    "名称"=dword:值 (DWORD型键值描述)

    其中当名称为“@”时表示当前项为其键的默认值,此时不能使用“""”。

    2.2.新增或修改注册内容操作

       上面介绍了注册表文件的基本结构和语法,下面来看注册表文件所支持的新增注册表操作。对注册表的新增操作基本上分为两种,一种是新增子项,另一种是新增值。其实过程都差不多,上面已经了解了注册表文件的基本结构,看下面的新增例子,在“HKEY_CLASSES_ROOT”下的“.test”子项(仅供参考):

    1
    2
    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT.test]

    保存为“.reg”文件后双击即可导入注册表,在“regedit.exe”工具中可以看到注册表中“HKEY_CLASSES_ROOT”主键下已经添加了一个名为“.test”的子项,其内容为空。

       下面来看一下如何添加注册表项的内容,还以上例为进行说明:

    1
    2
    3
    4
    5
    6
    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT.test]
    @="Test File"
    [HKEY_CLASSES_ROOT.testshellopenCommand]
    @=""C:\Common Software\EverEdit\everedit.exe" "%1""
    "Notepad.exe"="C:\WINDOWS\NOTEPAD.EXE %1"

    注意上面的内容主要是定义“.test”文件的打开方式,保存为“.reg”文件并导入注册表,可以看出在“HKEY_CLASSES_ROOT”的“.test”子健下创建了默认内容,已经添加了“open”子健、“open”子健下又添加了“Command”子健,其值内容包括默认值和“Notepade.exe”两个值。

       实质上,在新增注册表项的时候,首先要确定注册表项的内容,值类型等,然后在按照注册表文件结构规律进行编写即可,导入后即可看到效果。从上面的例子可以看成,值中可以使用“”作为转义字符,转义一些特殊的符号,例如“"”、“”等,当值为二进制的类型时必须使用指定的前缀,并且不需要使用引号引用。

       如果上述所描述的注册表项或值存在则将进行修改操作。

    2.3.删除注册内容操作

       上面介绍了新增注册表项的操作,其实就是按照注册表文件的格式进行内容编写,然后导入即可。然而注册表文件不仅仅支持新增操作,同时还支持删除操作,使用注册表文件删除项或值需要借助"-"符号来标明,也分为对值的删除和对项的删除。还是以上面的内容为例,下面来删除上面的顶一个“.test”测试注册表内容:

    1
    2
    3
    4
    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT.testshellopenCommand]
    @=-
    "Notepad.exe"=-

    保存为注册表文件后并导入,可以看出“Command”注册表下的默认值和“Notepad.exe”值被删除,所以可以看成删除值的语法比较简单,只需要在将名称后的值改写为“-”符号即可。如下:

    [项子项...]

    "名称"=-

    这样只是删除了项下面的对应值信息,如何删除项呢?来看下面的例子:

    1
    2
    Windows Registry Editor Version 5.00
    [-HKEY_CLASSES_ROOT.testshellopenCommand]

    保存为注册表文件并导入,可以看出“Command”键被删除,所以删除一个项只需要在项定位前加上“-”符号即可。如下:

    [-项子项...]

    这个地方需要注意的是,此操作首先会删除该项下的值列表,然后在删除该项。

    3.Reg命令行

       在Windows系统中还存在另一种操作注册表的工具——是由MS-DOS提供的“reg.exe”外部命令行工具,称为“Windows控制台注册表工具”,它对注册表的管理仅此于注册表编辑器,因为注册表编辑器是图形界面操作较为方便,因此这个MS-DOS命令行很少有人了解,有了这个命令我们就可以直接使用命令行或者批处理文件来管理注册表信息。

       “reg”是Windows提供的注册表管理工具,位于“WINDOWSsystem32 eg.exe”,是基于MS-DOS实现的,作为MS-DOS的外部命令扩展。可以通过“reg /?”来查看该命令的使用方式说明。“reg”命令行工具的使用语法如下:

    reg Operation [参数列表]

    “reg”命令通过指定的子命令来实现对注册表的管理操作,其中操作子命令“Operation”必须指定,参数列表是当前子命令所支持的参数列表,主要用于定位搜索指定参数的注册表对象。“Operation”所支持的子命令操作如下表:

    操作名称 描述
    query 注册表信息查找,可以对所有或单个主键下注册表信息进行查找
    add 注册表信息新增,新增指定的信息到注册表中
    delete 删除注册表信息,删除某个指定项
    copy 复制注册表信息,可以将某个项下的信息复杂到指定的项
    save 备份注册表信息,可以将某个项的信息保存为文件(.hiv),与restore作用向逆
    restore 还原注册表信息,可以将备份的注册表信息还原到注册表中,与save作用向逆
    load 加载注册表信息,可以将备份的注册信息加载到注册表中
    unload 卸载注册表信息,可以将某个项配置信息进行卸载,使其失去作用
    compare 注册表信息比较,可以将两个注册表项下的信息进行比较
    export 导出注册表信息,可以将注册表信息导出到注册表文件中(.reg)
    import 导入注册表信息,可以将注册表文件导入到注册表中

    上面所列出的是“reg”命令所支持的注册表操作子命令选项。其中可以使用“reg 选项 /?”来查看具体选项的使用方法和说明。其中除了“compare”操作外,其他的操作都会返回0或1两个操作代码,0表示操作成功,1表示操作失败;而“compare”操作将返回0、1或2三个操作代码,0表示操作成功,但是比较的内容相同,2表示操作成功,但是比较的内容不同,1则表示操作失败。下面将一一介绍各个命令操作。

    3.1.注册表查找——reg query

       “reg query”命令用于返回注册表子项下的项或下一层子项的列表。用法如下:

    reg query KeyName [/v ValueName | /ve] [/s]

    “KeyName”的格式为"[\Machine]RootKey[SubKey]" ,由主机名和项层次组成,通过组合方式来指定子项的完全路径地址,如果省略“Machine”则默认表示对本机进行操作。其中“RootKey”表示主键,在本机上所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) "、“HKCU(HKEY_CURRENT_USER)”、“HKCR(HKEY_CLASSES_ROOT)”、“HKU(HKEY_USERS)”和“HKCC(HKEY_CURRENT_CONFIG)”五个,远程机所支持的主键只有“HKLM(HKEY_LOCAL_MACHINE) "和“HKU(HKEY_USERS)”两个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。

    “/v [ValueName]”表示通过指定的值名称来查找特定的注册表项,其中“/v”是选项操作,“ValueName”表示所有查找的值的名称,如果省略值名称则将查找所有的值项;“/ve”选项表示查找该子项默认值或空白名称项。

    “/s”选项表示查找所有的子项和值,如果不实用该选择则仅查找当前项下的下一层子项和项。

       “reg query”操作默认有0和1两种操作代码返回,其中0表示操作成功,1表示操作失败。如果成功则会列出所查找的结果内容。来看下面的例子:

    1
    2
    reg query "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager" /s
    reg query "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment" /v JAVA_HOME

    其中第一条命令用于查看“Session Manager”项下的所有项和值列表,第二条语句用于查找“Environment”项下名称为“JAVA_HOME”的值信息。

    3.2.新增注册表——reg add

       “reg add”命令用于将新的子项或值添加到注册表中,或者使用新的值去覆盖原有的值信息。用法如下:

    reg add KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f]

    “KeyName”的格式为"[\Machine]RootKey[SubKey]" ,由主机名和项层次组成,通过组合方式来指定子项的完全路径地址,如果省略“Machine”则默认表示对本机进行操作。其中“RootKey”表示主键,在本机上所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) "、“HKCU(HKEY_CURRENT_USER)”、“HKCR(HKEY_CLASSES_ROOT)”、“HKU(HKEY_USERS)”和“HKCC(HKEY_CURRENT_CONFIG)”五个,远程机所支持的主键只有“HKLM(HKEY_LOCAL_MACHINE) "和“HKU(HKEY_USERS)”两个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。

    “/v ValueName”选项用于指定添加到该项下的值项名称,“ValueName”表示指定的名称;“/ve”选项用于指定添加到该项下的值项名称为空,即添加默认值。

    “/t Type”选项用于指定新增值项的数据类型,其中“Type”的值是固定的,包括“REG_SZ”、“REG_MULTI_SZ”、“REG_DWORD_BIG_ENDIAN”、“REG_DWORD ”、“REG_BINARY”、“REG_DWORD_LITTLE_ENDIAN ”、“REG_NONE”和“REG_EXPAND_SZ”。如果省略该选项,则默认类型为“REG_SZ”。

    “/s Separator”选项用于指定用于分割多个数据值的分割符号,当值类型为“REG_MULTI_SZ”需要使用该操死,如果省略该选项,默认使用“”符号进行分割。

    “/d Date”用于指定值项中的数据值内容。值内容中可以使用“”进行字符转义,对特殊符号“"”或“”等进行转义;还可以使用“%xx%”来引用系统环境变量。

    “/f”选项表示强制改写注册表信息,默认情况下需要提示确认后才进行改写

       使用“reg add”命令不能够单纯的新增一个子项,也就是说如果要新建子项必须要指定子项的值项才可以;如果指定的值项存在则使用当前信息覆盖原始信息。来看下面的例子:

    1
    reg add "hkcr.test" /v test /t reg_sz /d "test"

    例子表示在“hkcr”主键下添加一个“.test”子键并指定其一个值项信息。

    3.3.删除注册表——reg delete

       “reg delete”命令用于删除项或删除项下的值项,此操作属于彻底删除注册表内容,在使用前请做好备份。用法如下:

    reg delete KeyName [/v ValueName | /ve | /va] [/f]

    “KeyName”的格式为"[\Machine]RootKey[SubKey]" ,由主机名和项层次组成,通过组合方式来指定子项的完全路径地址,如果省略“Machine”则默认表示对本机进行操作。其中“RootKey”表示主键,在本机上所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) "、“HKCU(HKEY_CURRENT_USER)”、“HKCR(HKEY_CLASSES_ROOT)”、“HKU(HKEY_USERS)”和“HKCC(HKEY_CURRENT_CONFIG)”五个,远程机所支持的主键只有“HKLM(HKEY_LOCAL_MACHINE) "和“HKU(HKEY_USERS)”两个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。如果不指定值项信息则直接删除该项内容。

    “/v ValueName”选项用于指定要删除的项下的值项名称,“ValueName”表示指定的名称;“/ve”选项表示删除项值名称为空白名称的值,即删除默认值;“/va”选项表示删除该项下的所有值。

    “/f”选项表示强制删除注册表信息,默认情况下需要提示确认后才进行删除。

       使用“reg delete”命令可以删除子项或子项下的指定名称的值项,如果不知道值项则表示删除该子项内容,删除该子项内容时会首先删除其下的值项信息。来看下面的例子:

    1
    2
    reg delete "hkcr.test" v test
    reg delete "hkcr.test"

    例子中第一条语句用于删除“hkcr”主键下“.test”子键下名称为“test”的值项,第二条语句用于直接删除“hkcr”主键下“.test”子键。

    3.4.导出注册表——reg export

       “reg export”命令用于导出注册表信息,可以将指定的项或子项导出到指定名称的注册表文件(“.reg”文件)中。用法如下:

    reg export KeyName FileName

    “KeyName”的格式为"[\Machine]RootKey[SubKey]" ,由主机名和项层次组成,通过组合方式来指定子项的完全路径地址,如果省略“Machine”则默认表示对本机进行操作。其中“RootKey”表示主键,在本机上所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) "、“HKCU(HKEY_CURRENT_USER)”、“HKCR(HKEY_CLASSES_ROOT)”、“HKU(HKEY_USERS)”和“HKCC(HKEY_CURRENT_CONFIG)”五个,远程机所支持的主键只有“HKLM(HKEY_LOCAL_MACHINE) "和“HKU(HKEY_USERS)”两个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。

    “FileName”表示要导出并生成的文件名称。常见的导出文件扩展名为“.reg”。

       “reg export”命令用于将注册表中的项信息导出为指定的注册表文件,导出的信息与注册表文件结构一致。来看下面的例子:

    1
    reg export hkcr* C:d.reg

    例子表示将“hkcr”主键下的“*”子键的注册信息导出到“C:d.reg”文件中,其中“d.reg”文件就是注册表文件。

    3.5.导入注册表——reg import

       “reg import”命令用于导入注册表信息,可以将指定的注册表文件(通常为“.reg”文件)读取并写入注册表中。用法如下:

    reg import FileName

    “FileName”表示要导入的注册表文件,其通常为“.reg”注册表文件,内容结构必须符合注册表文件结构。

       “reg import”操作与“reg export”操作是互逆的操作,用于将符合注册表文件结构的文件导入到注册表中。例如:

    1
    reg import C:d.reg

    例子表示将“C:d.reg”注册表文件导入的注册表中。

    3.6.复制注册表——reg copy

       “reg copy”命令用于复制注册表信息到指定的目标,用于将指定的注册表项的所有值项信息赋值到指定的项下。用法如下:

    reg copy KeyName1 KeyName2 [/s] [/f]

    “KeyName”的格式为"[\Machine]RootKey[SubKey]" ,由主机名和项层次组成,通过组合方式来指定子项的完全路径地址,如果省略“Machine”则默认表示对本机进行操作。其中“RootKey”表示主键,在本机上所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) "、“HKCU(HKEY_CURRENT_USER)”、“HKCR(HKEY_CLASSES_ROOT)”、“HKU(HKEY_USERS)”和“HKCC(HKEY_CURRENT_CONFIG)”五个,远程机所支持的主键只有“HKLM(HKEY_LOCAL_MACHINE) "和“HKU(HKEY_USERS)”两个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。用于该命令需要指定源注册表项和目标注册表项,所有支持将远程机器上的注册表信息复制到本机上,同时支持部分本机注册表信息复制到远程机器上,实现跨机器操作。

    “/s”选项表示复制指定源注册表项的所有子项和值项到目标注册表项。默认情况下只复制当前项和其值项。

    “/f”选项表示不用提示就强行进行复制操作。

       “reg copy”命令用于复制注册表项到指定的注册表中,来看下面的例子:

    1
    reg copy "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment" "HKEY_LOCAL_MACHINESYSTEMControlSet001ControlSession ManagerEnvironment" /s

    例子表示将Windows当前运行环境变量设置复制到Windows真实运算环境变量中。(仅作参考)

    3.7.比较注册表——reg compare

       “reg compare”命令用于比较两个注册表项的内容或比较项下的值项内容,同时还可以查看比较结果。用法如下:

    reg compare KeyName1 KeyName2 [/v ValueName | /ve] [Output] [/s]

    KeyName”的格式为"[\Machine]RootKey[SubKey]" ,由主机名和项层次组成,通过组合方式来指定子项的完全路径地址,如果省略“Machine”则默认表示对本机进行操作。其中“RootKey”表示主键,在本机上所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) "、“HKCU(HKEY_CURRENT_USER)”、“HKCR(HKEY_CLASSES_ROOT)”、“HKU(HKEY_USERS)”和“HKCC(HKEY_CURRENT_CONFIG)”五个,远程机所支持的主键只有“HKLM(HKEY_LOCAL_MACHINE) "和“HKU(HKEY_USERS)”两个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。用于该命令需要参与比较的两个注册表项,所有支持将远程机器上的注册表信息与本机上注册表项进行比较,实现跨机器操作。

    “/v ValueName”选项用于指定参与比较的注册表项下的值项名称,通过“ValueName”指定后则比较对应值项名称数据,如果省略则比较所有值项信息;“/ve”选项表示比较项下的值项名称为空白的数据,即默认操作值。

    “Output”选项表示比较结果展示模式,其值有“/oa“、 “ /od “、” /os “、” /on”,其中“/oa”表示显示所有不同和匹配结果,“/od”表示只显示所有不同的结果,“/os”表示只显示所有匹配的结果,“/on”表示不显示结果,默认为“/od”选项。

    “/s”选项表示比较指定的两个注册表项下的所有子项和值项信息。默认情况下只比较当前项和其值项。

       “reg compare”命令用于比较两个注册表项的内容,同时可以比较其子项和值项的内容,并且可以将比较结果展示输出。例如:

    1
    reg compore "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment" "HKEY_LOCAL_MACHINESYSTEMControlSet001ControlSession ManagerEnvironment" /s

    上面的例子表示比较并展示Windows当前运行环境变量和Windows真实运算环境变量的不同点。

    3.8.备份注册表——reg save

       “reg save”命令用于将保存项或子项以及其值到指定的文件副本中,相当于对注册表进行备份操作,将其信息写入到指定的文件(通常为“.hiv”文件)。用法与“reg export”命令基本相似,如下:

    reg save KeyName FileName

    “KeyName”的格式为"[\Machine]RootKey[SubKey]" ,由主机名和项层次组成,通过组合方式来指定子项的完全路径地址,如果省略“Machine”则默认表示对本机进行操作。其中“RootKey”表示主键,在本机上所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) "、“HKCU(HKEY_CURRENT_USER)”、“HKCR(HKEY_CLASSES_ROOT)”、“HKU(HKEY_USERS)”和“HKCC(HKEY_CURRENT_CONFIG)”五个,远程机所支持的主键只有“HKLM(HKEY_LOCAL_MACHINE) "和“HKU(HKEY_USERS)”两个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。

    “FileName”表示要保存并生成的文件名称。常见的文件扩展名为“.hiv”。

       “reg save”命令用于备份注册表信息,与“reg export”导出注册表文件很相似,但是该命令保存的备份文件是编译后的文件,该文件内容值项某一个项或子项,而“reg export”导出的则是注册表的标准文件。来看下面的例子:

    1
    reg save hkcr* C:d.hiv

    例子中将“hkcr”主键下的“*”子键注册表信息进行备份,备份文件为“C:d.hiv”。

    3.9.还原注册表——reg restore

       “reg restore”命令用于读取备份的注册表文件(通常为“.hiv”文件)并将其内容重新写入到注册表中。该操作用“reg save”操作命令互逆,通过“reg restore”命令操作的注册表备份文件只能通过“reg save”命令来创建。用法如下:

    reg restore KeyName FileName

    “KeyName”的格式为"RootKey[SubKey]" ,其中“RootKey”表示主键,所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) "、“HKCU(HKEY_CURRENT_USER)”、“HKCR(HKEY_CLASSES_ROOT)”、“HKU(HKEY_USERS)”和“HKCC(HKEY_CURRENT_CONFIG)”五个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。该命令不支持远程机器操作。

    “FileName”表示要操作还原的注册表备份文件名称。常见的文件扩展名为“.hiv”。

       “reg restore”命令用于将某个注册表项的值从备份文件中还原,必须要指定要操作的注册表项和注册表备份文件才能完成操作。由于“reg save”命令创建的注册表备份是一个项的数据内容,所以欢迎前要指定操作项。例如:

    1
    reg restore hkcr* C:d.hiv

    例子表示将“C:d.hiv”文件内容还原到注册表的“hkcr”主键下的“*”子键下。

    3.10.装载注册表——reg load

       “reg load”命令用于将保存的子项和项写回到注册表的不同子项中。其目的是保存到一个临时文件中,而该文件可用于注册表项的疑难解答或编辑注册表项。用法如下:

    reg load KeyName FileName

    “KeyName”的格式为"RootKey[SubKey]" ,其中“RootKey”表示主键,所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) ”和“HKU(HKEY_USERS)”两个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。该命令不支持远程机器操作。

    “FileName”表示要操作的注册表备份文件名称。常见的文件扩展名为“.hiv”。

       “reg laod”命令用于将备份的子项和项加载并写回到注册表的不同子项中,其中备份文件必须使用“reg save”命令创建。其与“reg restore”不同点是可以将保存的信息写入到不同的项中,而“reg restore”命令只能写入到原有的项中。例如:

    1
    2
    reg save hkcr* C:d.hiv
    reg load hku* C:d.hiv

    例子中将“hkcr”项下的“*”子项信息写入到“hku”下的“*”子项中。

    3.11.卸载注册表——reg unload

       “reg unload”命令用于卸载使用“reg load”命令加载的部分注册表信息,即删除使用“reg load”写入的注册项或子项信息。用法如下:

    reg unload KeyName

    “KeyName”的格式为"RootKey[SubKey]" ,其中“RootKey”表示主键,所支持的主键有“HKLM(HKEY_LOCAL_MACHINE) ”和“HKU(HKEY_USERS)”两个;“SubKey”则表示子项,是所指定主项下的注册表项的全名称。其中主项和子项、子项和子项之间使用“”进行分割。该命令不支持远程机器操作。

       “reg unload”命令通常与“reg load”命令一起使用,用于卸载并删除注册表中通过“reg laod”命令加载的注册表项。例如:

    1
    reg unload hku *

    例子中用于卸载并删除“hku”项下的“*”子项。

    3.12. Reg命令行总结

       “reg”命令行是MS-DOS提供的外部注册表控制台管理工具,其中“add”子命令用于新增注册表项或值;“delete”子命令用于删除注册表项或值;“copy”子命令用于在两个注册表项之间进行数据复制传输;“compare”子命令用于比较两个注册表项的区别;“export”子命令用于导出注册表项到注册表文件;“import”子命令用于导入注册表文件到注册表中;“save”用于备份注册表项信息到文件;“restore”用于还原注册信息到注册表原始项;“load”用于加载注册表项到HKLM或HKU主键下;“unload”用于从HKLM或HKU主键下卸载并删除注册表加载的注册表项。

       其中“export”和“import”操作的是注册表标准文件;“save”、“restore”、“load”和“unload”操作的则是注册备份文件(.hiv),即编译后文件,而“load”和“unload”值能操作注册表的HKLM或HKU两个主键,默认情况下这两个主键是进制直接修改的。

    注册表应用

       注册表是Windws的核心数据库,所以通常情况下病毒攻击都会直接去修改注册表,然而在修改注册表之前,一定要能够了解Windows默认注册表项的用途,才能达到事半功倍的效果,当然不排除有些病毒去乱该一通,这样的话Windows基本就会瘫痪。

       下面来介绍接个常用的注册表修改用法,这些修改并不是病毒式的攻击,而是尝试提高我自己的工作效率。

    1.批处理操作注册表

       使用批处理操作注册主要用到的是“reg”命令行,通常情况下使用最多的则是“reg add”、“reg delete”、“reg export”和“reg import”命令。当然在操作注册表请一定要对注册表各个键有所了解才可以,否则请先备份,然后在进行修改。

    1.1.定制目录右键DOS菜单

       “目录”是Windows系统中的一个对象类型,其注册在“HKCR(HKEY_CLASSES_ROOT)”中,如果你对英文有所了解可能会发现,该主键下有两个比较相似的对象类型“Directory”(目录)和“Folder”(文件夹),其实这两个概念对大多数人来说就是比较模糊的,都认为是一个东西,然后并不是,准确的说“Folder”的概念稍微要大于“Directory”,Windows中“Folder”应该指的是“Explorer.exe”程序能够直接打开的一个对象类型,所以包括“我的电脑”、“回收站”等内置对象。闲话不多说了,直接上代码(然后再分析):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    @echo off
    :管理操作目录
    cls
    echo 目录键MS-DOS快捷键管理
    echo ~~~~~~~~~~~~~~~~~~~~~~~~
    echo 1.添加目录右键MS-DOS支持
    echo 2.删除目录右键MS-DOS支持
    echo ~~~~~~~~~~~~~~~~~~~~~~~~
    echo=
    set /p op=请选择管理操作:
    if /I "%op%"=="1" goto 添加
    if /I "%op%"=="2" goto 删除
    goto 管理操作目录
    :添加
    set menuName=DOS在这里
    set /p menuName=请输入右键菜单显示名称(默认为"DOS在这里",使用默认名称请回车跳过):
    reg add "HKCRDirectoryshellcmd" /ve /d "%menuName%" /f
    reg add "HKCRDirectoryshellcmdcommand" /ve /d "cmd.exe /k "cd %%L"" /f
    goto 结束
    :删除
    reg delete "HKCRDirectoryshellcmd" /f
    goto 结束
    :结束
    set exitop=n
    set /p exitop=是否退出?(Y/N)
    if /i %exitop% equ y (
      exit
    else (
      goto 管理操作目录
    )

    从代码描述可以看出,添加目录右键菜单支持实际操作的注册表,在Windows系统默认的“HKCRDirectory”注册项中进行修改。通过查阅资料可以知道“HKCR”主键下定义的基本都是Windows系统的文件类型等基础对象信息,“Directory”是Windows系统中的目录对象,其下的“shell”子项用于管理当前“Directory”对象的基本操作命令。添加右键支持,实质是在“shell”(右键操作命令)中添加一个“cmd”子项,并指定该操作命令的具体值作为该操作命令的默认值,这个地方其实对应“右键菜单中显示的操作说明”;并且通过“cmdcommand”子项来指定其命令操作的具体内容,“command”子项是Windows内置项,表示“命令行”,同样通过指定默认值的方式来定义命令行操作。删除右键支持,实质是直接删除所添加的“cmd”子项。

       当然通过“reg”命令来新增和删除注册表项同样可以使用“注册表文件”导入操作来实现,上面的操作可以使用注册表文件表示为:

       -------------添加目录右键菜单支持-----------

    1
    2
    3
    4
    5
    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOTDirectoryshellcmd]
    @="Dos 在这里"
    [HKEY_CLASSES_ROOTDirectoryshellcmdcommand]
    @="cmd.exe /k "cd %L""

       -------------删除目录右键菜单支持-----------

    1
    2
    Windows Registry Editor Version 5.00
    [-HKEY_CLASSES_ROOTDirectoryshellcmd]

    将上面的内容保存为对应的注册表文件,然后双击导入也可以事项添加或删除目录右键MS-DOS菜单支持快捷方式。

    1.2.关于注册表的锁定和解锁

       这里所提到注册表锁定是禁止用户启动注册表编辑器(“regedit.exe”)的功能,是通过Windows管理员的权限来禁止其他用户组用户对注册表操作修改。

       该项操作主要是修改“HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystem”键下的“DisableRegistryTools”项的值。其中“HKEY_CURRENT_USER”主键下保存的都是当前用户“超级管理员”对的信息配置,“SoftwareMicrosoftWindows”子键保存的是Windows系统提供的缺省配置信息,“CurrentVersionPolicies”子键主要描述的是当前系统的本地安全策略配置信息。“DisableRegistryTools”项表示的是是否禁用注册表工具,默认是“REG_DWORD”类型的数据值0x00000000(十进制的0),表示不禁用,当为0x00000001(十进制的1)表示禁用。下面来看如何使用批处理来实现修改操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    @echo off
    :操作目录
    echo ~~~~~~~~~~~~~~~~~~~~~~~~
    echo 1.禁用注册表
    echo 2.启用注册表
    echo ~~~~~~~~~~~~~~~~~~~~~~~~
    echo=
    set /p op=请选择操作:
    if /I "%op%"=="1" goto 禁用
    if /I "%op%"=="2" goto 启用
    goto 操作目录
    :禁用
    echo Windows Registry Editor Version 5.00> temp.reg
    echo=>>temp.reg
    echo [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystem]>> temp.reg
    echo "DisableRegistryTools"=dword:00000001 >> temp.reg
    start temp.reg
    goto 结束
    :启用
    ::由于禁用注册表编辑器,所以reg文件不能导入 必须使用reg命令实现
    reg add "HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystem" /v DisableRegistryTools /t reg_dword /d 00000000 /f
    goto 结束
    :结束
    set exitop=n
    set /p exitop=是否退出?(Y/N)
    if /i %exitop% equ y (
    del temp.reg
      exit
    else (
      goto 操作目录
    )

    上面代码使用了两种方式实现,在禁用注册表时使用“.reg”注册表文件导入的方式实现,在启用注册表时使用“reg add”命令的方式实现,由于禁用注册表编辑器后不能打开“.reg”注册表文件,所以必须使用“Reg”命令行操作来实现解锁。

    2.常用注册表项介绍

       了解Windows缺省注册表信息可以帮助你维护管理自己的计算机,下面将介绍结构常见的注册表维护管理项(此栏目会定期维护更新,当笔者遇到问题查找后会定期更新上去的,大部分基于Windows XP系统)。

    • 用户环境变量

       用户环境变量对应的注册表位置是:HKEY_CURRENT_USEREnvironment

    • 系统环境变量

       系统环境变量对应的注册表位置是:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlSession ManagerEnvironment

       其实你会发现在“HKEY_LOCAL_MACHINESYSTEM”下“ControlSet001”、“ControlSet002”和“CurrentControlSet”三个子键下都存在“ControlSession ManagerEnvironment”子键。其实这三个子键都保存着系统环境变量的信息,而且基本一致,其中“CurrentControlSet”保存的是运行时的配置信息,“ControlSet001”保存的是系统真是的配置信息,“ControlSet002”保存的是最近一次成功运行的配置信息。但是最终系统使用的则是“ControlSet001”中的配置信息。

       在Windows系统中,“ControlSet001”和“CurrentCotrolSet”是相互同步的,其中“CurrentControlSet”值项“ControlSet001”的配置,对任意一个子键下信息的修改都会立即复制映射到另一个键中。在Windows系统启动的时候,会使用“ControlSet001”中的配置信息尝试启动,如果成功,那么就会将“ControlSet001”中的所有配置信息复制到“ControlSet002”中,如果启动失败,则就不会发生复制过程。当系统因某些原因无法启动的时候,Windows提供了一个“最后一次正确的配置启动”来尝试启动系统,此时就是使用“ControlSet002”子键下的配置进行启动的。

    • 打开方式列表

       某种Windows对象的右键打开方式信息对应的注册表位置:

       HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerfileExts

       HKEY_CLASSES_ROOTSystemFileAssociations

       在这个两个注册表项下找到对应的Windows对象类型即可查看其打开方式列表信息。通常情况下会存在第一个注册表项中,第二个注册表项中通常引用的是另外的注册表项。

    • 右键新建菜单

       桌面右键菜单选项对应的注册表位置和信息为:

       [HKEY_CLASSES_ROOTDirectoryBackgroundshellexContextMenuHandlersNew]

       @="{D969A300-E7FF-11d0-A93B-00A0C90F2719}"

    • 右键新建菜单列表

       HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerDiscardablePostSetupShellNew

    • 文件夹或目录右键菜单

       Windows目录对应的右键菜单位置:

       HKEY_CLASSES_ROOTDirectoryshell

       HKEY_CLASSES_ROOTDirectoryshellexContextMenuHandlers

       Windows文件夹对应的右键菜单位置:

       HKEY_CLASSES_ROOTFoldershell

       HKEY_CLASSES_ROOTFoldershellexContextMenuHandlers

    • 文件右键菜单

       Windows对象右键菜单对应的注册表位置:

       HKEY_CLASSES_ROOT*shellexContextMenuHandlers

       HKEY_CLASSES_ROOT*shell

       通常情况下,“*”表示所有的文件,可以将“*”替换为任意一个对象名称,比如扩展名(.bat,.exe,.txt)等,用于特定设置该对象的右键菜单。

    • IE浏览器右键菜单

       IE浏览器右键菜单对应的注册表位置:HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMenuExt

    • 驱动器自动运行(播放)设置

       关于Windows系统“Explorer”资源管理器的一些安全策略设置对应的注册表位置:HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer

       其中值项中的“NoDriveTypeAutoRun”项是对驱动器类型不自动运行的设置。其中十六进制的“1”表示不能识别的驱动器,“2”表示没有根目录的驱动器(Drive without root director),“4”表示可移动驱动器(Removable drive),“8”表示固定驱动器(Fixed drive),“10”表示网络驱动器((Network drive)),“20”表示光驱(CD-ROM),“40”表示RAM驱动器(RAM Disk),“80”表示未指定的驱动器类型(Not yet specified drive disk)。其中“80”是缺省值,如果要禁止多项驱动器,只需要将其代码值进行迭加即可。

    总结

       其实注册表的内容还是比较多的,这里只是进行了系统的笼统的介绍,如果要学习更多的注册表内容,可以在网上自行查找。可能大多数讲到的都是对低版本的Windows注册表的介绍,但是大多数的键值都还是在Windows新版本中继续沿用的,所以同样可以了解注册表的相关知识。

       现在是软件盛行的时代,大多数的注册表操作已经被抛到底层,而提供给我们的则是各种各样的计算机优化管理软件,而Windows自身也是不提倡直接进行注册表操作的,大部分的系统配置都可以通过Windows提供的“控制面板”或者“辅助管理工具”去完成。但是还是需要特别说明的是,注册表是Windows系统的根,在修改注册表之前一定要做好备份操作,以免出现问题后及时还原。

       以下提供几个Windows XP下的小型管理工具,是笔者从网络上收集并感觉不错的工具:

    Windows XP总管Uninstall Tool(软件卸载工具)Registry Workshop(高级注册表管理工具)Registry Winner(注册表优化工具)

    数据恢复软件:Wise Data RecoveryEasyRecovery ProfessionalFinalDataPowerDataRecovery

    本文出自 “阿酷呆” 博客,请务必保留此出处http://akudy.blog.51cto.com/2277883/1270562

  • 相关阅读:
    (转)如何搭建一个vue项目
    vue项目设置自动打开浏览器
    vue项目关闭代码校验
    前端面试知识点
    图片瀑布流,so easy!
    详细梳理ajax跨域4种解决方案
    css实现内容不相同的左右两个div等高
    简单了解css3轮廓outline
    vue事件监听机制
    table-layout:fixed
  • 原文地址:https://www.cnblogs.com/amnotgcs/p/10778632.html
Copyright © 2011-2022 走看看