目錄
一、注冊表基礎
1.Registry和RegistryKey類?
(1)Registry類
(2)RegistryKey類
二、在C#中操作注冊表
1.讀取注冊表中的信息?
(1)OpenSubKey()方法
(2)GetSubKeyNames()方法
(3)GetValueNames()方法
2.創建和修改注冊表信息
(1)創建注冊表信息
(2)修改注冊表信息
3.刪除注冊表中的信息
(1)DeleteSubKey()方法
(2)DeleteSubKeyTree方法
(3)DeleteValue()方法?
????????注冊表是一個龐大的數據庫系統,它記錄了用戶安裝在計算機上的軟件、硬件信息和每一個程序的相互關系。注冊表中存放著很多參數,直接控制著整個系統的啟動、硬件驅動程序的裝載以及應用程序的運行。
????????由于Windows 10系統本身的安全性問題,使用C#操作注冊表時,可能會提示無法操作相應的注冊表項,這時只需要為提示的注冊表項添加everyone用戶的讀寫權限即可。
一、注冊表基礎
????????Windows注冊表包含Windows安裝、用戶喜好以及已安裝軟件和設備的所有配置信息的核心存儲庫。
1.Registry和RegistryKey類?
????????NET Framework提供了訪問注冊表的類,比較常用的是Registry和RegistryKey類,這兩個類都在Microsoft.Win32命名空間中。
(1)Registry類
????????Registry類不能被實例化,它的作用只是實例化RegistryKey類,以便開始在注冊表中瀏覽。Registry類是通過靜態屬性來提供這些實例的,這些屬性共有7個:
屬 ??性 | 說 ??明 |
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 |
????????Registry類主要用于存儲有關用戶首選項的信息、存儲本地計算機的配置信息、存儲有關類型和類及其屬性的信息、存儲有關默認用戶配置的信息、存儲軟件組件的性能信息、存儲非用戶特定的硬件信息、存儲動態數據。
(2)RegistryKey類
????????RegistryKey實例表示一個注冊表項,這個類的方法可以瀏覽子鍵、創建新鍵、讀取或修改鍵中的值。也就是說,該類可以完成對注冊表項的所有操作。除了設置鍵的安全級別之外,RegistryKey類可以用于完成對注冊表的所有操作。
????????RegistryKey類的常用屬性及說明:
屬 ???性 | 說 ???明 |
Name | ???檢索項的名稱 |
SubKeyCount | ???檢索當前項的子項數目 |
ValueCount | ???檢索項中值的計數 |
????????RegistryKey類的常用方法及說明
方法 | 說 明 |
?Close | ???關閉鍵 |
CreateSubkey | ???創建給定名稱的子鍵(如果該子鍵已經存在,就打開它) |
DeleteSubkey | ???刪除指定的子鍵 |
DeleteSubkeyTree | ???徹底刪除子鍵及其所有的子鍵 |
DeleteValue | ???從鍵中刑除一個指定的值 |
GetSubkeyNames | ???返回包含子鍵名稱的字符串數組 |
?GetValue | ???返回指定的值 |
GetValueNames | ???返回一個包含所有鍵值名稱的字符申數組 |
OpenSubKey | ???返回表示給定子鍵的 RegistryKey 實例引用 |
?SetValue | ???設置指定 |
二、在C#中操作注冊表
????????主要包括讀取注冊表中的信息、刪除注冊表中的信息以及創建和刪除注冊表信息。
1.讀取注冊表中的信息?
???????讀取注冊表中的信息主要是通過RegistryKey類中的OpenSubKey()方法、GetSubKeyNames()方法和GetValueNames()方法實現的。
(1)OpenSubKey()方法
????????OpenSubKey()方法用于檢索指定的子項。
public RegistryKey OpenSubKey(string name)
? name:要以只讀方式打開的子項的名稱或路徑。
? 返回值:請求的子項。如果操作失敗,則為空引用。
????????如果要打開的項不存在,OpenSubKey()方法將返回null引用,而不是引發異常。
(2)GetSubKeyNames()方法
????????GetSubKeyNames()方法用于檢索包含所有子項名稱的字符串數組。
public string[]GetSubKeyNames()
返回值:包含當前項的子項名稱的字符串數組。?
????????如果當前項已被刪除,或是用戶沒有讀取該項的權限,將觸發異常。
// 通過GetSubKeyNames()方法檢索
// HKEY_LOCAL_MACHINE\SOFTWARE子鍵下包含的
// 所有子項名稱的字符串數組
using Microsoft.Win32;namespace _01
{public partial class Form1 : Form{private RichTextBox? richTextBox1;public Form1(){InitializeComponent();Load += new EventHandler(Form1_Load);}private void Form1_Load(object? sender, EventArgs e){// // richTextBox1// richTextBox1 = new RichTextBox{Dock = DockStyle.Fill,Location = new Point(0, 0),Name = "richTextBox1",Size = new Size(284, 241),TabIndex = 0,Text = ""};RegistryKey regkey = Registry.LocalMachine;RegistryKey? sys = regkey.OpenSubKey(@"SOFTWARE");foreach (string str in sys!.GetSubKeyNames()){richTextBox1.Text += str + "\n";}// // Form1// AutoScaleDimensions = new SizeF(6F, 12F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(284, 241);Controls.Add(richTextBox1);Name = "Form1";StartPosition = FormStartPosition.CenterScreen;Text = "Form1"; }}
}
?
(3)GetValueNames()方法
????????GetValueNames()方法用于檢索包含與此項關聯的所有值名稱的字符串數組。
public string[]GetValueNames()
返回值:包含當前項的值名稱的字符串數組。 ?
????????如果沒有找到此項的值名稱,則返回一個空數組;如果在注冊表項設置了一個具有默認值的名稱為空字符串的項,則GetValueNames()方法返回的數組中包含該空字符串。
// 讀取HKEY_LOCAL_MACHINE\SOFTWARE子鍵下的項目信息
// 利用對象的OpenSubKey()方法打開指定的鍵
using Microsoft.Win32;namespace _02
{public partial class Form1 : Form{private ListBox? listBox1;public Form1(){InitializeComponent();Load += new EventHandler(Form1_Load);}private void Form1_Load(object? sender, EventArgs e){listBox1 = new ListBox{Dock = DockStyle.Fill,FormattingEnabled = true,ItemHeight = 12,Location = new Point(0, 0),Name = "listBox1",Size = new Size(294, 271),TabIndex = 0};listBox1.Items.Clear();var regkey = Registry.LocalMachine;RegistryKey? sys = regkey.OpenSubKey(@"SOFTWARE");foreach (string str in sys!.GetSubKeyNames()){listBox1.Items.Add("子項名:" + str);RegistryKey? sikey = sys.OpenSubKey(str); //打開子鍵foreach (string sVName in sikey!.GetValueNames()){listBox1.Items.Add(sVName + sikey.GetValue(sVName));}}// // Form1// AutoScaleDimensions = new SizeF(6F, 12F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(294, 271);Controls.Add(listBox1);Name = "Form1";StartPosition = FormStartPosition.CenterScreen;Text = "Form1";}}
}
?
2.創建和修改注冊表信息
(1)創建注冊表信息
????????通過RegistryKey類的CreateSubKey()方法和SetValue()方法可以創建注冊表信息,下面介紹這兩種方法。
- CreateSubKey()方法
????????主要用于創建一個新子項或打開一個現有子項以進行寫訪問。?
public RegistryKey CreateSubKey (string subkey)
? subkey:要創建或打開的子項的名稱或路徑。
? 返回值:RegistryKey對象,表示新建的子項或空引用。如果為subkey指定了零長度字符串,則返回當前的RegistryKey對象。
- SetValue()方法
????????主要用于設置注冊表項中的名稱/值對的值。
public void SetValue (string name,Object value)
? name:要存儲的值的名稱。
? value:要存儲的數據。
????????SetValue()方法用于從非托管代碼中訪問托管類,不應從托管代碼調用。
// 通過RegistryKey類的CreateSubKey()方法和SetValue()方法創建一個子鍵
using Microsoft.Win32;namespace _03
{public partial class Form1 : Form{private Button? button1;public Form1(){InitializeComponent();Load += new EventHandler(Form1_Load);}private void Form1_Load(object? sender, EventArgs e){// // button1// button1 = new Button{ Location = new Point(12, 12),Name = "button1",Size = new Size(75, 23),TabIndex = 0,Text = "創建子鍵",UseVisualStyleBackColor = true};button1.Click += new EventHandler(Button1_Click);// // Form1// AutoScaleDimensions = new SizeF(6F, 12F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(384, 211);Controls.Add(button1);Name = "Form1";StartPosition = FormStartPosition.CenterScreen;Text = "創建子鍵";}/// <summary>/// 在主鍵HKEY_LOCAL_MACHINE的HARDWARE鍵下創建一個名為MR的子鍵,/// 然后在這個子鍵下再創建一個名為測試的子鍵,/// 在測試子鍵下創建一個名為value、數據值是1234的鍵值/// </summary>private void Button1_Click(object? sender, EventArgs e){try{RegistryKey? hklm = Registry.LocalMachine;RegistryKey? software = hklm.OpenSubKey("HARDWARE", true);RegistryKey? main1 = software!.CreateSubKey("MR");RegistryKey? ddd = main1.CreateSubKey("測試");ddd.SetValue("value", "1234");MessageBox.Show("創建成功");}catch (Exception ex){MessageBox.Show(ex.Message);}}}
}
?
(2)修改注冊表信息
????????由于注冊表中的信息十分重要,所以一般不要對其進行寫的操作。也可能是這個原因,在.Net Framework中并沒有提供修改注冊表鍵的方法。而只是提供了一個危害性相對較小的SetValue()方法,通過這個方法,可以修改鍵值。在使用SetValue()方法時,如果它檢測到指定的鍵值不存在,就會創建一個新的鍵值。?
// 將主鍵HKEY_LOCAL_MACHINE\HARDWARE\MR\測試
// 下名為value的鍵值的數據值修改為abcd
using Microsoft.Win32;namespace _04
{public partial class Form1 : Form{private Button? button1;public Form1(){InitializeComponent();Load += new EventHandler(Form1_Load);}private void Form1_Load(object? sender, EventArgs e){// // button1// button1 = new Button{Location = new Point(197, 12),Name = "button1",Size = new Size(75, 23),TabIndex = 0,Text = "修改",UseVisualStyleBackColor = true};button1.Click += new EventHandler(Button1_Click);// // Form1// AutoScaleDimensions = new SizeF(6F, 12F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(284, 111);Controls.Add(button1);Name = "Form1";StartPosition = FormStartPosition.CenterScreen;Text = "Form1";}private void Button1_Click(object? sender, EventArgs e){try{RegistryKey? hklm = Registry.LocalMachine;RegistryKey? software = hklm?.OpenSubKey("HARDWARE", true);RegistryKey? dddw = software?.OpenSubKey("MR", true);RegistryKey? regkey = dddw?.OpenSubKey("測試", true);regkey?.SetValue("value", "abcd");MessageBox.Show("修改成功");}catch (Exception ex){MessageBox.Show(ex.Message);}}}
}
3.刪除注冊表中的信息
????????刪除注冊表中的信息主要通過RegistryKey類中的DeleteSubKey()方法、DeleteSubKeyTree()方法和DeleteValue()方法來實現。
(1)DeleteSubKey()方法
? ? ? ? DeleteSubKey()方法用于刪除不包含任何子鍵的子鍵。 語法如下:
publie void DeleteSubKey (string subkey,bool throwOnMissingSubKey)
? subkey:要刪除的子項的名稱。
? throwOnMissingSubKey:如果值為true,在程序調用時,刪除的子鍵不存在,則產生一個錯誤信息;如果值為false,在程序調用時,刪除的子鍵不存在,也不產生錯誤信息,程序依然正確運行。?
????????如果刪除的項有子級子項,將觸發異常。必須將子項刪除后,才能刪除該項。
// 通過RegistryKey類的DeleteSubKey()方法刪除
// HKEY_LOCAL_MACHINE\HARDWARE\MR鍵下的測試子鍵
using Microsoft.Win32;namespace _05
{public partial class Form1 : Form{private Button? button1;public Form1(){InitializeComponent();Load += new EventHandler(Form1_Load);}private void Form1_Load(object? sender, EventArgs e){// // button1// button1 = new Button{Location = new Point(118, 46),Name = "button1",Size = new Size(75, 23),TabIndex = 0,Text = "刪除",UseVisualStyleBackColor = true};button1.Click += new EventHandler(Button1_Click);// // Form1// AutoScaleDimensions = new SizeF(6F, 12F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(331, 99);Controls.Add(button1);Name = "Form1";Text = "Form1";}/// <summary>/// 打開"SOFTWARE"子鍵/// 打開MR子鍵/// 刪除名稱為測試的子鍵/// </summary>private void Button1_Click(object? sender, EventArgs e){try{RegistryKey? hklm = Registry.LocalMachine;RegistryKey? software = hklm?.OpenSubKey("HARDWARE", true);RegistryKey? no1 = software?.OpenSubKey("MR", true);no1?.DeleteSubKey("測試", false);MessageBox.Show("刪除成功");}catch (Exception ex){MessageBox.Show(ex.Message);}}}
}
(2)DeleteSubKeyTree方法
????????DeleteSubKeyTree()方法用于徹底刪除指定的子鍵目錄,包括刪除該子鍵以及該子鍵以下的全部子鍵。由于此方法的破壞性非常強,所以在使用時要特別謹慎。語法如下:
public void DeleteSubKeyTree(sting subkey)
subkey:要徹底刪除的子鍵名稱。?
????????當刪除的項為null時,則觸發異常。
// 通過DeleteSubKeyTree()方法將徹底刪除
// HKEY_LOCAL_MACHINE\HARDWARE\MR鍵下的子鍵
using Microsoft.Win32;namespace _06
{public partial class Form1 : Form{private Button? button1;public Form1(){InitializeComponent();Load += new EventHandler(Form1_Load);}private void Form1_Load(object? sender, EventArgs e){// // button1// button1 = new Button{Location = new Point(151, 12),Name = "button1",Size = new Size(121, 23),TabIndex = 0,Text = "徹底刪除子鍵",UseVisualStyleBackColor = true};button1.Click += new EventHandler(Button1_Click);// // Form1// AutoScaleDimensions = new SizeF(6F, 12F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(284, 111);Controls.Add(button1);Name = "Form1";StartPosition = FormStartPosition.CenterScreen;Text = "Form1";}/// <summary>/// 打開"SOFTWARE"子鍵/// 打開MR子鍵/// 刪除名稱為測試的子鍵/// </summary>private void Button1_Click(object? sender, EventArgs e){try{RegistryKey? hklm = Registry.LocalMachine;//hklm.DeleteSubKey("aaa", false);RegistryKey? software = hklm.OpenSubKey("HARDWARE", true);RegistryKey? no1 = software?.OpenSubKey("MR", true);no1!.DeleteSubKeyTree("測試");MessageBox.Show("刪除成功");}catch (Exception ex){MessageBox.Show(ex.Message);}}}
}
(3)DeleteValue()方法?
????????DeleteValue()方法主要用于刪除指定的鍵值。語法如下:
publie void DeleteValue(string name)
name:要刪除的值的名稱。
如果在找不到指定值的情況下使用該值,又不想引發異常,可以使用DeleteValue(string name,bool?throwOnMissingValue)重載方法。如果throwOnMissingValue參數為true時,將不引發異常。
// 通過DeleteValue方法刪除
// HKEY_LOCAL_MACHINE\HARDWARE\MR\測試鍵下的名稱為value的鍵值
using Microsoft.Win32;namespace _07
{public partial class Form1 : Form{private Button? button1;public Form1(){InitializeComponent();Load += new EventHandler(Form1_Load);}private void Form1_Load(object? sender, EventArgs e){// // button1// button1 = new Button{Location = new Point(132, 12),Name = "button1",Size = new Size(75, 23),TabIndex = 0,Text = "刪除鍵值",UseVisualStyleBackColor = true};button1.Click += new EventHandler(Button1_Click);// // Form1// AutoScaleDimensions = new SizeF(6F, 12F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(219, 196);Controls.Add(button1);Name = "Form1";StartPosition = FormStartPosition.CenterScreen;Text = "Form1";}/// <summary>/// 打開"SOFTWARE"子鍵/// 打開MR子鍵,打開測試子鍵/// 刪除名稱為"value"的鍵值/// </summary>private void Button1_Click(object? sender, EventArgs e){try{RegistryKey? hklm = Registry.LocalMachine;RegistryKey? software = hklm?.OpenSubKey("HARDWARE", true);RegistryKey? no1 = software?.OpenSubKey("MR", true);RegistryKey? no2 = no1?.OpenSubKey("測試", true);no2?.DeleteValue("value");MessageBox.Show("刪除鍵值成功");}catch (Exception ex){MessageBox.Show(ex.Message);}}}
}