Почему свойство "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");