Как получить все доступные имена PNPClass из 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 в качестве подпроцесса и не анализируя его вывод.


person AJ Venturella    schedule 28.11.2018    source источник


Ответы (1)


К сожалению, Win32_PNPEntity не соответствует точно данным, которые вы получили бы от devcon. Devcon предоставляет вам все доступные классы в системе, включая System, filter, PNP и т. д. Win32_PNPEntity — это просто устройства plug and play. Данные Win32_PNPEntity также зависят от того, какое оборудование подключено в данный момент.

devcon выводит все данные из подразделов в «HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class», где нет имени/значения с именем NoUseClass=1. Он отображает значения Class и ClassDesc. Значение ClassDesc может быть буквальной строкой, ссылкой на значение в .inf или ссылкой из dll, поэтому вывод этой информации потребует некоторой работы.

Что вы пытаетесь сделать с этими данными? Может быть, есть другой способ получить необходимую информацию? Если вы просто пытаетесь получить информацию о классе для подключенных устройств PNP, тогда ваш существующий код должен получить необходимую информацию.

person Paul G    schedule 29.11.2018
comment
Ах, хорошо, так что это ответ для меня. Мне просто нужно проверить работоспособность подключенного устройства. есть ли он, и если да, то все ли в порядке, и предоставьте браузеру возможность получить DeviceID для проверки. То, что предоставляет Win32_PNPEntity, будет работать. Я просто хотел убедиться, что ничего не упустил. - person AJ Venturella; 29.11.2018