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

How to get all available PNPClass names from WMI

我可以使用 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 作为子进程调用并解析它的输出。

不幸的是,Win32_PNPEntity 与您从 devcon 获得的数据不完全一致。 Devcon 为您提供系统上所有可用的 classes,包括系统、过滤器、PNP 等。Win32_PNPEntity 只是即插即用设备。 Win32_PNPEntity 数据还取决于当前连接的硬件。

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

你想用这些数据做什么?也许还有另一种方法可以获得您需要的信息?如果您只是想获取已连接 PNP 设备的 class 信息,那么您现有的代码应该会获取您需要的信息。