C# 係統應用之通過注冊表獲取USB使用記錄(一)
該文章是“個人電腦曆史記錄清除軟件”項目的係統應用係列文章.
前麵已經講述了如何清除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#中注冊表簡單使用
在前麵"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 )
三.注冊表如何存儲USB信息
此處查閱多處資料並主要引用《計算機信息獲取係統的研究與實現》論文部分:
https://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.它可以把具有同一設備類標識的多個存儲設備區分.
四.程序實現獲取USB使用信息
具體代碼如下所示,同時希望大家去下載wnt08的代碼,很有幫助https://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); } } }
運行結果如下圖所示:
其中對應的注冊表信息如下圖所示:
其中對應的FriendlyName即是輸出的“USB名稱 aigo Miniking USB Device”,UID序號為"Q0UKCH37".搜索的Service(服務)為disk(磁盤)的選項.
五.總結與展望
首先個人感觸,這方麵的資料真心很少,文章博客也少,所以看起來操作似乎很簡單,但真正實現起來還是令人深思的.然後就是其實存儲USB記錄的還有很多鍵值.如
1.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
該鍵值中能看到廠商號(VID_)、廠商產品號(PID_),還有LocationInformation(端口號) Port_#0001.Hub_#0005等.
2.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses
該鍵值下有兩個設備類:{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}{53F5630d-B6BF-11D0-94F2-00A0C91EFB8B},可以通過他們獲取USB最後接入係統時間.
接下來我想要完成的就是如何把這些鍵值聯係起來,似乎要通過Dictionary<string, UInfo>,同時怎樣獲取時間,怎樣正確刪除這些信息.最後希望文章對大家有所幫助,如果有錯誤或不足之處,還請海涵!最後感謝下麵參考資料的一些文章博客和作者.這類資料真心不好找,都是相關的內容而且不錯的,有的引用,有的沒有,但都不錯,也希望這些鏈接大家能用到.
(By:Eastmount 2014-4-8 夜1點半 原創CSDN
https://blog.csdn.net/eastmount/)
參考資料及相似文章(值得一看):
1.《計算機信息獲取係統的研究與實現》論文講訴了計算機取證學及USB原理
https://cdmd.cnki.com.cn/Article/CDMD-10431-2010236667.htm
2.Tracking USB storage: Analysis of windows artifacts generated by USB storage devices
英文文章,如何獲取USB使用記錄的時間及信息
https://www.sciencedirect.com/science/article/pii/S1742287605000320
3.用C# 編寫USB存儲設備使用痕跡檢測和刪除工具 講訴了如何刪除獲取分章節講解
https://blog.csdn.net/metaphysis/article/details/18504315
4.C# 讀取注冊表獲取U盤使用記錄
https://download.csdn.net/detail/lwnt08/3083499
最後更新:2017-04-03 12:56:03