【问题标题】:How come the "SerialNumber" property of the "Win32_CDROMDrive" class returns null when asking for it separately from WMI?“Win32_CDROMDrive”类的“SerialNumber”属性如何在与 WMI 分开请求时返回 null?
【发布时间】: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%'

或者具体来说(到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 属性?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 试试更新的2码,序列号不为空!它在那里,但只有在提取所有属性的值然后循环围绕所需的值时才能提取
    • 是的...似乎存在一个问题,即即使存在非空值,也存在具有空值的实例...奇怪的行为
    • 另外,我更想知道发生这种情况的原因,而不是如何发生这种情况。因为我已经得到了连续剧,除了(不正确的方法)。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2013-05-10
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多