Member 13901685 Ответов: 1

Как выбрать одно поле из класса win32 WMI?


Классы Win32 в ОС Windows существуют группы Оборудование, Программное обеспечение или ОС занятия (наряду с другими), который содержит объекты и атрибуты в зависимости от выбранного класса. Моя проблема заключается в том, что Win32_CDROMDrive это имеет много свойств подключенного нечетного устройства, таких как Caption, Description, Drive, Id, Name, прием.). Проблема (в частности) заключается в собственности SerialNumber который возвращает идентификатор накопителя по изготовлению. Он возвращает значение null в случае и возвращает фактическое значение в другом случае!
Я просто хочу получить SerialNumber исключительно так SELECT SerialNumber FROM Win32_CDROMDrive без извлечения целых значений и выбора между ними.

Что я уже пробовал:

Вот как можно перечислить все свойства Win32_CDROMDrive (SerialNumber существуют с фактическим значением).
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_CDROMDrive");
foreach (ManagementObject mo in searcher.Get())
    foreach (PropertyData pd in mo.Properties)
        Console.WriteLine("{0}:- {1}", pd.Name, pd.Value);
Чтобы получить одно значение свойства (например Name) из того же класса, на который был изменен запрос (и он вернет значение Name).
var searcher = new ManagementObjectSearcher("SELECT Name FROM Win32_CDROMDrive");
Чтобы получить значение SerialNumber свойство, на которое изменяется запрос (и вот в чем проблема, оно вернет null)
var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_CDROMDrive");
Более странное поведение возникает, когда я пытаюсь получить значение свойства с помощью другого случайного свойства, подобного этому (оно возвращает фактические значения)
var searcher = new ManagementObjectSearcher("SELECT SerialNumber, SCSIPort FROM Win32_CDROMDrive");
А если с собственность с различными начальными (он будет возвращать null для SerialNumber и фактическое значение для Name)
var searcher = new ManagementObjectSearcher("SELECT SerialNumber, Name FROM Win32_CDROMDrive");
Опять же может ли SerialNumber быть извлеченным исключительно так SELECT SerialNumber FROM Win32_CDROMDrive без извлечения целых значений и выбора между ними.

1 Ответов

Рейтинг:
2

Dave Kreskowiak

Вы совершаете ошибку, предполагая, что эта информация действительно существует.

Проблема в том, что WMI не предъявляет никаких требований к производителю, чтобы предоставить данные в каждом свойстве в каждом классе WMI.

Если свойство serial number возвращает null, то оно просто не предоставляется производителем устройства в WMI.

Ваш запрос WMI верен. Там просто нет данных для его возвращения.


Member 13901685

Он уже есть, как я упоминал в первом блоке кода, и может быть извлечен с фактическим значением. За исключением того, что я хочу приобрести его отдельно, не получая значений остальных свойств, а затем зацикливаться вокруг каждого из них, чтобы получить то, что я хочу.

Dave Kreskowiak

Ошибка заключается в том, что вы ожидаете, что один объект управления вернется. На самом деле вы получаете их коллекцию в коллекции ManagementObjectCollection:

foreach (ManagementObjectCollection collection in searcher.Get())
{
    foreach (ManagementObject obj in collection)
    {
        foreach (PropertyData pd in mo.Properties)
        {
            Console.WriteLine("{0}:- {1}", pd.Name, pd.Value == null ? "null" : p.Value.ToString());
        }
    }
}

Member 13901685

Вы просто заменили нулевое значение нулевой строкой. Попробуйте свой код с этими двумя запросами
'SELECT * FROM Win32_CDROMDrive' (SerialNumber не равен null)
'Выберите серийный номер от Win32_CDROMDrive' (где имеет значение null)
И коллекция может иметь один единственный объект, если используется query2!