中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

c#使用Microsoft.Win32的Registry 和RegistryKey類操作注冊表

2018-07-20    來源:open-open

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

要訪問注冊表,可以使用Microsoft.Win32命名空間中的兩個類Registry 和RegistryKey。RegistryKey實例表示一個注冊表項,這個類的方法可以瀏覽子鍵、創(chuàng)建新鍵、讀取或修改鍵中的值。換言之,該類可以完成對注冊表項進行的所有操作(除了設置鍵的安全級別之外)。RegistryKey類可以用于完成對注冊表的所有操作。Registry是不能實例化的一個類。它的作用只是提供表示頂級鍵的RegistryKey實例(不同的巢),以便開始在注冊表中瀏覽。Registry是通過靜態(tài)屬性來提供這些實例的,這些屬性共有7個,分別是ClassesRoot、CurrentConfig、CurrentUser、DynData、LocalMachine、PerformanceData和 Users。用戶可以很快猜出它們分別與哪個巢相對應。

例如,要獲得一個表示HKLM鍵的RegistryKey實例,可以編寫下面的代碼:

RegistryKey hklm = Registry.LocalMachine;

獲得RegistryKey對象引用的過程,視為打開一個鍵。

用戶可能會認為,因為注冊表的層次結構類似于文件系統(tǒng),所以RegistryKey的方法類似于DirectoryInfo的方法,但實際上并非如此。訪問注冊表的方式通常不同于使用文件和文件夾的方式,RegistryKey執(zhí)行的方法可以反映這種不同。

最明顯的區(qū)別是如何在注冊表的給定位置上打開一個注冊表項。Registry類沒有用戶可以使用的公共構造函數(shù),也沒有任何可以直接通過鍵的名稱來訪問鍵的方法。但可以在相關的巢中從上至下瀏覽該鍵。如果要實例化一個RegistryKey對象,惟一的方式是從Registry的靜態(tài)屬性開始,向下瀏覽。例如,要讀取HKLM/Software/Microsoft鍵中的一些數(shù)據(jù),可以使用下面的代碼獲得它的一個引用:

RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft");

以這種方式訪問注冊表項是只讀訪問。如果要寫入該鍵(包括寫入其值,或創(chuàng)建和刪除其子鍵),就需要使用OpenSubKey的另一個重寫方法,該方法的第二個參數(shù)是bool類型,表示是否要對該鍵進行讀寫訪問。例如,如果要修改Microsoft鍵(并假定用戶是一個系統(tǒng)管理員,有修改該鍵的許可),就應編寫如下代碼:

RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft", true);

因為這個鍵包含Microsoft應用程序使用的信息,在大多數(shù)情況下,就不應修改這個特定鍵。

如果這個鍵已經(jīng)存在,就應調(diào)用OpenSubKey()方法。如果這個鍵不存在,就返回一個空引用。如果要創(chuàng)建一個鍵,就應使用CreateSubKey()方法(該方法會通過返回的引用,自動提供該鍵的讀寫訪問):

RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMine = hkSoftware.CreateSubKey("MyOwnSoftware");

CreateSubKey()工作的方式非常有趣:如果鍵不存在,它就創(chuàng)建這個鍵。但如果鍵已經(jīng)存在,它就會返回一個表示該鍵的RegistryKey實例。這個方法采用這樣的工作方式,其原因是用戶總是可以使用這個鍵。注冊表包含長期數(shù)據(jù),例如Windows和各種應用程序的配置信息。因此用戶并不需要經(jīng)常顯式地創(chuàng)建鍵。

更常見的是,應用程序需要確保某些數(shù)據(jù)在注冊表中是存在的。換言之,如果這些數(shù)據(jù)不存在,就要創(chuàng)建相關的鍵,但如果它們存在,就不需要做任何事。CreateSubKey()就可以完成這項任務。與FileInfo.Open()的情況不同,CreateSubKey()不會刪除任何數(shù)據(jù)。如果要刪除注冊表項,就需要顯式調(diào)用RegistryKey.Delete()方法,因此注冊表對于Windows是非常重要的。如果刪除了一些重要的鍵,就會中斷Windows的執(zhí)行,此時就需要調(diào)試C#注冊表調(diào)用了。

定位了要讀取或修改的注冊表項后,就可以使用SetValue() 或 GetValue()方法設置或獲取該鍵中的值。這兩個方法的參數(shù)都是一個字符串,其中字符串給出了值的名稱,SetValue()還需要一個包含值的信息的對象引用。這個參數(shù)定義為對象引用,實際上可以是任何一個類的引用。SetValue()根據(jù)所提供的類的類型,確定把值設置為REG_SZ、REG_DWORD,還是 REG_BINARY。例如:

RegistryKey hkMine = HkSoftware.CreateSubKey("MyOwnSoftware");
hkMine.SetValue("MyStringValue", "Hello World");
hkMine.SetValue("MyIntValue", 20);

這段代碼設置鍵包含兩個值:MyStringValue的類型是REG_SZ,而MyIntValue的類型是REG_DWORD,這里只考慮這兩種類型,在后面的示例中會使用它們。

RegistryKey.GetValue()的工作方式也是這樣。它返回一個對象引用,如果該方法檢測到值的類型為REG_SZ,就返回一個字符串引用,如果值的類型為REG_DWORD,就返回一個int型值。

string stringValue = (string)hkMine.GetValue("MyStringValue");
int intValue = (int)hkMine.GetValue("MyIntValue"); 

最后,完成了讀取或修改數(shù)據(jù)后,應關閉該鍵:

```csharp
hkMine.Close();

標簽: 安全 代碼

版權申明:本站文章部分自網(wǎng)絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:用來檢查網(wǎng)絡和網(wǎng)速android小程序

下一篇:Android應用通過socket與pc通信的示例代碼