C#操作註冊表全攻略

来源:http://www.cnblogs.com/androidshouce/archive/2016/07/07/5648845.html
-Advertisement-
Play Games

相信每個人對註冊表並不陌生,在運行裡面輸入“regedit”就可以打開註冊表編輯器了。這東西對Windows系統來說可是比較重要的,也是病 毒常常會光顧的地方,比如病毒和惡意軟體常常會在註冊表的啟動項裡面寫入自己的啟動鍵值來達到自啟動的目的,有些病毒還會修改註冊表裡面來映像劫持殺毒軟 件,這是破壞系 ...


相信每個人對註冊表並不陌生,在運行裡面輸入“regedit”就可以打開註冊表編輯器了。這東西對Windows系統來說可是比較重要的,也是病 毒常常會光顧的地方,比如病毒和惡意軟體常常會在註冊表的啟動項裡面寫入自己的啟動鍵值來達到自啟動的目的,有些病毒還會修改註冊表裡面來映像劫持殺毒軟 件,這是破壞系統的第一步。同時,大多軟體(軟體的序列號和信息)和硬體信息、系統信息、安全模式等等設置都保存在這裡,因此系統的健康在很大程度上要依 賴註冊表的健康。
       作為編程開發人員,我們有必要瞭解註冊表並學會操作註冊表。下麵我們就來用.NET下托管語言C#操作註冊表,主要內容包括:註冊表項的創建,打開與刪除、鍵值的創建(設置值、修改),讀取和刪除、判斷註冊表項是否存在、判斷鍵值是否存在。 
準備工作:
1:要操作註冊表,我們必須要引入必要的命名空間:

  1. using  Microsoft.Win32;  
  1. using Microsoft.Win32;  

  在這個命名空間裡面包含了許多註冊表相關的類,足夠我們使用了~~
2:命名空間裡面提供了一個類:RegistryKey   利用它我們可以定位到註冊表最開頭的分支:
ClassesRoot,CurrentUser,Users,LocalMachine,CurrentConfig
如:RegistryKey key = Registry.LocalMachine;
3:在操作的過程中涉及到子分支,要用\\進行深入,單個\會報錯!
4:最後要調用RegistryKey對象的Close()關閉對註冊表的修改~~~
5:以下我們的例子都是在LocalMachine分支下,請註意。

一:註冊表項的創建,打開與刪除
1:創建:
創建註冊表項主要用到RegistryKey 的CreateSubKey()方法。如:

  1. RegistryKey key = Registry.LocalMachine;  
  2.   
  3. RegistryKey software = key.CreateSubKey("software\\test" );    
  4.   
  5. //在HKEY_LOCAL_MACHINE\SOFTWARE下新建名為test的註冊表項。如果已經存在則不影響!   
  1. RegistryKey key = Registry.LocalMachine;  
  2.   
  3. RegistryKey software = key.CreateSubKey("software\\test");    
  4.   
  5. //在HKEY_LOCAL_MACHINE\SOFTWARE下新建名為test的註冊表項。如果已經存在則不影響!  

 
2:打開:
打開註冊表項主要用到RegistryKey 的OpenSubKey()方法。如:

  1. RegistryKey key = Registry.LocalMachine;  
  2.   
  3. RegistryKey software = key.OpenSubKey("software\\test" , true );    
  4.   
  5. //註意該方法後面還可以有一個布爾型的參數,true表示可以寫入。   
  1. RegistryKey key = Registry.LocalMachine;  
  2.   
  3. RegistryKey software = key.OpenSubKey("software\\test",true);    
  4.   
  5. //註意該方法後面還可以有一個布爾型的參數,true表示可以寫入。  

  註意,如果該註冊表項不存在,這調用這個方法會拋出異常

3:刪除:
刪除註冊表項主要用到RegistryKey 的DeleteSubKey()方法。如:

  1. RegistryKey key = Registry.LocalMachine;  
  2.   
  3. key.DeleteSubKey("software\\test" , true );     //該方法無返回值,直接調用即可   
  4.   
  5. key.Close();  
  1. RegistryKey key = Registry.LocalMachine;  
  2.   
  3. key.DeleteSubKey("software\\test",true);    //該方法無返回值,直接調用即可  
  4.   
  5. key.Close();  

  註意,如果該註冊表項不存在,這調用這個方法會拋出異常

