为什么“Win32_CDROMDrive”类的“SerialNumber”属性在与WMI分开请求时返回null?

当从这个SELECT SerialNumber FROM Win32_CDROMDrive获取WMI类Win32_CDROMDrive中的属性SerialNumber的值时,它会通过NullReferenceException除非我将查询更改为SELECT * FROM Win32_CDROMDrive 。 然后循环arround所有属性,包括SerialNumber in – 在这种情况下不是null。

由于第一种方法比第二种方法更快(不太确定),我更喜欢使用它。 那么发生了什么? 我错过了什么吗? 请注意,它与其他属性和类完美匹配!

这是我的代码

 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"); 

更新

第一种方法适用于同一个类的其他属性,并且可以无exception地提取值。 似乎问题仅在于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循环所有其余的属性Win32_PhysicalMedia ,其包含所有连接的驱动器( HDD,ODD,软盘,… )的较少属性,包括使用此WQL查询的SerialNumber属性

SELECT * FROM Win32_PhysicalMedia

或者具体到(CDROMDrive)

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

或者具体到( CDROMDriveSerialNumber

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语句中指定CDROMDrive类的(并且只有) SerialNumber属性?

我刚刚在我的PC上进行了测试,在我的情况下,似乎是因为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");