【发布时间】:2018-12-13 19:54:59
【问题描述】:
当像这样SELECT SerialNumber FROM Win32_CDROMDrive 从 WMI 类 Win32_CDROMDrive 获取属性 SerialNumber 的值时,它会通过 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... em>) 包括使用此 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 属性?
【问题讨论】: