如何获得Windows计算机上所有连接的USB设备的列表?
发布于 2018-04-11 15:20:08
为项目添加对System.Management的引用,然后尝试如下所示:
namespace ConsoleApplication1
{
using System;
using System.Collections.Generic;
using System.Management; // need to add System.Management to your project references.
class Program
{
static void Main(string[] args)
{
var usbDevices = GetUSBDevices();
foreach (var usbDevice in usbDevices)
{
Console.WriteLine("Device ID: {0}, PNP Device ID: {1}, Description: {2}",
usbDevice.DeviceID, usbDevice.PnpDeviceID, usbDevice.Description);
}
Console.Read();
}
static List<USBDeviceInfo> GetUSBDevices()
{
List<USBDeviceInfo> devices = new List<USBDeviceInfo>();
ManagementObjectCollection collection;
using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
collection = searcher.Get();
foreach (var device in collection)
{
devices.Add(new USBDeviceInfo(
(string)device.GetPropertyValue("DeviceID"),
(string)device.GetPropertyValue("PNPDeviceID"),
(string)device.GetPropertyValue("Description")
));
}
collection.Dispose();
return devices;
}
}
class USBDeviceInfo
{
public USBDeviceInfo(string deviceID, string pnpDeviceID, string description)
{
this.DeviceID = deviceID;
this.PnpDeviceID = pnpDeviceID;
this.Description = description;
}
public string DeviceID { get; private set; }
public string PnpDeviceID { get; private set; }
public string Description { get; private set; }
}
}
发布于 2018-04-11 16:04:56
我知道我正在回答一个老问题,但我只是经历了这个相同的练习,发现了更多的信息,我认为这将有助于讨论,并帮助其他任何发现这个问题的人,现有答案不足。
该接受的答案是接近的,并且可以使用修正Nedko的评论吧。更详细地了解所涉及的WMI类有助于完成此图。
Win32_USBHub
仅返回USB 集线器。事后看来这似乎很明显,但上面的讨论忽略了它。它不包括所有可能的USB设备,只有那些可以(至少在理论上)充当附加设备集线器的设备。它错过了一些不是集线器的设备(尤其是复合设备的一部分)。
Win32_PnPEntity
包括所有的USB设备和数百个非USB设备。 Russel Gantman建议使用WHERE子句搜索Win32_PnPEntity
以“USB%”开头的DeviceID来过滤列表,这有所帮助,但略有不完整; 它错过了HID兼容的鼠标和键盘。我相信“USB \%”,“USBSTOR \%”,“USBPRINT \%”和“HID \%”将完全列举所有可能性,但由于有更好的选择,所以这可能不需要追求。 Win32_PnPEntity
但是,一旦您拥有其他来源的PNPDeviceID,就可以很好地查找信息。
我发现枚举USB设备的最好方法是查询Win32_USBControllerDevice
。尽管它没有提供设备的详细信息,但它完全枚举了USB设备,并为您提供PNPDeviceID
了每个USB设备(包括集线器,非集线器设备和HID兼容设备)的前导/从属对系统。从查询返回的每个从属将是一个USB设备。Antecedent将作为其分配给的控制器,其中一个USB控制器通过查询返回Win32_USBController
。
作为奖励,看起来在底层,WMI 在回应查询时走过设备树Win32_USBControllerDevice
,因此返回这些结果的顺序可以帮助识别父/子关系。(这是没有记录的,因此只是一个猜测;使用SetupDi API的CM_Get_Parent(或Child + 兄弟)来获得明确的结果。)作为SetupDi API的一个选项,似乎Win32_USBHub
可以查找它们下面列出的所有设备在注册表中(at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID
),并且将有一个参数ParentIdPrefix
,它将成为其子代的PNPDeviceID中最后一个字段的前缀,所以这也可以在通配符匹配中用于过滤Win32_PnPEntity
查询。
在我的应用程序中,我做了以下操作:
Win32_PnPEntity
并将结果存储在键值映射中(以PNPDeviceID作为键)以供稍后检索。如果您想稍后进行个别查询,这是可选的。Win32_USBControllerDevice
USB设备的我的系统上的最终名单(所有的受养人)和提取这些的PNPDeviceIDs。根据设备树的顺序,我进一步深入分配设备到根集线器(返回的第一个设备,而不是控制器),并基于parentIdPrefix构建树。查询返回的顺序(通过SetupDi与设备树枚举相匹配)是每个根集线器(Antecedent为其识别控制器),然后是它下面的设备迭代,例如在我的系统上: Win32_USBController
。这给了我控制器的PNPDeviceIDs的详细信息,这些控制器位于设备树的顶部(这是前一个查询的前辈)。使用前一步导出的树,递归地遍历其子(根集线器)及其子集(其他集线器)及其子集(非集线器设备和复合设备)及其子集等。 Win32_PnPEntity
使用PNPDeviceId单独查询以获取此步骤的信息;可能是CPU与内存的折衷决定哪个顺序更好。)总之,Win32USBControllerDevice
依赖者是系统上USB设备的完整列表(除了控制器本身,它们是同一查询中的前件),并且通过交叉引用这些PNPDeviceId
对以及来自注册表和所提及的其他查询的信息,可以构建详细的图片。
https://stackoverflow.com/questions/-100004390
复制相似问题