該文章是“個人電腦歷史記錄清除軟件”項目的系統應用系列文章.
前面已經講述了如何清除IE浏覽器的歷史記錄、獲取Windows最近訪問文件記錄、清除回收站等功能.現在我需要完成的是刪除USB設備上的U盤、手機、移動硬盤等記錄,真心覺得這方面資料特別少.這篇文章首先主要講述了通過注冊表獲取USB使用記錄,希望對大家有所幫助.
注冊表(registry)是Windows系統中一個重要的數據庫,它用於存儲有關應用程序、用戶和系統信息.注冊表的結構就像一顆樹.樹的頂級節點(hive)不能添加、修改和刪除.如下圖所示是Windows注冊表的頂級節點:
(1).HKEY_CURRENT_USER:包含當前登錄到Windows的用戶配置信息
(2).HKEY_USERS:包含計算機所有用戶的配置信息
(3).HKEY_LOCAL_MACHINE:包含與計算機相關的配置信息,不論用戶是否登錄
(4).HKEY_CLASSES_ROOT:包含將文件類型同程序關聯起來的信息及COM組件配置數據
(5).HKEY_CURRENT_CONFIG:包含本地計算機啟動時所使用的硬件描述文件.
詳見百度百科
在前面"C# 系統應用之IE浏覽器記錄和地址欄輸入網址"文章中我已經簡單的使用了通過注冊表獲取地址欄的信息並顯示.這裡想講講注冊表常使用的獲取內容方法.主要代碼如下:
//定義注冊表頂級節點 其命名空間是using Microsoft.Win32; RegistryKey historykey;; //檢索當前用戶CurrentUser子項Software\\Microsoft\\Internet Explorer\\typedURLs historykey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Internet Explorer\\typedURLs", true); if (historykey != null) { //獲取檢索的所有值 String[] names = historykey.GetValueNames(); foreach (String str in names) { listBox1.Items.Add(historykey.GetValue(str).ToString()); } }
其中,RegistryKey類(MSDN)表示注冊表中的頂級結點,此類是注冊表封裝.Registry類(MSDN)提供表示Windows注冊表中的根項的RegistryKey對象,並提供訪問項/值.常用值如下對應的是注冊表頂級節點內容.
上面代碼獲取IE浏覽器地址欄最近輸入URL對應的注冊表樹形路徑為:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs
通過Registry.CurrentUser(HKEY_CURRENT_USER)中的OpenSubKey函數檢索指定的子項,並指定是否將寫訪問權限應用於該項.最後通過GetValueNames()獲取檢索的所有值.函數原型:
public RegistryKey OpenSubKey( string name, //要打開的子項名稱或路徑 bool writable //如果需要項的寫訪問權限=true )
此處查閱多處資料並主要引用《計算機信息獲取系統的研究與實現》論文部分:
http://cdmd.cnki.com.cn/Article/CDMD-10431-2010236667.htm
在Windows系統中,當一個USB移動存儲設備插入時,就會在注冊表中留下痕跡.當移動設備插入計算機時,即插即用管理器PnP(Plug
and Play)接受該事件,並且在USB設備的固件(Firewre information)中查詢有關該設備的描述信息(廠商、型號、序列號等).當設備被識別後,在注冊表中創建一個新的鍵值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR
在這個鍵值下,會看到類似下面的結構子鍵:(該子鍵代表設備類標示符,用來標識設備的一個特定類)
Disk&Ven_###&Prod_###&Rev_###
其中子鍵中"###"代表區域由PnP管理器依據在USB設備描述符中獲取的數據填寫.如下圖所示
Disk&Ven_aigo&Prod_Miniking&Rev_8.07是Device class ID
Q0UKCH37&0是Unique instance ID(UID)
如果使用UVCView工具可以看見USB設備描述內容,其中的信息都是相互對應的.設備類ID一旦建立,就需要建立一個特定唯一的UID.它可以把具有同一設備類標識的多個存儲設備區分.
具體代碼如下所示,同時希望大家去下載wnt08的代碼,很有幫助http://download.csdn.net/detail/lwnt08/3083499
//獲取USB使用信息 private void button1_Click(object sender, EventArgs e) { //定義注冊表頂級節點 其命名空間是using Microsoft.Win32; RegistryKey USBKey; //檢索子項 USBKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Enum\USBSTOR", false); //檢索所有子項USBSTOR下的字符串數組 foreach (string sub1 in USBKey.GetSubKeyNames()) { RegistryKey sub1key = USBKey.OpenSubKey(sub1, false); foreach (string sub2 in sub1key.GetSubKeyNames()) { try { //打開sub1key的子項 RegistryKey sub2key = sub1key.OpenSubKey(sub2, false); //檢索Service=disk(磁盤)值的子項 cdrom(光盤) if (sub2key.GetValue("Service", "").Equals("disk")) { String Path = "USBSTOR" + "\\" + sub1 + "\\" + sub2; String Name = (string)sub2key.GetValue("FriendlyName", ""); richTextBox1.AppendText("USB名稱 " + Name + "\r\n"); richTextBox1.AppendText("UID標記 " + sub2 + "\r\n"); richTextBox1.AppendText("路徑信息 " + Path + "\r\n\r\n"); } } catch (Exception msg) //異常處理 { MessageBox.Show(msg.Message); } } }
運行結果如下圖所示: