Почему свойство «SerialNumber» класса «Win32_CDROMDrive» возвращает ноль при запросе его отдельно от WMI? - PullRequest
0 голосов
/ 05 июля 2018

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

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

Это мой код

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

1 Ответ

0 голосов
/ 05 июля 2018

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

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

Пример:

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

var data = helper.Query("SELECT * FROM Win32_CDROMDrive").Where(p => p.SerialNum == "yourSerialNum");
...