C# 讀取Windows註冊表信息

註冊表是視窗系統的一個核心的數據庫,在這個數據庫中存放中與系統相關的各種參數,這些參數直接控制中系統的啓動、硬件的驅動程序安裝信息以及在視窗系統上運行的各種應用程序的註冊信息等。這就意味着,如果註冊表因爲某些原因受到了破壞,輕者是視窗系統啓動過程出現異常,重者就有可能導致整個系統的完全癱瘓。所以正確的認識註冊表,及時的備份註冊表,對於視窗用戶就顯得相當重要。
  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中的二個類來實現的。在這二個類中還定義了對註冊表信息的刪除、修改和重命名的一些方法。這些方法比起本文介紹的讀取方法、打開方法來說,更具有破壞性,但也更實用。由於註冊表在視窗系統中的重要作用,所以在每一次對註冊表進行操作之前,一定要備份,在操作的時候也要非常小心,因爲一次的誤操作都可能導致系統崩潰。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章