C# 獲取USB設備信息


C# 獲取USB設備信息

WMI方式

using System;
using System.Management;
using System.Text.RegularExpressions;
using System.Collections.Generic;
 
namespace Splash.IO.PORTS
{
     /// <summary>
     /// 即插即用設備信息結構
     /// </summary>
     public  struct PnPEntityInfo
     {
         public  String PNPDeviceID;      // 設備ID
         public  String Name ;             // 設備名稱
         public  String Description;      // 設備描述
         public  String Service;          // 服務
         public  String Status;           // 設備狀態
         public  UInt16 VendorID;         // 供應商標識
         public  UInt16 ProductID;        // 產品編號
         public  Guid ClassGuid;          // 設備安裝類GUID
     }   
 
     /// <summary>
     /// 基於WMI獲取USB設備信息
     /// </summary>
     public  partial  class USB
     {     
         #region UsbDevice
         /// <summary>
         /// 獲取所有的USB設備實體(過濾沒有VID和PID的設備)
         /// </summary>
         public  static  PnPEntityInfo[] AllUsbDevices
         {
             get
             {
                 return  WhoUsbDevice(UInt16.MinValue, UInt16.MinValue, Guid.Empty);
             }
         }
 
         /// <summary>
         /// 查詢USB設備實體(設備要求有VID和PID)
         /// </summary>
         /// <param name = "VendorID" >供應商標識,MinValue忽視</param>
         /// <param name = "ProductID" >產品編號,MinValue忽視</param>
         /// <param name = "ClassGuid" >設備安裝類Guid,Empty忽視</param>
         /// < returns >設備列表</ returns >
         public  static  PnPEntityInfo[] WhoUsbDevice(UInt16 VendorID, UInt16 ProductID, Guid ClassGuid)
         {
             List<PnPEntityInfo> UsbDevices = new List<PnPEntityInfo>();
 
             // 獲取USB控制器及其相關聯的設備實體
             ManagementObjectCollection USBControllerDeviceCollection = new ManagementObjectSearcher( "SELECT * FROM Win32_USBControllerDevice" ).Get();
             if (USBControllerDeviceCollection != null )
             {
                 foreach (ManagementObject USBControllerDevice in  USBControllerDeviceCollection)
                 {   // 獲取設備實體的DeviceID
                     String Dependent = (USBControllerDevice[ "Dependent" ] as  String).Split(new Char [] { '='  })[1];
 
                     // 過濾掉沒有VID和PID的USB設備
                     Match match = Regex.Match(Dependent, "VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}" );
                     if (match.Success)
                     {
                         UInt16 theVendorID = Convert .ToUInt16(match.Value. Substring (4, 4), 16);   // 供應商標識
                         if (VendorID != UInt16.MinValue && VendorID != theVendorID) continue ;
 
                         UInt16 theProductID = Convert .ToUInt16(match.Value. Substring (13, 4), 16); // 產品編號
                         if (ProductID != UInt16.MinValue && ProductID != theProductID) continue ;
 
                         ManagementObjectCollection PnPEntityCollection = new ManagementObjectSearcher( "SELECT * FROM Win32_PnPEntity WHERE DeviceID="  + Dependent).Get();
                         if (PnPEntityCollection != null )
                         {
                             foreach (ManagementObject Entity in  PnPEntityCollection)
                             {
                                 Guid theClassGuid = new Guid(Entity[ "ClassGuid" ] as  String);    // 設備安裝類GUID
                                 if (ClassGuid != Guid.Empty && ClassGuid != theClassGuid) continue ;
 
                                 PnPEntityInfo Element;
                                 Element.PNPDeviceID = Entity[ "PNPDeviceID" ] as  String;  // 設備ID
                                 Element. Name  = Entity[ "Name" ] as  String;                // 設備名稱
                                 Element.Description = Entity[ "Description" ] as  String;  // 設備描述
                                 Element.Service = Entity[ "Service" ] as  String;          // 服務
                                 Element.Status = Entity[ "Status" ] as  String;            // 設備狀態
                                 Element.VendorID = theVendorID;     // 供應商標識
                                 Element.ProductID = theProductID;   // 產品編號
                                 Element.ClassGuid = theClassGuid;   // 設備安裝類GUID
 
                                 UsbDevices. Add (Element);
                             }
                         }
                     }
                 }
             }
 
             if (UsbDevices. Count  == 0) return  null ; else  return  UsbDevices.ToArray();
         }
 