二:鍵值的創建(設置值、修改),讀取和刪除
1:創建(設置值、修改):
對鍵值的創建修改等操作主要用到RegistryKey 的SetValue()方法

  1. RegistryKey key = Registry.LocalMachine;  
  2.   
  3. RegistryKey software = key.OpenSubKey("software\\test" , true );  //該項必須已存在   
  4.   
  5. software.SetValue("test" ,  "coolszy" );   
  1. RegistryKey key = Registry.LocalMachine;  
  2.   
  3. RegistryKey software = key.OpenSubKey("software\\test",true); //該項必須已存在  
  4.   
  5. software.SetValue("test", "coolszy");   

 //在HKEY_LOCAL_MACHINE\SOFTWARE\test下創建一個名為“test”,值為“coolszy”的鍵值。如果該鍵值原本已經存在,則會修改替換原來的鍵值,如果不存在則是創建該鍵值。
// 註意:SetValue()還有第三個參數,主要是用於設置鍵值的類型,如:字元串,二進位,Dword等等~~預設是字元串。如:
// software.SetValue("test", "0", RegistryValueKind.DWord); //二進位信息
Key.Close();

2:讀取:

  1. string  info =  "" ;  
  2.   
  3. RegistryKey Key;  
  4.   
  5. Key = Registry.LocalMachine;  
  6.   
  7. myreg = Key.OpenSubKey("software\\test" );    
  8.   
  9. // myreg = Key.OpenSubKey("software\\test",true);   
  10.   
  11. info = myreg.GetValue("test" ).ToString();  
  12.   
  13. myreg.Close();  
  1. string info = "";  
  2.   
  3. RegistryKey Key;  
  4.   
  5. Key = Registry.LocalMachine;  
  6.   
  7. myreg = Key.OpenSubKey("software\\test");    
  8.   
  9. // myreg = Key.OpenSubKey("software\\test",true);  
  10.   
  11. info = myreg.GetValue("test").ToString();  
  12.   
  13. myreg.Close();  

 
info結果為:coolszy
3:刪除:

  1. RegistryKey delKey = Registry.LocalMachine.OpenSubKey( "Software\\test" ,  true );  
  2.   
  3. delKey.DeleteValue("test" );  
  4.   
  5. delKey.Close();  
  1. RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software\\test", true);  
  2.   
  3. delKey.DeleteValue("test");  
  4.   
  5. delKey.Close();  

 
細心的讀者可能發現了第二個例子中OpenSubKey()方法參數與其他例子的不同。
如果你要修改鍵值,包括創建、設置、刪除鍵值等都要在方法後面加個布爾參數,設置為true,表示可寫可改;如果僅僅只是讀取鍵值可以不加,此時可寫關閉,你不能再往裡寫值(當然,你要加也可以true)!
還有讀者提到讀寫預設鍵值的問題,主要在設置、讀取的方法中將鍵名置空則就是對預設鍵值的操作。
如:
software.SetValue("", "coolszy"); //   在HKEY_LOCAL_MACHINE\SOFTWARE\test修改預設鍵值的值為“博coolszy”。讀取類似!
另外,預設的鍵值是不能刪除的,所以不要用DeleteValue()方法去刪除,會拋出異常的!


三:判斷註冊表項是否存在

  1. private   bool  IsRegeditItemExist()  
  2.   
  3. {  
  4.   
  5.     string [] subkeyNames;  
  6.   
  7.     RegistryKey hkml = Registry.LocalMachine;  
  8.   
  9. RegistryKey software = hkml.OpenSubKey("SOFTWARE" );  
  10.   
  11. //RegistryKey software = hkml.OpenSubKey("SOFTWARE", true);   
  12.   
  13. subkeyNames = software.GetSubKeyNames();   
  14.   
  15. //取得該項下所有子項的名稱的序列,並傳遞給預定的數組中   
  16.   
  17.     foreach  ( string  keyName  in  subkeyNames)    //遍歷整個數組   
  18.   
  19.     {  
  20.   
  21.          if  (keyName ==  "test" )  //判斷子項的名稱   
  22.   
  23.          {               
  24.   
  25.              hkml.Close();  
  26.   
  27.              return   true ;  
  28.   
  29.           }  
  30.   
  31.        }  
  32.   
  33.          hkml.Close();  
  34.   
  35.          return   false ;              
  36.   
  37. }  
  1. private bool IsRegeditItemExist()  
  2.   
  3. {  
  4.   
  5.     string[] subkeyNames;  
  6.   
  7.     RegistryKey hkml = Registry.LocalMachine;  
  8.   
  9. RegistryKey software = hkml.OpenSubKey("SOFTWARE");  
  10.   
  11. //RegistryKey software = hkml.OpenSubKey("SOFTWARE", true);  
  12.   
  13. subkeyNames = software.GetSubKeyNames();   
  14.   
  15. //取得該項下所有子項的名稱的序列,並傳遞給預定的數組中  
  16.   
  17.     foreach (string keyName in subkeyNames)   //遍歷整個數組  
  18.   
  19.     {  
  20.   
  21.          if (keyName == "test") //判斷子項的名稱  
  22.   
  23.          {               
  24.   
  25.              hkml.Close();  
  26.   
  27.              return true;  
  28.   
  29.           }  
  30.   
  31.        }  
  32.   
  33.          hkml.Close();  
  34.   
  35.          return false;              
  36.   
  37. }  

 
四:判斷鍵值是否存在

  1. private   bool  IsRegeditKeyExit()  
  2.   
  3. {  
  4.   
  5.     string [] subkeyNames;  
  6.   
  7.     RegistryKey hkml = Registry.LocalMachine;  
  8.   
  9. RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test" );  
  10.   
  11.     //RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test", true);   
  12.   
  13.     subkeyNames = software.GetValueNames();  
  14.   
  15. //取得該項下所有鍵值的名稱的序列,並傳遞給預定的數組中   
  16.   
  17.     foreach  ( string  keyName  in  subkeyNames)  
  18.   
  19.     {  
  20.   
  21.          if  (keyName ==  "test" )    //判斷鍵值的名稱   
  22.   
  23.          {  
  24.   
  25.             hkml.Close();  
  26.   
  27.             return   true ;  
  28.   
  29.           }  
  30.   
  31.     }  
  32.   
  33.          hkml.Close();  
  34.   
  35.          return   false ;  
  36.   
  37.     }  
  1. private bool IsRegeditKeyExit()  
  2.   
  3. {  
  4.   
  5.     string[] subkeyNames;  
  6.   
  7.     RegistryKey hkml = Registry.LocalMachine;  
  8.   
  9. RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test");  
  10.   
  11.     //RegistryKey software = hkml.OpenSubKey("SOFTWARE\\test", true);  
  12.   
  13.     subkeyNames = software.GetValueNames();  
  14.   
  15. //取得該項下所有鍵值的名稱的序列,並傳遞給預定的數組中  
  16.   
  17.     foreach (string keyName in subkeyNames)  
  18.   
  19.     {  
  20.   
  21.          if (keyName == "test")   //判斷鍵值的名稱  
  22.   
  23.          {  
  24.   
  25.             hkml.Close();  
  26.   
  27.             return true;  
  28.   
  29.           }  
  30.   
  31.     }  
  32.   
  33.          hkml.Close();  
  34.   
  35.          return false;  
  36.   
  37.     }  

 
       至此,C#操作註冊表就到此為止了。本文幾乎囊括了C#語言對註冊表的所有操作,只要認真看完此文,認真時間就肯定對註冊表的讀取修改游刃有餘了。
註:本文所有例子在VS2008+WinXP下調試通過…


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前臺: var username = $("#UserName").val(); var tel = $("#tel").val(); var yzm = $("#yzm").val(); var con = $("#con").val(); layer.msg('正在提交數據', { icon: ...
  • 標簽: WebSocket SignalR "前言" "1. Web消息交互技術" "1.1 常見技術" "1.2 WebSocket介紹" "1.3 WebSocket示例" "2. Signal" "2.1 SignalR是什麼" "2.2 預設傳輸方式" "2.3 指定傳輸方式" "2.4 自 ...
  • 通常,我們會對於一個文本文件數據導入到資料庫中,不多說,上代碼。 首先,表結構如下. 其次,在我當前D盤中有個文本文件名為2.txt的文件。 在資料庫中,可以這樣通過一句代碼插入。 1) bulk insert: 為Sql server 中一個批量插入的操作 2)T_Demo: 要插入的表 3)'D ...
  • 在C# 6.0,當我們使用Dictionary時,我們可以使用新語法,來去簡化程式以提高效率。 public Dictionary<string, object> OldToolLocations = new Dictionary<string, object>() { {"ToolLocation ...
  • Extjs Mvc模式下的整個MVC框架體系即下圖: 包含了Controller(實現方法層),Store(數據來源管理層),View(頁面佈局層)。之所以用MVC我想是因為減輕針對某一頁面的單一的JS 的開發,為啥呢,可以看一下沒有使用MVC模式的Extjs 的編碼: (因為我也是新手,所以可能里 ...
  • 為了使用方便,對Autofac container的簡單封裝,記錄如下,備以後用或分享給大家,歡迎討論! 使用方法如下: ...
  • MD5的加密方法很多,今天說下MD5的十六進位加密···先貼方法···· 根據方法 GetMD5就可以得到想要的MD5十六進位加密 ...
  • 是不是在安裝vs2010 vs2012 vs2013 vs2015的時候,好不容易安裝完成了,卻有一個警告:“xxxx,沒有驗證對象的數字簽名。”? 你用迅雷下載的安裝包有問題!!!你用迅雷下載的安裝包有問題!!!你用迅雷下載的安裝包有問題!!! 刪了它吧,沒有什麼好懷疑的,好留戀的,無論你重裝多少 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...