閱讀249 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go Linux文件共享(三)——dup
  下一篇:go Linux文件共享(二)——兩個獨立進程打開同一個文件