C#成魔之路<15> 注册表技术
2016-03-16 16:36
519 查看
注册表是一个庞大的数据库系统,其记录了用户安装在计算机上的软件,硬件信息和每一个程序的相互关系。注册表中存放着很多参数,直接控制着整个系统的启动、硬件驱动程序的装载以及应用程序的运行。
1、注册表基础
(1)概述
Windows注册表是包含安装、用户喜好以及已安装软件和设备的所有配置信息的核心存储库。商用软件基本都使用注册表信息来存储这些信息。COM组件必须把他的信息存储在注册表中,才能由客户程序调用。记录了用户账号、服务器硬件以及应用程序的设置信息等。同INI文件相比,注册表可以控制的数据更多,而且不仅仅限于处理字符串类型的数据。注册表也包含了一些系统配置的信息(因操作系统的不同而不同)。
打开注册表编辑器(regedit)。
注册表的所有信息都是分类保存的,‘主键’是各个大信息分类名称。注册表中所有信息都被分类存放在相应的主键中(基项)。
HKEY_ CLASSES_ROOT:用于保存在系统中注册的各类文件的控制名以及文件关联等信息。
HKEY_CURRENT _USER:用于保存登录到系统的当前用户的计算机的环境变量,桌面设置,应用程序设置,个人程序组,打印机和网络连接等信息。
HKEY_LOCAL _MACHINE:保存了计算机的硬件、软件以及操作系统的配置信息。
HKEY_USERS:用来保存计算机所有用户的配置信息。
HKEY_CURRENT _CONFIG:存放计算机当前硬件配置信息。
注册表:记录信息的存储器。
(2)Registry类和RegistryKey类
.NET提供了访问注册表的类,这两个类都在Microsoft.Win32命名空间中。
Registry类
Registry类是一个静态类,不能被实例化,作用只是实例化RegistryKey类,以便开始在注册表中浏览信息。Registry类是通过静态的只读字段来提供RegistryKey实例的,这些字段共有七个。
ClassesRoot:定义文档的类型或类,以及和这些类型关联的属性。该字段读取Windows注册表基项HKEY_ CLASSES_ROOT。
CurrentConfig:包含有关非用户特定的硬件的配置信息。该字段读取Windows注册表基项HKEY_CURRENT _CONFIG。
CurrentUser:包含有关当前用户首选项的信息。该字段读取Windows注册表基项HKEY_CURRENT _USER。
DynData:包含动态注册表数据,该字段读取Windows注册表基项:HKEY_DYN _DATA
LocalMachine:包含本地计算机的配置数据。读取Windows注册表基项:HKEY_LOCAL _MACHINE
PerformanceData:包含软件组件的性能信息。该字段读取Windows注册表基项:HKEY_PERFORMANCE _DATA
Users:包含有关默认用户配置的信息。该字段读取Windows注册表基项HKEY_USERS。
注意:其API均为静态类型。
RegistryKey类
RegistryKey实例表示一个注册表项,这个类可以浏览子键、创建新键、读取或修改键中值。也就是说该类可以完成对注册表项的所有操作,除了设置键的安全级别之外。下面介绍RegistryKey类常用的属性和方法。
属性:
Name:检索项的名称。
SubKeyCount:检索当前项的子项数目。
ValueCount:检索项中值的计数。
方法:
Close:关闭。
CreateSubKey:创建给定名称的子键。如果已经存在,就打开它。
DeleteSubKey:删除指定的子键。
DeleteSubKeyTree:彻底删除子键及其所有的子键。
DeleteValue:从键中删除一个指定的值。
GetSubKeyNames:返回一个包含所有键值名称的字符串数组。
GetValue:返回指定值。
GetValueNames:返回一个包含所有键值名称的字符串数组。
OpenSubKey:返回表示给定子键的RegistryKey实例引用。
SetValue:设置指定的值。
2、在C#中操作注册表
(1)读取注册表中的信息
读取注册表中的信息主要是通过RegistryKey类中的OpenSubKey方法,GetSubKeyNames方法和GetValueNames方法实现。
OpenSubKey方法
用于检索指定的子项。
示例程序:
注意其命名空间为MicroSoft.Win32
GetSubKeyNames方法
用于检索包含所有子项名称的字符串数组。
示例程序:
GetValueNames方法
GetValueNames方法用于检索包含与此项关联的所有“键名”的字符串数组。
示例程序:
(2)创建和修改注册表信息
通过RegistryKey类的CreateSubKey方法和SetValue方法可以创建注册表信息。
CreateSubKey方法
用于创建一个新子项或者打开一个现有子项从而进行写访问。语法:
SetValue方法
用于设置注册表项中键值对的值。
示例程序:
关于修改注册表信息。注册表信息非常重要,一般不要对其进行写操作。.NET出于这个原因,没有提供修改注册表键值的方法。只是提供了一个危害性相对较小的SetValue方法,通过这个方法可以用来修改键值。如果检测到指定的键名不存在就会创建一个新的键(键值对)。
示例程序:
(3)删除注册表中信息
主要通过RegistryKey类中的DeleteSubKey方法、DeleteSubKeyTree方法和DeleteValue方法来删除注册表中的信息。
DeleteSubKey方法
可以用于删除不包含任何子项的子项。
注意:如果删除项有子项的话,将会触发异常。必须将子项删除之后才能够删除该项。
示例程序:
DeleteSubKeyTree方法
DeleteSubKeyTree方法用于彻底删除指定的子项目录,包括删除该子项以及该子项以下的全部子项。该方法破坏性非常强。所以使用的时候要特别谨慎。
示例程序:
DeleteValue方法
DeleteValue方法主要用于删除指定的键值。
示例程序:
1、注册表基础
(1)概述
Windows注册表是包含安装、用户喜好以及已安装软件和设备的所有配置信息的核心存储库。商用软件基本都使用注册表信息来存储这些信息。COM组件必须把他的信息存储在注册表中,才能由客户程序调用。记录了用户账号、服务器硬件以及应用程序的设置信息等。同INI文件相比,注册表可以控制的数据更多,而且不仅仅限于处理字符串类型的数据。注册表也包含了一些系统配置的信息(因操作系统的不同而不同)。
打开注册表编辑器(regedit)。
注册表的所有信息都是分类保存的,‘主键’是各个大信息分类名称。注册表中所有信息都被分类存放在相应的主键中(基项)。
HKEY_ CLASSES_ROOT:用于保存在系统中注册的各类文件的控制名以及文件关联等信息。
HKEY_CURRENT _USER:用于保存登录到系统的当前用户的计算机的环境变量,桌面设置,应用程序设置,个人程序组,打印机和网络连接等信息。
HKEY_LOCAL _MACHINE:保存了计算机的硬件、软件以及操作系统的配置信息。
HKEY_USERS:用来保存计算机所有用户的配置信息。
HKEY_CURRENT _CONFIG:存放计算机当前硬件配置信息。
注册表:记录信息的存储器。
(2)Registry类和RegistryKey类
.NET提供了访问注册表的类,这两个类都在Microsoft.Win32命名空间中。
Registry类
Registry类是一个静态类,不能被实例化,作用只是实例化RegistryKey类,以便开始在注册表中浏览信息。Registry类是通过静态的只读字段来提供RegistryKey实例的,这些字段共有七个。
ClassesRoot:定义文档的类型或类,以及和这些类型关联的属性。该字段读取Windows注册表基项HKEY_ CLASSES_ROOT。
CurrentConfig:包含有关非用户特定的硬件的配置信息。该字段读取Windows注册表基项HKEY_CURRENT _CONFIG。
CurrentUser:包含有关当前用户首选项的信息。该字段读取Windows注册表基项HKEY_CURRENT _USER。
DynData:包含动态注册表数据,该字段读取Windows注册表基项:HKEY_DYN _DATA
LocalMachine:包含本地计算机的配置数据。读取Windows注册表基项:HKEY_LOCAL _MACHINE
PerformanceData:包含软件组件的性能信息。该字段读取Windows注册表基项:HKEY_PERFORMANCE _DATA
Users:包含有关默认用户配置的信息。该字段读取Windows注册表基项HKEY_USERS。
注意:其API均为静态类型。
RegistryKey类
RegistryKey实例表示一个注册表项,这个类可以浏览子键、创建新键、读取或修改键中值。也就是说该类可以完成对注册表项的所有操作,除了设置键的安全级别之外。下面介绍RegistryKey类常用的属性和方法。
属性:
Name:检索项的名称。
SubKeyCount:检索当前项的子项数目。
ValueCount:检索项中值的计数。
方法:
Close:关闭。
CreateSubKey:创建给定名称的子键。如果已经存在,就打开它。
DeleteSubKey:删除指定的子键。
DeleteSubKeyTree:彻底删除子键及其所有的子键。
DeleteValue:从键中删除一个指定的值。
GetSubKeyNames:返回一个包含所有键值名称的字符串数组。
GetValue:返回指定值。
GetValueNames:返回一个包含所有键值名称的字符串数组。
OpenSubKey:返回表示给定子键的RegistryKey实例引用。
SetValue:设置指定的值。
2、在C#中操作注册表
(1)读取注册表中的信息
读取注册表中的信息主要是通过RegistryKey类中的OpenSubKey方法,GetSubKeyNames方法和GetValueNames方法实现。
OpenSubKey方法
用于检索指定的子项。
public RegistryKey OpenSubKey(string name) //name表示要以只读模式打开的子项的名称或者路径。 返回所请求的子项。
示例程序:
private void Form1_Load(object sender, EventArgs e) { RegistryKey rkMain = Registry.CurrentUser; RegistryKey rkChild = rkMain.OpenSubKey(@"Software"); }
注意其命名空间为MicroSoft.Win32
GetSubKeyNames方法
用于检索包含所有子项名称的字符串数组。
public string[] GetSubKeyNames() //返回值是包含当前子项名称的字符串数组。
示例程序:
private void Form1_Load(object sender, EventArgs e) { RegistryKey rkMain = Registry.CurrentUser; RegistryKey sys = rkMain.OpenSubKey(@"Software"); foreach (string str in sys.GetSubKeyNames()) { richTextBox1.Text += str + '\n'; } }
GetValueNames方法
GetValueNames方法用于检索包含与此项关联的所有“键名”的字符串数组。
public string[] GetValueNames() //返回值是由当前项的所有键值对和键名组成的字符串。
示例程序:
private void Form1_Load(object sender, EventArgs e) { this.listBox1.Items.Clear(); RegistryKey rkMain = Registry.CurrentUser; RegistryKey rkChild = rkMain.OpenSubKey(@"Software"); foreach (string item in rkChild.GetSubKeyNames()) { this.listBox1.Items.Add("chile item: "+item); RegistryKey rkGrandChild = rkChild.OpenSubKey(item); foreach (string str in rkGrandChild.GetValueNames()) { this.listBox1.Items.Add(str+rkGrandChild.GetValue(str)); } 4000 //通过循环嵌套将所有 //键值对的键名和键值全部提取出来并且显示 } }
(2)创建和修改注册表信息
通过RegistryKey类的CreateSubKey方法和SetValue方法可以创建注册表信息。
CreateSubKey方法
用于创建一个新子项或者打开一个现有子项从而进行写访问。语法:
public RegistryKey CreateSubKey(string subkey) //subkey表示要创建或者打开子项的名称或者路径。该方法返回RegistKey对象,表示新建的子项或者空引用。subkey指定了零长度字符串,则返回当前的RegistryKey对象。
SetValue方法
用于设置注册表项中键值对的值。
public void SetValue(string name,Object value) //name表示要存储的值的名称,参数value表示要存储的数据。
示例程序:
private void button1_Click(object sender, EventArgs e) { try { RegistryKey rkMain = Registry.CurrentUser; RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true); RegistryKey rkMR = rkSoftware.CreateSubKey("king"); RegistryKey rkEast = rkMR.CreateSubKey("killer"); rkEast.SetValue("king","killer"); MessageBox.Show("创建成功"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
关于修改注册表信息。注册表信息非常重要,一般不要对其进行写操作。.NET出于这个原因,没有提供修改注册表键值的方法。只是提供了一个危害性相对较小的SetValue方法,通过这个方法可以用来修改键值。如果检测到指定的键名不存在就会创建一个新的键(键值对)。
示例程序:
private void button1_Click(object sender, EventArgs e) { try { RegistryKey rkMain = Registry.CurrentUser; RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true); RegistryKey rkMR = rkSoftware.OpenSubKey("king",true); RegistryKey rkEast = rkMR.OpenSubKey("killer",true); rkEast.SetValue("east","rise"); MessageBox.Show("修改成功"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
(3)删除注册表中信息
主要通过RegistryKey类中的DeleteSubKey方法、DeleteSubKeyTree方法和DeleteValue方法来删除注册表中的信息。
DeleteSubKey方法
可以用于删除不包含任何子项的子项。
public void DeleteSubKey(string subkey,bool thowOnMissingSubKey) //参数subkey表示要删除的子项的名称。把参数thowOnMissingSubKey的值设置为true。 //在程序调用的时候,如果删除的子项不存在,则产生一个错误信息 //如果设置为false,那么不会产生错误信息。
注意:如果删除项有子项的话,将会触发异常。必须将子项删除之后才能够删除该项。
示例程序:
private void button1_Click(object sender, EventArgs e) { try { RegistryKey rkMain = Registry.CurrentUser; RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true); RegistryKey rkMR = rkSoftware.OpenSubKey("king",true); rkMR.DeleteSubKey("east",false); MessageBox.Show("删除成功"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
DeleteSubKeyTree方法
DeleteSubKeyTree方法用于彻底删除指定的子项目录,包括删除该子项以及该子项以下的全部子项。该方法破坏性非常强。所以使用的时候要特别谨慎。
public void DeleteSubKeyTree(string subkey) //参数表示要彻底删除的子项。
示例程序:
private void button1_Click(object sender, EventArgs e) { try { RegistryKey rkMain = Registry.CurrentUser; RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true); RegistryKey rkMR = rkSoftware.OpenSubKey("king",true); rkMR.DeleteSubKeyTree("east",false); MessageBox.Show("删除成功"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
DeleteValue方法
DeleteValue方法主要用于删除指定的键值。
public void DeleteValue(string name) //name 表示要删除的键值对的键名。
示例程序:
private void button1_Click(object sender, EventArgs e) { try { RegistryKey rkMain = Registry.CurrentUser; RegistryKey rkSoftware = rkMain.OpenSubKey("Software",true); RegistryKey rkMR = rkSoftware.OpenSubKey("king",true); RegistryKey rkEAST = rkSoftware.OpenSubKey("east", true); rkEAST.DeleteValue("east"); MessageBox.Show("删除键值成功"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
相关文章推荐
- c#调用COM组件
- 用注册表文件实现解开被锁定的.reg与inf文件
- 注册表导出管理员密码文件
- 修改注册表实现在桌面上显示Windows版本
- 用注册表清除3389登陆记录的方法
- 常见的注册表修改大全第1/3页
- vbscript 注册表脚本书写
- C#实现把指定数据写入串口
- C#动态创建button的方法
- vbscript Registry 注册表操作实现代码(读写删除)
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- vbs 注册表操作代码(添加删除)
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享