c#注册表操作

来源:互联网 发布:年薪百万知乎 编辑:程序博客网 时间:2024/04/30 09:03

用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除、键值的创建(设置值、修改),读取和

删除、判断注册表项是否存在、判断键值是否存在。

准备工作: 
1:要操作注册表,我们必须要引入必要的命名空间: 
C#代码 
using Microsoft.Win32;

using Microsoft.Win32;
在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~ 
2:命名空间里面提供了一个类:RegistryKey 利用它我们可以定位到注册表最开头的分支: 
ClassesRoot,CurrentUser,Users,LocalMachine,CurrentConfig 
如:C#代码 
RegistryKey key = Registry.LocalMachine;

RegistryKey key = Registry.LocalMachine;
3:在操作的过程中涉及到子分支,要用进行深入,单个会报错! 
4:最后要调用RegistryKey对象的Close()关闭对注册表的修改~~~ 
5:以下我们的例子都是在LocalMachine分支下,请注意。

一:注册表项的创建,打开与删除 
1:创建: 
创建注册表项主要用到RegistryKey 的CreateSubKey()方法。如: 
C#代码 
RegistryKey key = Registry.LocalMachine;   
RegistryKey software = key.CreateSubKey(softwaretest);

RegistryKey key = Registry.LocalMachine;
RegistryKey software = key.CreateSubKey(softwaretest);
在HKEY_LOCAL_MACHINESOFTWARE下新建名为test的注册表项。如果已经存在则不影响!

2:打开: 
打开注册表项主要用到RegistryKey 的OpenSubKey()方法。如: 
C#代码 
RegistryKey key = Registry.LocalMachine;   
RegistryKey software = key.OpenSubKey(softwaretest,true);

RegistryKey key = Registry.LocalMachine;
RegistryKey software = key.OpenSubKey(softwaretest,true);
注意该方法后面还可以有一个布尔型的参数,true表示可以写入。 
注意,如果该注册表项不存在,这调用这个方法会抛出异常

3:删除: 
删除注册表项主要用到RegistryKey 的DeleteSubKey()方法。如: 
C#代码 
RegistryKey key = Registry.LocalMachine;   
key.DeleteSubKey(softwaretest,true); //该方法无返回值,直接调用即可   
key.Close();

RegistryKey key = Registry.LocalMachine;
key.DeleteSubKey(softwaretest,true); //该方法无返回值,直接调用即可
key.Close();
注意,如果该注册表项不存在,这调用这个方法会抛出异常

二:键值的创建(设置值、修改),读取和删除 
1:创建(设置值、修改): 
对键值的创建修改等操作主要用到RegistryKey 的SetValue()方法 
C#代码 
RegistryKey key = Registry.LocalMachine;   
RegistryKey software = key.OpenSubKey(softwaretest,true); 该项必须已存在   
software.SetValue(test, 园);

RegistryKey key = Registry.LocalMachine;
RegistryKey software = key.OpenSubKey(softwaretest,true); 该项必须已存在
software.SetValue(test, 园);
在HKEY_LOCAL_MACHINESOFTWAREtest下创建一个名为“test”,值为“园”的键值。如果该键值原本已经存在,

则会修改替换原来的键值,如果不存在则是创建该键值。 
注意:SetValue()还有第三个参数,主要是用于设置键值的类型,如:字符串,二进制,Dword等等~~默认是字符串。

如: 
C#代码 
software.SetValue(test, 0, RegistryValueKind.DWord);// 二进制信息   
ey.Close();

software.SetValue(test, 0, RegistryValueKind.DWord);// 二进制信息
Key.Close();

2:读取: 
C#代码 
string info = ;   
RegistryKey Key;   
Key = Registry.LocalMachine;   
myreg = Key.OpenSubKey(softwaretest);   
myreg = Key.OpenSubKey(softwaretest,true);   
info = myreg.GetValue(test).ToString();   
myreg.Close();

string info = ;
RegistryKey Key;
Key = Registry.LocalMachine;
myreg = Key.OpenSubKey(softwaretest);
myreg = Key.OpenSubKey(softwaretest,true);
info = myreg.GetValue(test).ToString();
myreg.Close();
info结果为:园

3:删除: 
C#代码 
RegistryKey delKey = Registry.LocalMachine.OpenSubKey(Softwaretest, true);   
delKey.DeleteValue(test);   
delKey.Close();

RegistryKey delKey = Registry.LocalMachine.OpenSubKey(Softwaretest, true);
delKey.DeleteValue(test);
delKey.Close();

细心的读者可能发现了第二个例子中OpenSubKey()方法参数与其他例子的不同。 
如果你要修改键值,包括创建、设置、删除键值等都要在方法后面加个布尔参数,设置为true,表示可写可改;如果仅

仅只是读取键值可以不加,此时可写关闭,你不能再往里写值(当然,你要加也可以true)! 
还有读者提到读写默认键值的问题,主要在设置、读取的方法中将键名置空则就是对默认键值的操作。 
如: 
C#代码 
software.SetValue(, 园);   

software.SetValue(, 园); 
在HKEY_LOCAL_MACHINESOFTWAREtest修改默认键值的值为“园”。读取类似! 
另外,默认的键值是不能删除的,所以不要用DeleteValue()方法去删除,会抛出异常的!


三:判断注册表项是否存在 
C#代码 
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 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;
}

四:判断键值是否存在 
C#代码 
private bool IsRegeditKeyExit()   
{   
string[] subkeyNames;   
RegistryKey hkml = Registry.LocalMachine;   
RegistryKey software = hkml.OpenSubKey(SOFTWAREtest);   
RegistryKey software = hkml.OpenSubKey(SOFTWAREtest, true);   
subkeyNames = software.GetValueNames();   
//取得该项下所有键值的名称的序列,并传递给预定的数组中   
foreach (string keyName in subkeyNames)   
{   
if (keyName == test) 判断键值的名称   
{   
hkml.Close();   
return true;   
}   
}   
hkml.Close();   
return false;   

-----------------------------------------

 

相信每个人对注册表并不陌生,在运行里面输入“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 ; 
//打开"SYSTEM"子键 
RegistryKey software = hklm.OpenSubKey ( "SYSTEM" ) ; 
//打开"001"子键 
RegistryKey no1 = software.OpenSubKey ( "001" ) ; 
//打开"002"子键 
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" ) ; 
       //打开"SYSTEM"子键 
       RegistryKey no1 = software.OpenSubKey ( "001" ) ; 
       //打开"001"子键 
       RegistryKey no2 = no1.OpenSubKey ( "002" ) ; 
       //打开"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(); 
        } 
    } 
}

0 0
原创粉丝点击