         /// <summary>
         /// 查詢USB設備實體(設備要求有VID和PID)
         /// </summary>
         /// <param name = "VendorID" >供應商標識,MinValue忽視</param>
         /// <param name = "ProductID" >產品編號,MinValue忽視</param>
         /// < returns >設備列表</ returns >
         public  static  PnPEntityInfo[] WhoUsbDevice(UInt16 VendorID, UInt16 ProductID)
         {
             return  WhoUsbDevice(VendorID, ProductID, Guid.Empty);
         }
 
         /// <summary>
         /// 查詢USB設備實體(設備要求有VID和PID)
         /// </summary>
         /// <param name = "ClassGuid" >設備安裝類Guid,Empty忽視</param>
         /// < returns >設備列表</ returns >
         public  static  PnPEntityInfo[] WhoUsbDevice(Guid ClassGuid)
         {
             return  WhoUsbDevice(UInt16.MinValue, UInt16.MinValue, ClassGuid);
         }
 
         /// <summary>
         /// 查詢USB設備實體(設備要求有VID和PID)
         /// </summary>
         /// <param name = "PNPDeviceID" >設備ID,可以是不完整信息</param>
         /// < returns >設備列表</ returns >       
         public  static  PnPEntityInfo[] WhoUsbDevice(String PNPDeviceID)
         {
             List<PnPEntityInfo> UsbDevices = new List<PnPEntityInfo>();
 
             // 獲取USB控制器及其相關聯的設備實體
             ManagementObjectCollection USBControllerDeviceCollection = new ManagementObjectSearcher( "SELECT * FROM Win32_USBControllerDevice" ).Get();
             if (USBControllerDeviceCollection != null )
             {
                 foreach (ManagementObject USBControllerDevice in  USBControllerDeviceCollection)
                 {   // 獲取設備實體的DeviceID
                     String Dependent = (USBControllerDevice[ "Dependent" ] as  String).Split(new Char [] { '='  })[1];
                     if (!String.IsNullOrEmpty(PNPDeviceID))
                     {   // 注意:忽視大小寫
                         if (Dependent.IndexOf(PNPDeviceID, 1, PNPDeviceID.Length - 2, StringComparison.OrdinalIgnoreCase) == -1) continue ;
                     }
 
                     // 過濾掉沒有VID和PID的USB設備
                     Match match = Regex.Match(Dependent, "VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}" );
                     if (match.Success)
                     {
                         ManagementObjectCollection PnPEntityCollection = new ManagementObjectSearcher( "SELECT * FROM Win32_PnPEntity WHERE DeviceID="  + Dependent).Get();
                         if (PnPEntityCollection != null )
                         {                           
                             foreach (ManagementObject Entity in  PnPEntityCollection)
                             {
                                 PnPEntityInfo Element;
                                 Element.PNPDeviceID = Entity[ "PNPDeviceID" ] as  String;  // 設備ID
                                 Element. Name  = Entity[ "Name" ] as  String;                // 設備名稱
                                 Element.Description = Entity[ "Description" ] as  String;  // 設備描述
                                 Element.Service = Entity[ "Service" ] as  String;          // 服務
                                 Element.Status = Entity[ "Status" ] as  String;            // 設備狀態
                                 Element.VendorID = Convert .ToUInt16(match.Value. Substring (4, 4), 16);   // 供應商標識  
                                 Element.ProductID = Convert .ToUInt16(match.Value. Substring (13, 4), 16); // 產品編號                         // 產品編號
                                 Element.ClassGuid = new Guid(Entity[ "ClassGuid" ] as  String);            // 設備安裝類GUID
 
                                 UsbDevices. Add (Element);
                             }
                         }
                     }
                 }
             }
 
             if (UsbDevices. Count  == 0) return  null ; else  return  UsbDevices.ToArray();
         }
 
