与WMI分开要求时,“ Win32_CDROMDrive”类的“ SerialNumber”属性如何返回null?

时间:2018-07-05 10:53:43

标签: c# .net vb.net wmi wql

从这样的SerialNumber的WMI类Win32_CDROMDrive获取属性SELECT SerialNumber FROM Win32_CDROMDrive的值时,除非我将查询更改为NullReferenceException,否则它将通过SELECT * FROM Win32_CDROMDrive 。然后循环处理所有属性,包括其中的SerialNumber(在这种情况下不为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");

更新

第一个方法可与相同类的其他属性一起使用,并且可以毫无例外地提取值。看来问题仅在于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,... )(包括使用此WQL查询的SerialNumber属性

SELECT * FROM Win32_PhysicalMedia

或者要具体(针对CDROMDrive)

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

或者要具体(针对SerialNumber的{​​{1}}

CDROMDrive

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

但是我不能认为这是一个答案,因为我的问题是为什么WQL不允许在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(); 语句的内部(仅)SELECT属性中指定记录SerialNumber类?

1 个答案:

答案 0 :(得分:0)

我刚刚在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");