Windows注册表是帮助Windows控制硬件、软件、用户环境和Windows界面的一套数据文件,注册表包含在Windows目录下两个文件system.dat和user.dat里,还有它们的备份system.da0和user.da0。经过Windows目录下的regedit.exe程序能够存取注册表数据库。在之前,在windows的更早版本(在Win95之前),这些功能是靠win.ini,system.ini和其余与应用程序有关联的.ini文件来实现的。html
在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文件中添加更多的参数项。shell
这样下来,在一个变化的环境中,在应用程序安装到系统中后,每一个人都会更改.ini文件。然而,没有一我的在删除应用程序后删除.ini文件中的相关设置,因此system.ini和win.ini这个两个文件会变的愈来愈大。每增长的内容会致使系统性能愈来愈慢。并且每次应用程序的升级都出现这样的难题:升级会增长更多的参数项可是历来不去掉旧的设置。并且还有一个明显的问题,一个.ini文件的最大尺寸是64KB。为了解决这个问题,软件商本身开始支持本身的.ini文件,而后指向特定的ini文件如win.ini和system.ini文件。这样下来多个.ini文件影响了系统正常的存取级别设置。若是一个应用程序的.ini文件和WIN.INI文件设置起冲突,到底是谁的优先级更高呢?数据库
注册表最初被设计为一个应用程序的数据文件相关参考文件,最后扩展成对于32位操做系统和应用程序包括了全部功能下的东东。注册表是一套控制操做系统外表和如何响应外来事件工做的文件。这些“事件”的范围从直接存取一个硬件设备到接口如何响应特定用户到应用程序如何运行等等。注册表由于它的目的和性质变的很复杂,它被设计为专门为32位应用程序工做,文件的大小被限制在大约40MB。利用一个功能强大的注册表数据库来统一集中地管理系统硬件设施,软件配置等信息,从而方便了管理,加强了系统的稳定性。最直观的一个实例就是,为何windows下的不一样用户能够拥有各自的个性化设置,如不一样的墙纸,不一样的桌面。这就是经过注册表来实现的。express
因而可知,注册表(Registry)是Windows9x/Me/NT/2000操做系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”;是一个巨大的树状分层的数据库。它记录了用户安装在机器上的软件和每一个程序的相互关联关系;它包含了计算机的硬件配置,包括自动配置的即插即用的设备和已有的各类设备说明、状态属性以及各类状态信息和数据等。windows
注册表是为Windows NT和Windows95中全部32位硬件/驱动和32位应用程序设计的数据文件。16位驱动在Windows NT下没法工做,因此全部设备都经过注册表来控制,通常这些是经过BIOS来控制的。在Win9x下,16位驱动会继续以实模式方式设备工做,它们使用system.ini来控制。16位应用程序会工做在NT或者Win9x 下,它们的程序仍然会参考win.ini和system.ini文件得到信息和控制。数组
在没有注册表的状况下,操做系统不会得到必须的信息来运行和控制附属的设备和应用程序及正确响应用户的输入。浏览器
在系统中注册表是一个记录32位驱动的设置和位置的数据库。当操做系统须要存取硬件设备,它使用驱动程序,甚至设备是一个BIOS支持的设备。无BIOS支持的设备安装时必须须要驱动,这个驱动是独立于操做系统的,可是操做系统须要知道从哪里找到它们,文件名、版本号、其余设置和信息,没有注册表对设备的记录,它们就不能被使用。安全
当一个用户准备运行一个应用程序,注册表提供应用程序信息给操做系统,这样应用程序能够被找到,正确数据文件的位置被规定,其余设置也均可以被使用。cookie
注册表保存关于缺省数据和辅助文件的位置信息、菜单、按钮条、窗口状态和其余可选项。它一样也保存了安装信息(好比说日期),安装软件的用户,软件版本号和日期,序列号等。根据安装软件的不一样,它包括的信息也不一样。
然而,通常来讲,注册表控制全部32位应用程序和驱动,控制的方法是基于用户和计算机的,而不依赖于应用程序或驱动,每一个注册表的参数项控制了一个用户的功能或者计算机功能。用户功能可能包括了桌面外观和用户目录。因此,计算机功能和安装的硬件和软件有关,对因此用户来讲项都是公用的。
有些程序功能对用户有影响,有些时做用于计算机而不是为我的设置的,一样的,驱动多是用户指定的,但在不少时候,它们在计算机中是通用的。
WINDOWS的注册表有六大根键,至关于一个硬盘被分红了六个分区。
在“运行”对话框中输入RegEdit,而后单击“肯定”按钮,则能够运行注册表编辑器。
Windows 98中文版的注册表Registry(System.dat、User.dat、Config.pol)的数据组织结构。
注册表的根键共六个。这些根键都是大写的,并以HKEY_为前缀。这种命令约定是以Win32 API的Registry函数的关键字的符号变量为基础的。
注册表就是一颗大树,树的叶子节点包含三项:名称-类型-值。
数据类型有六种:字符串值,二进制值,32位值,64位值,多字符串值,可扩充字符串值。
根键:系统定义的配置单元,经过"HKEY_"来表示。
虽然在注册表中,六个根键看上去处于一种并列的地位,彼此毫无关系。但事实上,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两大类,这两大类的详细内容请看后面的介绍。
在注册表中,全部的数据都是经过一种树状结构以键和子键的方式组织起来,十分相似于目录结构。每一个键都包含了一组特定的信息,每一个键的键名都是 和它所包含的信息相关的。若是这个键包含子键,则在注册表编辑器窗口中表明这个键的文件夹的左边将有“+”符号,以表示在这个文件夹中有更多的内容。若是这个文件夹被用户打开了,那么这个“+”就会变成“-”。
该根键保存了存放在本地计算机口令列表中的用户标识和密码列表。每一个用户的预配置信息都存储在HKEY_USERS根键中。HKEY_USERS是远程计算机中访问的根键之一。
该根键包含本地工做站中存放的当前登陆的用户信息,包括用户登陆用户名和暂存的密码(注:此密码在输入时是隐藏的)。用户登陆Windows 98时,其信息从HKEY_USERS中相应的项拷贝到HKEY_CURRENT_USER中。
该根键存放着定义当前用户桌面配置(如显示器等)的数据,最后使用的文档列表(MRU)和其余有关当前用户的Windows 98中文版的安装的信息。
根据在Windows 98中文版中安装的应用程序的扩展名,该根键指明其文件类型的名称。
在第一次安装Windows 98中文版时,RTF(Rich Text format)文件与写字板(WordPad)&127;联系起来,但在之后安装了中文Word 6.0后,双击一个RTF文件时,将自动激活Word。存放在SYSTEM.DAT中的HKEY_CLASSES_ROOT,将替代WIN.INI文件中的设置项,它把应用程序与文件扩展名联系起来,它也替代了Windows 3.x中的Reg.dat文件中的类似的设置项。
该根键存放本地计算机硬件数据,此根键下的子关键字包括在SYSTEM.DAT中,用来提供HKEY_LOCAL_MACHINE所需的信息,或者在远程计算机中可访问的一组键中。
该根键中的许多子键与System.ini文件中设置项相似。
该根键存放了系统在运行时动态数据,此数据在每次显示时都是变化的,所以,此根键下的信息没有放在注册表中。
注册表是一个大型数据库Registry。要详细地分析该数据库,不是一两页就能介绍完。我曾经用了半年多时间分析此数据库结构。下面只介绍部分重要内容。
HKEY_CLASS_ROOT/Paint.Pricture/DefaultIcon双击窗口右侧的默认字符串,在打开的对话框中删除原来的“键值”,输入%1。从新启动后,在“个人电脑”中打开Windows目录,选择“大图标”,而后你看到的Bmp文件的图标不再是千篇一概的MSPAINT图标了,而是每一个Bmp文件的略图(前提是未安装ACDSee等看图软件)。
1.HKEY_CURRENT_USER\Control Panel\Desktop 中新建串值名MenuShowDelay=0 可以使“开始”菜单中子菜单的弹出速度提升。
2.在HKEY_CURRENT_USER\Control Panel\Deskt-op\WindowsMeterics中新建串值名MinAnimate,值为1启动动画效果开关窗口,值为0取消动画效果。
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设置为手工刷新。
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等。
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),它老是一个字串。
如下代码主要是删除临时文件,旧文件。并不可以删除无效的键
@echo off del/f/s/q %systemdrive%\*.tmp del/f/s/q %systemdrive%\*._mp del/f/s/q %systemdrive%\*.log del/f/s/q %systemdrive%\*.gid del/f/s/q %systemdrive%\*.chk del/f/s/q %systemdrive%\*.old del/f/s/q %windir%\*.bak del/f/q %systemdrive%\recycled\*.* del/f/q %windir%\prefetch\*.* rd/s/q %windir%\temp & md %windir%\tempemp% &md %temp% del/f/q %userprofile%\cookies\*.* del/f/q %userprofile%\recent\*.* rd/s/q \“%userprofile%\Local Settings\Temporary Internet Files\” cls & echo 系统垃圾清除完成:) echo. & pause
regedit=regist(注册)+edit(编辑)
修改HKEY_CLASSES_ROOT项的Directory项,background表示在文件夹中点击鼠标右键出现的上下文菜单;shell表示选中文件夹以后鼠标右键出现的上下文菜单;shellex表示按住shift时能够看见的上下文菜单,好比“复制文件路径”命令就必须在按住shift的时候点击鼠标右键才能显示出来。
这个shell/command,其实就是写一个脚本,文件夹的彻底路径名称为第一个参数: %1。也能够模仿cmd命令写成%V。
文件夹路径复制到剪贴板
一种方式是直接打开regedit修改,另外一种方式是把键值对写成以下形式,保存为haha.reg文件,双击运行便可。
[HKEY_CLASSES_ROOT\Directory\shell\copypath] @="复制文件夹路径" [HKEY_CLASSES_ROOT\Directory\shell\copypath\command] @="mshta vbscript:clipboarddata.setdata(\"text\",\"%1\")(close)"
将sublime命令加入到上下文菜单中去。步骤以下:
一、新建HKEY_CLASSES_ROOT\Directory\shell\sublime项,能够给这一项指定注册表名称(sublime)、显示名称(在sublime打开)、图标(显示的图标)
二、在sublime项下新建一项command表示点击这一项以后发生的事件。%1表示命令的第一个参数,%*表示命令所有参数。有时候用%1无论用,能够试试%V。
运行杀毒软件时,可能把上下文菜单中的“新建”去掉。能够经过添加HKEY_CLASSES_ROOT\Directory\ShareEx\ContextMenuHandlers\new={D969A300-E7FF-11d0-A93B-00A0C90F2719}
来找回。
下面咱们就来用.NET下托管语言C#注册表操做,主要内容包括:
和注册表相关的命名空间using Microsoft.Win32;
,在这个命名空间里面包含了许多注册表相关的类。命名空间里面提供了一个类RegistryKey
利用它咱们能够定位到注册表最开头的分支:ClassesRoot,CurrentUser,Users,LocalMachine,CurrentConfig,如:RegistryKey key = Registry.LocalMachine;
。在操做的过程当中涉及到子分支,要用\\
进行深刻。最后要调用RegistryKey对象的Close()关闭注册表。
如下咱们的例子都是在LocalMachine分支下,请注意。
1:建立
建立注册表项主要用到RegistryKey 的CreateSubKey()方法。如:
RegistryKey key = Registry.LocalMachine; RegistryKey software = key.CreateSubKey("software\\test"); //在HKEY_LOCAL_MACHINE\SOFTWARE下新建名为test的注册表项。若是已经存在则不影响!
2:打开
打开注册表项主要用到RegistryKey 的OpenSubKey()方法。如:
注意,若是该注册表项不存在,这调用这个方法会抛出异常
RegistryKey key = Registry.LocalMachine; RegistryKey software = key.OpenSubKey("software\\test",true); //注意该方法后面还能够有一个布尔型的参数,true表示能够写入。
3:删除
删除注册表项主要用到RegistryKey 的DeleteSubKey()方法。如:
RegistryKey key = Registry.LocalMachine; key.DeleteSubKey("software\\test",true); //该方法无返回值,直接调用便可 key.Close();
注意,若是该注册表项不存在,这调用这个方法会抛出异常
1:建立(设置值、修改)
对键值的建立修改等操做主要用到RegistryKey 的SetValue()方法
RegistryKey key = Registry.LocalMachine; RegistryKey software = key.OpenSubKey("software\\test",true); //该项必须已存在 software.SetValue("test", "博客园"); //在HKEY_LOCAL_MACHINE\SOFTWARE\test下建立一个名为“test”,值为“博客园”的键值。若是该键值本来已经存在,则会修改替换原来的键值,若是不存在则是建立该键值。 // 注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等等~~默认是字符串。如: // software.SetValue("test", "0", RegistryValueKind.DWord); //二进制信息 Key.Close();
2:读取
string info = ""; RegistryKey Key; Key = Registry.LocalMachine; myreg = Key.OpenSubKey("software\\test"); // myreg = Key.OpenSubKey("software\\test",true); info = myreg.GetValue("test").ToString(); myreg.Close(); info结果为:博客园
3:删除
RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software\\test", true); delKey.DeleteValue("test"); delKey.Close();
细心的读者可能发现了第二个例子中OpenSubKey()方法参数与其余例子的不一样。
若是你要修改键值,包括建立、设置、删除键值等都要在方法后面加个布尔参数,设置为true,表示可写可改;若是仅仅只是读取键值能够不加,此时可写关闭,你不能再往里写值(固然,你要加也能够true)!
还有读者提到读写默认键值的问题,主要在设置、读取的方法中将键名置空则就是对默认键值的操做。
如:
software.SetValue("", "博客园"); // 在HKEY_LOCAL_MACHINE\SOFTWARE\test修改默认键值的值为“博客园”。读取相似!
另外,默认的键值是不能删除的,因此不要用DeleteValue()方法去删除,会抛出异常的!
private bool IsRegeditItemExist() { string [] subkeyNames; RegistryKey hkml = Registry.LocalMachine; RegistryKey software = hkml.OpenSubKey("SOFTWARE"); //RegistryKey software = hkml.OpenSubKey("SOFTWARE", true); subkeyNames = software.GetSubKeyNames(); //取得该项下全部子项的名称的序列,并传递给预约的数组中 foreach (string keyName in subkeyNames) //遍历整个数组 { if (keyName == "test") //判断子项的名称 { hkml.Close(); return true ; } } hkml.Close(); return false; }
private bool IsRegeditKeyExit() { string[] subkeyNames; RegistryKey hkml = Registry.LocalMachine; RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test"); //RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test", true); subkeyNames = software.GetValueNames(); //取得该项下全部键值的名称的序列,并传递给预约的数组中 foreach (string keyName in subkeyNames) { if (keyName == "test") //判断键值的名称 { hkml.Close(); return true; } } hkml.Close(); return false; }
http://www.cnblogs.com/txw1958/archive/2012/08/01/csharp-regidit.html http://www.jb51.net/article/3328.htm