Почему свойство "SerialNumber" класса "Win32_CDROMDrive" возвращает ноль при запросе его отдельно от 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 учебный класс?

1 ответ

Я только что проверил на моем компьютере, и в моем случае, кажется, потому что 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");
Другие вопросы по тегам