从这样的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
类?
答案 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");