Почему свойство SerialNumber класса Win32_CDROMDrive возвращает значение null при запросе его отдельно от WMI?

При получении значения свойства SerialNumber из класса WMI Win32_CDROMDrive, как этот SELECT SerialNumber FROM Win32_CDROMDrive, оно проходит через NullReferenceException, если я не изменю запрос на SELECT * FROM Win32_CDROMDrive. Затем выполните цикл вокруг всех свойств, включая SerialNumber, который в этом случае не равен нулю.

И поскольку первый метод быстрее второго (не совсем уверен), я предпочитаю его использовать. Так что же происходит? Я что-то упускаю? Обратите внимание, что он отлично работает с другими свойствами и классами!

Это мой код

string result = "";
var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_CDROMDrive");
ManagementObjectCollection collec = searcher.Get();
foreach (ManagementObject obj in collec)
{
    result = obj["SerialNumber"].ToString();
    break;
}
MessageBox.Show(result);

Это не сработает, если я не перейду на:

var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_CDROMDrive");

Обновить

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

Обновление 2

Похоже, что проблема действительно в SerialNumber, поскольку цикл вокруг всех ненулевых значений свойств Win32_CDROMDrive будет перечислять SerialNumber с реальным значением, как поясняет приведенный ниже код:

listView1.Items.Clear();
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_CDROMDrive");
foreach (ManagementObject mo in searcher.Get())
{
    foreach (PropertyData pd in mo.Properties)
    {
        if (pd.Value != null)
            listView1.Items.Add(pd.Name).SubItems.Add(pd.Value.ToString());
    }
}

Однако, если запрос изменить на конкретный метод желаемого свойства, он выдаст ту же ошибку!

Обновление 3

Мне удалось получить значение этого непослушного свойства без зацикливания всех оставшихся с помощью другого класса Win32_PhysicalMedia, который содержит меньше свойств для всех подключенных дисков (HDD, ODD, Floppy, ...), включая SerialNumber свойство, использующее этот WQL-запрос

SELECT * FROM Win32_PhysicalMedia

Или, если быть точным (к CDROMDrive)

SELECT * FROM Win32_PhysicalMedia WHERE Tag Like '%CD%'

Или, чтобы быть конкретным (к SerialNumber из CDROMDrive

SELECT SerialNumber FROM Win32_PhysicalMedia WHERE Tag Like '%CD%'

var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_PhysicalMedia WHERE TAG LIKE '%CD%'");
ManagementObjectCollection collec = searcher.Get();
foreach (ManagementObject obj in collec)
{
     Console.WriteLine(obj["SerialNumber"].ToString());
}
Console.Read();

Но я не могу считать это ответом, так как мой вопрос: почему WQL не позволяет указывать запись внутри оператора SELECT для (и только) свойства SerialNumber класса CDROMDrive?


person Peter Tovar    schedule 05.07.2018    source источник


Ответы (1)


Я только что протестировал на своем ПК, и в моем случае это похоже на то, что свойство SerialNumber имеет значение null в единственном экземпляре, который у меня есть. Кажется, что WMI не работает должным образом при поиске свойства, которое имеет значение NULL (в моем случае).

В любом случае вы можете использовать ORMi для работы с WMI и выполнять всю работу с помощью Linq.

Пример:

WMIHelper helper = new WMIHelper("root\\CimV2");

var data = helper.Query("SELECT * FROM Win32_CDROMDrive").Where(p => p.SerialNum == "yourSerialNum");
person NicoRiff    schedule 05.07.2018
comment
Попробуйте обновленный код 2, серийник не нулевой! он есть, но может быть извлечен, только если извлекать все значения свойств, а затем зацикливать требуемое - person Peter Tovar; 05.07.2018
comment
Да ... похоже, что есть проблема, когда есть экземпляры с нулевыми значениями, даже если есть ненулевые значения ... странное поведение - person NicoRiff; 05.07.2018
comment
Кроме того, мне больше интересно узнать причину, по которой это происходит, больше, чем то, как это может произойти альтернативно. Поскольку я уже получил серийный номер, кроме (неправильного метода). - person Peter Tovar; 05.07.2018