C# “怎么会这样?”;序列号“;“的财产”;Win32“CDROM驱动器”;类在与WMI分开请求时返回null?
当像这样从WMI类C# “怎么会这样?”;序列号“;“的财产”;Win32“CDROM驱动器”;类在与WMI分开请求时返回null?,c#,.net,vb.net,wmi,wql,C#,.net,Vb.net,Wmi,Wql,当像这样从WMI类Win32\u CDROMDrive获取属性SerialNumber的值时从Win32\u CDROMDrive中选择SerialNumber它通过NullReferenceException执行,除非我将查询更改为SELECT*from Win32\u CDROMDrive。然后在所有属性周围循环,包括SerialNumber,在这种情况下,该属性不为null 由于第一种方法比第二种(不太确定)快,我更喜欢使用它。那么发生了什么?我错过什么了吗? 请注意,它可以与其他属性和类
Win32\u CDROMDrive
获取属性SerialNumber
的值时从Win32\u CDROMDrive中选择SerialNumber
它通过NullReferenceException
执行,除非我将查询更改为SELECT*from Win32\u 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");
更新
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);
第一个方法处理同一类的其他属性,可以毫无例外地提取值。似乎问题只在于SerialNumber
属性
更新2
问题似乎确实出在SerialNumber
上,因为在Win32\u 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\u PhysicalMedia
获取了这个顽皮属性的值,而没有在所有剩余属性周围循环,该类包含了使用此WQL查询的所有连接驱动器(HDD、奇数、软盘等)的较少属性,包括SerialNumber
属性
从Win32\u PhysicalMedia中选择*
或特定于(CDROM驱动器)
从Win32\u PhysicalMedia中选择*,其中的标记类似于“%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();
或者特定于CDROMDrive
从Win32\u PhysicalMedia中选择SerialNumber,其中标记为“%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不允许在“代码> >选择< /COD>语句中指定一个记录到(并且只有)SerialNumber
属性的CDROMDrive
类?我刚刚在我的电脑和我的案例上进行了测试,这似乎是因为SerialNumber
属性在我拥有的唯一实例上为null。看起来,WMI在查找null属性(在我的案例中)时无法正常工作
无论如何,您可以使用来使用WMI,并使用Linq完成所有工作
例如:
WMIHelper helper = new WMIHelper("root\\CimV2");
var data = helper.Query("SELECT * FROM Win32_CDROMDrive").Where(p => p.SerialNum == "yourSerialNum");
尝试更新的2代码,序列不是空的!它在那里,但只有在提取所有属性的值,然后在所需的值周围循环时才能提取是的…似乎存在一个问题,即即使存在非空值,也有空值的实例…奇怪的行为Plus我更想知道原因这种情况的发生超过了它是如何交替发生的。因为我已经得到了序列号,除了(不正确的方法)。