相信每個人對註冊表並不陌生,在運行裡面輸入“regedit”就可以開啟登錄編輯程式了。這東西對Windows系統來說可是比較重要的,也是病毒常常會光顧的地方,比如病毒和惡意軟體常常會在註冊表的啟動項裡面寫入自己的啟動索引值來達到自啟動的目的,有些病毒還會修改註冊表裡面來映像劫持殺毒軟體,這是破壞系統的第一步。同時,大多軟體(軟體的序號和資訊)和硬體資訊、系統資訊、安全模式等等設定都儲存在這裡,因此系統的健康在很大程度上要依賴註冊表的健康。 作為編程開發人員,我們有必要瞭解註冊表並學會操作註冊表。下面我們就來用.NET下託管語言C#操作註冊表,主要內容包括:登錄機碼的建立,開啟與刪除、索引值的建立(設定值、修改),讀取和刪除、判斷登錄機碼是否存在、判斷索引值是否存在。
準備工作: 1:要操作註冊表,我們必須要引入必要的命名空間: using Microsoft.Win32; 在這個命名空間裡麵包含了許多註冊表相關的類,足夠我們使用了~~ 2:命名空間裡面提供了一個類:RegistryKey 利用它我們可以定位到註冊表最開頭的分支: ClassesRoot,CurrentUser,Users,LocalMachine,CurrentConfig 如:RegistryKey key = Registry.LocalMachine; 3:在操作的過程中涉及到子分支,要用\\進行深入,單個\會報錯! 4:最後要調用RegistryKey對象的Close()關閉對註冊表的修改~~~ 5:以下我們的例子都是在LocalMachine分支下,請注意。
一:登錄機碼的建立,開啟與刪除 1:建立: 建立登錄機碼主要用到RegistryKey 的CreateSubKey()方法。如: RegistryKey key = Registry.LocalMachine; RegistryKey software = key.CreateSubKey("software\\test"); //在HKEY_LOCAL_MACHINE\SOFTWARE下建立名為test的登錄機碼。如果已經存在則不影響!
2:開啟: 開啟登錄機碼主要用到RegistryKey 的OpenSubKey()方法。如: RegistryKey key = Registry.LocalMachine; RegistryKey software = key.OpenSubKey("software\\test",true); //注意該方法後面還可以有一個布爾型的參數,true表示可以寫入。 注意,如果該登錄機碼不存在,這調用這個方法會拋出異常
3:刪除: 刪除登錄機碼主要用到RegistryKey 的DeleteSubKey()方法。如: RegistryKey key = Registry.LocalMachine; key.DeleteSubKey("software\\test",true); //該方法無傳回值,直接調用即可 key.Close(); 注意,如果該登錄機碼不存在,這調用這個方法會拋出異常
二:索引值的建立(設定值、修改),讀取和刪除 1:建立(設定值、修改): 對索引值的建立修改等操作主要用到RegistryKey 的SetValue()方法 RegistryKey key = Registry.LocalMachine; RegistryKey software = key.OpenSubKey("software\\test",true); //該項必須已存在 software.SetValue("test", "部落格園");
//在HKEY_LOCAL_MACHINE\SOFTWARE\test下建立一個名為“test”,值為“部落格園”的索引值。如果該索引值原本已經存在,則會修改替換原來的索引值,如果不存在則是建立該索引值。 // 注意:SetValue()還有第三個參數,主要是用於設定索引值的類型,如:字串,二進位,Dword等等~~預設是字串。如: // software.SetValue("test", "0", RegistryValueKind.DWord); //二進位資訊 Key.Close();
2:讀取: string info = ""; RegistryKey Key; Key = Registry.LocalMachine; myreg = Key.OpenSubKey("software\\test"); // myreg = Key.OpenSubKey("software\\test",true); info = myreg.GetValue("test").ToString(); myreg.Close(); info結果為:部落格園
3:刪除: RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software\\test", true); delKey.DeleteValue("test"); delKey.Close();
細心的讀者可能發現了第二個例子中OpenSubKey()方法參數與其他例子的不同。 如果你要修改索引值,包括建立、設定、刪除索引值等都要在方法後面加個布爾參數,設定為true,表示可寫可改;如果僅僅只是讀取索引值可以不加,此時可寫關閉,你不能再往裡寫值(當然,你要加也可以true)! 還有讀者提到讀寫預設索引值的問題,主要在設定、讀取的方法中將鍵名置空則就是對預設索引值的操作。 如: software.SetValue("", "部落格園"); // 在HKEY_LOCAL_MACHINE\SOFTWARE\test修改預設索引值的值為“部落格園”。讀取類似! 另外,預設的索引值是不能刪除的,所以不要用DeleteValue()方法去刪除,會拋出異常的!
三:判斷登錄機碼是否存在 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 IsRegeditKeyExit() { string[] subkeyNames; RegistryKey hkml = Registry.LocalMachine; RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test"); //RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test", true); subkeyNames = software.GetValueNames(); //取得該項下所有索引值的名稱的序列,並傳遞給預定的數組中 foreach (string keyName in subkeyNames) { if (keyName == "test") //判斷索引值的名稱 { hkml.Close(); return true; } } hkml.Close(); return false; }