         /// <summary>
         /// 根據服務定位USB設備
         /// </summary>
         /// <param name = "ServiceCollection" >要查詢的服務集合</param>
         /// < returns >設備列表</ returns >
         public  static  PnPEntityInfo[] WhoUsbDevice(String[] ServiceCollection)
         {
             if (ServiceCollection == null  || ServiceCollection.Length == 0)
                 return  WhoUsbDevice(UInt16.MinValue, UInt16.MinValue, Guid.Empty);
 
             List<PnPEntityInfo> UsbDevices = new List<PnPEntityInfo>();
 
             // 獲取USB控制器及其相關聯的設備實體
             ManagementObjectCollection USBControllerDeviceCollection = new ManagementObjectSearcher( "SELECT * FROM Win32_USBControllerDevice" ).Get();
             if (USBControllerDeviceCollection != null )
             {
                 foreach (ManagementObject USBControllerDevice in  USBControllerDeviceCollection)
                 {   // 獲取設備實體的DeviceID
                     String Dependent = (USBControllerDevice[ "Dependent" ] as  String).Split(new Char [] { '='  })[1];                   
 
                     // 過濾掉沒有VID和PID的USB設備
                     Match match = Regex.Match(Dependent, "VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}" );
                     if (match.Success)
                     {
                         ManagementObjectCollection PnPEntityCollection = new ManagementObjectSearcher( "SELECT * FROM Win32_PnPEntity WHERE DeviceID="  + Dependent).Get();
                         if (PnPEntityCollection != null )
                         {
                             foreach (ManagementObject Entity in  PnPEntityCollection)
                             {
                                 String theService = Entity[ "Service" ] as  String;          // 服務
                                 if (String.IsNullOrEmpty(theService)) continue ;
 
                                 foreach (String Service in  ServiceCollection)
                                 {   // 注意:忽視大小寫
                                     if (String.Compare(theService, Service, true ) != 0) continue ;
 
                                     PnPEntityInfo Element;
                                     Element.PNPDeviceID = Entity[ "PNPDeviceID" ] as  String;  // 設備ID
                                     Element. Name  = Entity[ "Name" ] as  String;                // 設備名稱
                                     Element.Description = Entity[ "Description" ] as  String;  // 設備描述
                                     Element.Service = theService;                           // 服務
                                     Element.Status = Entity[ "Status" ] as  String;            // 設備狀態
                                     Element.VendorID = Convert .ToUInt16(match.Value. Substring (4, 4), 16);   // 供應商標識  
                                     Element.ProductID = Convert .ToUInt16(match.Value. Substring (13, 4), 16); // 產品編號
                                     Element.ClassGuid = new Guid(Entity[ "ClassGuid" ] as  String);            // 設備安裝類GUID
 
                                     UsbDevices. Add (Element);
                                     break;
                                 }
                             }
                         }
                     }
                 }
             }
 
             if (UsbDevices. Count  == 0) return  null ; else  return  UsbDevices.ToArray();
         }
         #endregion
 
         #region PnPEntity
         /// <summary>
         /// 所有即插即用設備實體(過濾沒有VID和PID的設備)
         /// </summary>
         public  static  PnPEntityInfo[] AllPnPEntities
         {
             get
             {
                 return  WhoPnPEntity(UInt16.MinValue, UInt16.MinValue, Guid.Empty);
             }
         }
 
