程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 系統應用之通過注冊表獲取USB使用記錄(一)

C# 系統應用之通過注冊表獲取USB使用記錄(一)

編輯:C#入門知識

該文章是“個人電腦歷史記錄清除軟件”項目的系統應用系列文章.
前面已經講述了如何清除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信息

此處查閱多處資料並主要引用《計算機信息獲取系統的研究與實現》論文部分:
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.它可以把具有同一設備類標識的多個存儲設備區分.

四.程序實現獲取USB使用信息

具體代碼如下所示,同時希望大家去下載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);
        }
    }
}

運行結果如下圖所示:

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved