为什么“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%'
或者具体到( CDROMDrive
的SerialNumber
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完成所有工作。
例:
上述就是C#学习教程:为什么“Win32_CDROMDrive”类的“SerialNumber”属性在与WMI分开请求时返回null?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
WMIHelper helper = new WMIHelper("root\CimV2"); var data = helper.Query("SELECT * FROM Win32_CDROMDrive").Where(p => p.SerialNum == "yourSerialNum");
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/943236.html