         /// <summary>
         /// 根據VID和PID及設備安裝類GUID定位即插即用設備實體
         /// </summary>
         /// <param name = "VendorID" >供應商標識,MinValue忽視</param>
         /// <param name = "ProductID" >產品編號,MinValue忽視</param>
         /// <param name = "ClassGuid" >設備安裝類Guid,Empty忽視</param>
         /// < returns >設備列表</ returns >
         /// <remarks>
         /// HID:{745a17a0-74d3-11d0-b6fe-00a0c90f57da}
         /// Imaging Device:{6bdd1fc6-810f-11d0-bec7-08002be2092f}
         /// Keyboard:{4d36e96b-e325-11ce-bfc1-08002be10318}
         /// Mouse:{4d36e96f-e325-11ce-bfc1-08002be10318}
         /// Network Adapter:{4d36e972-e325-11ce-bfc1-08002be10318}
         /// USB:{36fc9e60-c465-11cf-8056-444553540000}
         /// </remarks>
         public  static  PnPEntityInfo[] WhoPnPEntity(UInt16 VendorID, UInt16 ProductID, Guid ClassGuid)
         {
             List<PnPEntityInfo> PnPEntities = new List<PnPEntityInfo>();
 
             // 枚舉即插即用設備實體
             String VIDPID;
             if (VendorID == UInt16.MinValue)
             {
                 if (ProductID == UInt16.MinValue)
                     VIDPID = "'%VID[_]____&PID[_]____%'" ;
                 else
                     VIDPID = "'%VID[_]____&PID[_]"  + ProductID.ToString( "X4" ) + "%'" ;      
             }
             else
             {
                 if (ProductID == UInt16.MinValue)
                     VIDPID = "'%VID[_]"  + VendorID.ToString( "X4" ) + "&PID[_]____%'" ;
                 else
                     VIDPID = "'%VID[_]"  + VendorID.ToString( "X4" ) + "&PID[_]"  + ProductID.ToString( "X4" ) + "%'" ;
             }
 
             String QueryString;
             if (ClassGuid == Guid.Empty)
                 QueryString = "SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID LIKE"  + VIDPID;
             else
                 QueryString = "SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID LIKE"  + VIDPID + " AND ClassGuid='"  + ClassGuid.ToString( "B" ) + "'" ;
 
             ManagementObjectCollection PnPEntityCollection = new ManagementObjectSearcher(QueryString).Get();
             if (PnPEntityCollection != null )
             {
                 foreach (ManagementObject Entity in  PnPEntityCollection)
                 {
                     String PNPDeviceID = Entity[ "PNPDeviceID" ] as  String;
                     Match match = Regex.Match(PNPDeviceID, "VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}" );
                     if (match.Success)
                     {
                         PnPEntityInfo Element;
 
                         Element.PNPDeviceID = PNPDeviceID;                      // 設備ID
                         Element. Name  = Entity[ "Name" ] as  String;                // 設備名稱
                         Element.Description = Entity[ "Description" ] as  String;  // 設備描述
                         Element.Service = Entity[ "Service" ] as  String;          // 服務
                         Element.Status = Entity[ "Status" ] as  String;            // 設備狀態
                         Element.VendorID = Convert .ToUInt16(match.Value. Substring (4, 4), 16);   // 供應商標識
                         Element.ProductID = Convert .ToUInt16(match.Value. Substring (13, 4), 16); // 產品編號
                         Element.ClassGuid = new Guid(Entity[ "ClassGuid" ] as  String);            // 設備安裝類GUID
 
                         PnPEntities. Add (Element);
                     }
                 }
             }
 
             if (PnPEntities. Count  == 0) return  null ; else  return  PnPEntities.ToArray();
        
       
         /// <summary>
         /// 根據VID和PID定位即插即用設備實體
         /// </summary>
         /// <param name = "VendorID" >供應商標識,MinValue忽視</param>
         /// <param name = "ProductID" >產品編號,MinValue忽視</param>
         /// < returns >設備列表</ returns >
         public  static  PnPEntityInfo[] WhoPnPEntity(UInt16 VendorID, UInt16 ProductID)
         {
             return  WhoPnPEntity(VendorID, ProductID, Guid.Empty);
         }
 
         /// <summary>
         /// 根據設備安裝類GUID定位即插即用設備實體
         /// </summary>
         /// <param name = "ClassGuid" >設備安裝類Guid,Empty忽視</param>
         /// < returns >設備列表</ returns >
         public  static  PnPEntityInfo[] WhoPnPEntity(Guid ClassGuid)
         {
             return  WhoPnPEntity(UInt16.MinValue, UInt16.MinValue, ClassGuid);
         }
 
         /// <summary>
         /// 根據設備ID定位設備
         /// </summary>
         /// <param name = "PNPDeviceID" >設備ID,可以是不完整信息</param>
         /// < returns >設備列表</ returns >
         /// <remarks>
         /// 注意:對於下划線,需要寫成“[_]”,否則視為任意字符
         /// </remarks>
         public  static  PnPEntityInfo[] WhoPnPEntity(String PNPDeviceID)
         {
             List<PnPEntityInfo> PnPEntities = new List<PnPEntityInfo>();
 
             // 枚舉即插即用設備實體
             String QueryString;
             if (String.IsNullOrEmpty(PNPDeviceID))
             {
                 QueryString = "SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID LIKE '%VID[_]____&PID[_]____%'" ;
             }
             else
             {   // LIKE 子句中有反斜杠字符將會引發WQL查詢異常
                 QueryString = "SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID LIKE '%"  + PNPDeviceID. Replace ('\\ ', ' _ ') + "%' ";
             }
 
             ManagementObjectCollection PnPEntityCollection = new ManagementObjectSearcher(QueryString).Get();
             if (PnPEntityCollection != null )
             {
                 foreach (ManagementObject Entity in  PnPEntityCollection)
                 {
                     String thePNPDeviceID = Entity[ "PNPDeviceID" ] as  String;
                     Match match = Regex.Match(thePNPDeviceID, "VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}" );
                     if (match.Success)
                     {
                         PnPEntityInfo Element;
 
                         Element.PNPDeviceID = thePNPDeviceID;                   // 設備ID
                         Element. Name  = Entity[ "Name" ] as  String;                // 設備名稱
                         Element.Description = Entity[ "Description" ] as  String;  // 設備描述
                         Element.Service = Entity[ "Service" ] as  String;          // 服務
                         Element.Status = Entity[ "Status" ] as  String;            // 設備狀態
                         Element.VendorID = Convert .ToUInt16(match.Value. Substring (4, 4), 16);   // 供應商標識
                         Element.ProductID = Convert .ToUInt16(match.Value. Substring (13, 4), 16); // 產品編號
                         Element.ClassGuid = new Guid(Entity[ "ClassGuid" ] as  String);            // 設備安裝類GUID
 
                         PnPEntities. Add (Element);
                     }
                 }
             }
 
             if (PnPEntities. Count  == 0) return  null ; else  return  PnPEntities.ToArray();
         }
 
         /// <summary>
         /// 根據服務定位設備
         /// </summary>
         /// <param name = "ServiceCollection" >要查詢的服務集合, null 忽視</param>
         /// < returns >設備列表</ returns >
         /// <remarks>
         /// 跟服務相關的類:
         ///     Win32_SystemDriverPNPEntity
         ///     Win32_SystemDriver
         /// </remarks>
         public  static  PnPEntityInfo[] WhoPnPEntity(String[] ServiceCollection)
         {
             if (ServiceCollection == null  || ServiceCollection.Length == 0)
                 return  WhoPnPEntity(UInt16.MinValue, UInt16.MinValue, Guid.Empty);
 
             List<PnPEntityInfo> PnPEntities = new List<PnPEntityInfo>();
 
             // 枚舉即插即用設備實體
             String QueryString = "SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID LIKE '%VID[_]____&PID[_]____%'" ;
             ManagementObjectCollection PnPEntityCollection = new ManagementObjectSearcher(QueryString).Get();
             if (PnPEntityCollection != null )
             {
                 foreach (ManagementObject Entity in  PnPEntityCollection)
                 {
                     String PNPDeviceID = Entity[ "PNPDeviceID" ] as  String;
                     Match match = Regex.Match(PNPDeviceID, "VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}" );
                     if (match.Success)
                     {
                         String theService = Entity[ "Service" ] as  String;            // 服務
                         if (String.IsNullOrEmpty(theService)) continue ;
 
                         foreach (String Service in  ServiceCollection)
                         {   // 注意:忽視大小寫
                             if (String.Compare(theService, Service, true ) != 0) continue ;
 
                             PnPEntityInfo Element;
 
                             Element.PNPDeviceID = PNPDeviceID;                      // 設備ID
                             Element. Name  = Entity[ "Name" ] as  String;                // 設備名稱
                             Element.Description = Entity[ "Description" ] as  String;  // 設備描述
                             Element.Service = theService;                           // 服務
                             Element.Status = Entity[ "Status" ] as  String;            // 設備狀態
                             Element.VendorID = Convert .ToUInt16(match.Value. Substring (4, 4), 16);   // 供應商標識
                             Element.ProductID = Convert .ToUInt16(match.Value. Substring (13, 4), 16); // 產品編號
                             Element.ClassGuid = new Guid(Entity[ "ClassGuid" ] as  String);            // 設備安裝類GUID
 
                             PnPEntities. Add (Element);
                             break;
                         }
                     }
                 }
             }
 
             if (PnPEntities. Count  == 0) return  null ; else  return  PnPEntities.ToArray();
         }
         #endregion       
     }
}

 

通過API的方式詳見

http://www.cnblogs.com/xidongs/archive/2011/11/28/2266100.html

原文鏈接:https://www.cnblogs.com/Kconnie/p/4675156.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM