相信每个人对注册表并不陌生,在运行里面输入“regedit”就可以打开注册表编辑器了。这东西对Windows系统来说可是比较重要的,也是病毒常常会光顾的地方,比如病毒和恶意软件常常会在注册表的启动项里面写入自己的启动键值来达到自启动的目的,有些病毒还会修改注册表里面来映像劫持杀毒软件,这是破坏系统的第一步。同时,大多软件(软件的序列号和信息)和硬件信息、系统信息、安全模式等等设置都保存在这里,因此系统的健康在很大程度上要依赖注册表的健康。
作为编程开发人员,我们有必要了解注册表并学会操作注册表。下面我们就来用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除、键值的创建(设置值、修改),读取和删除、判断注册表项是否存在、判断键值是否存在。
要操作注册表需要引用命名空间Microsoft.Win32
以下从‘读’‘写’‘删除’‘判断’四个事例实现对注册表的简单操作
1.读取指定名称的注册表的值
-
private string GetRegistData(string name)
- {
-
string registData;
- RegistryKey hkml = Registry.LocalMachine;
-
RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);
-
RegistryKey aimdir = software.OpenSubKey("XXX",true);
- registData = aimdir.GetValue(name).ToString();
-
return registData;
- }
以上是读取的注册表中HKEY_LOCAL_MACHINE/SOFTWARE目录下的XXX目录中名称为name的注册表值;
2.向注册表中写数据
-
private void WTRegedit(string name,string tovalue)
- {
- RegistryKey hklm = Registry.LocalMachine;
-
RegistryKey software = hklm.OpenSubKey("SOFTWARE",true);
-
RegistryKey aimdir = software.CreateSubKey("XXX");
- aimdir.SetValue(name,tovalue);
- }
以上是在注册表中HKEY_LOCAL_MACHINE/SOFTWARE目录下新建XXX目录并在此目录下创建名称为name值为tovalue的注册表项;
3.删除注册表中指定的注册表项
-
private void DeleteRegist(string name)
- {
-
string[] aimnames;
- RegistryKey hkml = Registry.LocalMachine;
-
RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);
-
RegistryKey aimdir = software.OpenSubKey("XXX",true);
- aimnames = aimdir.GetSubKeyNames();
-
foreach(string aimKey in aimnames)
- {
-
if(aimKey == name)
- aimdir.DeleteSubKeyTree(name);
- }
- }
以上是在注册表中HKEY_LOCAL_MACHINE/SOFTWARE目录下XXX目录中删除名称为name注册表项;
4.判断指定注册表项是否存在
-
private bool IsRegeditExit(string name)
- {
-
bool _exit = false;
-
string[] subkeyNames;
- RegistryKey hkml = Registry.LocalMachine;
-
RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);
-
RegistryKey aimdir = software.OpenSubKey("XXX",true);
- subkeyNames = aimdir.GetSubKeyNames();
-
foreach(string keyName in subkeyNames)
- {
-
if(keyName == name)
- {
-
_exit = true;
-
return _exit;
- }
- }
-
return _exit;
- }
以上是在注册表中HKEY_LOCAL_MACHINE/SOFTWARE目录下XXX目录中判断名称为name注册表项是否存在,这一方法在删除注册表时已经存在,在新建一注册表项时也应有相应判断;
C#就可以十分方便、简洁的开发出操作注册表的程序。单击"开始/运行",在"打开"的后面填入"regedit"。就可以看到注册表的数据结构了。"主键"是有层次结构的。主键的下一级主键称为该主键的"子键"。每一个主键可以对拥有多个子键。右边的这些值就是所谓的键值了。每一个主键或者子键都可以拥有多个键值。注册表是一个庞大的数据库,在其中每一个主键,每一个键值都赋予了不同的功能。 C#如何读取注册表中的主键和键值:在.Net FrameWork SDK Beta 2版中,有一个Microsoft.Win32的名称空间,在此名称空间中提供了二个用于注册表操作的类:Registry类、RegistryKey类。这二个类都是封闭类,不可以继承。这二个类定义了许多关于注册表的方法和属性,通过调用这二个类,在Visual C#中就可以比较轻松的处理关于注册表的各种操作了。 (1).Registry类:此类主要封装了七个公有的静态域,而这些静态域分别代表这视窗注册表中的七个基本的主键,具体如下所示: Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 Registry.CurrentUser 对应于HKEY_CURRENT_USER主键 Registry.LocalMachine 对应于 HKEY_LOCAL_MACHINE主键 Registry.User 对应于 HKEY_USER主键 Registry.CurrentConfig 对应于HEKY_CURRENT_CONFIG主键 Registry.DynDa 对应于HKEY_DYN_DATA主键 Registry.PerformanceData 对应于HKEY_PERFORMANCE_DATA主键 (2).RegistryKey类:此类中主要封装了对视窗系统注册表的基本操作。在程序设计中,首先通过Registry类找到注册表中的基本主键,然后通过RegistryKey类,来找其下面的子键和处理具体的操作的。 下面通过一个读取注册表信息例子来具体说明这二个来的用法。 程序设计和运行的环境:Windows 2000服务器版,.Net FrameWork SDK Beta 2版。 在运行程序前的一些必要的处理工作。在程序设计时,主要功能是读取已经存在的主键键值,用户可以新建若干个主键和对应的键值。 程序的主要功能是读取指定主键下面的所有子键和子键拥有的键值,并以列表的形式按层次显示出来。程序设计过程中的重要步骤以及应该注意的一些问题: 程序中读取主键、子键和键值所使用到的方法: 程序中为了读取指定主键下面的子键和子键中拥有的键值,主要使用了RegistryKey类中的四个方法:OpenSubKey,GetSubKeyNames,GetValueNames,GetValue。具体的用法和意思如下: OpenSubKey ( string name )方法主要是打开指定的子键。 GetSubKeyNames ( )方法是获得主键下面的所有子键的名称,它的返回值是一个字符串数组。 GetValueNames ( )方法是获得当前子键中的所有的键名称,它的返回值也是一个字符串数组。 GetValue ( string name )方法是指定键的键值。 程序中具体的使用语句如下:
- RegistryKey hklm = Registry.LocalMachine ;
-
-
RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ;
-
-
RegistryKey no1 = software.OpenSubKey ( "001" ) ;
-
-
RegistryKey no2 = no1.OpenSubKey ( "002" ) ;
其中listBox1是程序中定义了的列表名称。
-
foreach ( string site in no2.GetSubKeyNames ( ) )
-
- {
- listBox1.Items.Add ( site ) ;
-
- RegistryKey sitekey = no2.OpenSubKey ( site ) ;
-
-
foreach ( string sValName in sitekey.GetValueNames ( ) )
-
- {
-
listBox1.Items.Add ( "" sValName ": " sitekey.GetValue ( sValName ) ) ;
-
- }
- }
通过以上的论述,我们可以得到程序的源程序代码,具体如下:
-
using System ;
-
using System.Drawing ;
-
using System.Collections ;
-
using System.ComponentModel ;
-
using System.Windows.Forms ;
-
using System.Data ;
-
using Microsoft.Win32 ;
-
public class Form1 : Form
- {
-
private System.ComponentModel.Container components ;
-
private ListBox listBox1 ;
-
private Button button1 ;
-
public Form1 ( )
- {
- InitializeComponent ( ) ;
- }
-
-
public override void Dispose ( )
- {
-
base.Dispose ( ) ;
- components.Dispose ( ) ;
- }
-
-
private void InitializeComponent ( )
- {
-
this.components = new System.ComponentModel.Container ( ) ;
-
this.button1 = new Button ( ) ;
-
this.listBox1 = new ListBox ( ) ;
-
button1.Location = new System.Drawing.Point ( 16 , 320 ) ;
-
button1.Size = new System.Drawing.Size ( 75 , 23 ) ;
- button1.TabIndex = 0 ;
-
button1.Text = "读取注册表" ;
-
button1.Click = new System.EventHandler( this.button1_Click ) ;
-
listBox1.Location = new System.Drawing.Point ( 16 , 32 ) ;
-
listBox1.Size = new System.Drawing.Size ( 496 , 264 ) ;
- listBox1.TabIndex = 1 ;
-
this.Text = "读取主测表信息" ;
-
this.AutoScaleBaseSize = new System.Drawing.Size ( 5 , 13 ) ;
-
this.ClientSize = new System.Drawing.Size ( 528 , 357 ) ;
-
this.Controls.Add( this.listBox1 ) ;
-
this.Controls.Add ( this.button1 ) ;
- }
-
-
protected void button1_Click ( object sender , System.EventArgs e )
- {
- listBox1.Items.Clear ( ) ;
- RegistryKey hklm = Registry.LocalMachine ;
-
RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ;
-
-
RegistryKey no1 = software.OpenSubKey ( "001" ) ;
-
-
RegistryKey no2 = no1.OpenSubKey ( "002" ) ;
-
-
foreach ( string site in no2.GetSubKeyNames ( ) )
-
- {
- listBox1.Items.Add ( site ) ;
-
- RegistryKey sitekey = no2.OpenSubKey ( site ) ;
-
-
foreach ( string sValName in sitekey.GetValueNames ( ) )
-
- {
-
listBox1.Items.Add ( "" sValName ": " sitekey.GetValue ( sValName ) ) ;
-
- }
- }
- }
-
-
public static void Main ( )
- {
-
Application.Run ( new Form1 ( ) ) ;
- }
- }
用C#读取注册表中的注册信息是通过名称空间Micorsoft.Win32中的二个类来实现的。在这二个类中还定义了对注册表信息的删除、修改和重命名的一些方法。这些方法比起本文介绍的读取方法、打开方法来说,更具有破坏性,但也更实用。由于注册表在视窗系统中的重要作用,所以在每一次对注册表进行操作之前,一定要备份,在操作的时候也要非常小心,因为一次的误操作都可能导致系统崩溃。
例:C#如何修改计算机的完整的计算机名称
下面是我写的代码,其中窗体里有两个label和两个textBox还有两个button.代码如下:
-
using System;
-
using System.Collections.Generic;
-
using System.ComponentModel;
-
using System.Data;
-
using System.Drawing;
-
using System.Text;
-
using System.Windows.Forms;
-
using System.Media;
-
using Microsoft.Win32;
-
namespace WindowsApplication1
- {
-
public partial class Form1 : Form
- {
-
public Form1()
- {
- InitializeComponent();
- }
-
private void Form1_Load(object sender, EventArgs e)
- {
-
RegistryKey myRKCN = Registry.LocalMachine.OpenSubKey("SYSTEM//ControlSet001//Services//Tcpip//Parameters");
-
foreach (string myCpName in myRKCN.GetValueNames())
- {
-
if (myCpName == "NV Hostname")
- {
-
this.textBox1.Text = myRKCN.GetValue(myCpName).ToString();
- }
-
else
- {
-
continue;
- }
- }
- }
-
private void button2_Click(object sender, EventArgs e)
- {
-
RegistryKey myRKCN = Registry.LocalMachine.OpenSubKey("SYSTEM//ControlSet001//Services//Tcpip//Parameters",true);
-
foreach (string site in myRKCN.GetValueNames())
- {
-
if (site == "NV Hostname")
- {
-
myRKCN.DeleteValue(site, false);
-
myRKCN.SetValue("NV Hostname", this.textBox2.Text);
- }
-
else
- {
-
continue;
- }
- }
-
MessageBox.Show("修改成功");
- }
-
private void button1_Click(object sender, EventArgs e)
- {
-
this.Close();
- }
- }
- }
|
请发表评论