如何从WMI获取所有可用的PNPClass名称

时间:2018-11-28 20:09:57

标签: c# wmi wmi-query

我可以使用devcon.exe并列出所有可用的类:

C:\devcon classes
Listing 111 setup classes.
XboxComposite       : Xbox Peripherals
RemotePosDevice     : POS Remote Device
DigitalMediaDevices : Digital Media Devices
PrintQueue          : Print queues
…

因此,我可以看到共有111个安装程序类。但是,当我查询Win32_PnPEntity时:

var query = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity");
var results = query.Get();
var set = new HashSet<string>();

foreach(var device in results)
{
    var className = (string)device.GetPropertyValue("PNPClass");
    set.Add(className)
}

var count = set.Count; // 25 <---- not 111

我得到25,而不是111。所以我的查询显然是机器实际可用的子集,这很有意义。从devcon classes输出的类与PNPClass属性值对齐,因此我认为它们是相同的。

因此,必须有一种方法来获取所有可用的PNPClass,除非devcon.exe只是使用devcon classes列出它输出的硬编码

我想以编程方式自己生成此列表,而不是将devcon classes作为子进程调用并解析其输出。

1 个答案:

答案 0 :(得分:0)

不幸的是,Win32_PNPEntity不能完全映射到您将从devcon获得的数据。 Devcon为您提供系统上所有可用的类,包括System,filter,PNP等。Win32_PNPEntity只是即插即用设备。 Win32_PNPEntity数据还取决于当前连接的硬件。

devcon正在从“ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Class”中的子项中输出所有数据,其中没有名称/值称为NoUseClass = 1。它显示Class和ClassDesc值。 ClassDesc值可以是文字字符串,对.inf中值的引用或dll中的引用,因此输出该信息将需要一些工作。

您打算如何处理这些数据?也许还有另一种方式可以获取所需的信息?如果您只是想获取连接的PNP设备的类信息,那么您现有的代码应会获取所需的信息。