为什么WMI通过搜索而不是直接通过搜索工作?

时间:2019-02-26 19:09:13

标签: c# .net windows wmi

这2个中的第一个锁定BitLocked驱动器。第二个InvokeMethod抛出:'无效的对象路径'。为什么?他们似乎是等效的。

//Using a search:
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2\\Security\\MicrosoftVolumeEncryption", "SELECT * FROM Win32_EncryptableVolume WHERE DriveLetter = 'E:'");
foreach (ManagementObject classInstance1 in searcher.Get())
    classInstance1.InvokeMethod("Lock", new object[] { true }); 

//Direct:
ManagementObject classInstance2 = new ManagementObject("root\\CIMV2\\Security\\MicrosoftVolumeEncryption", "Win32_EncryptableVolume.DriveLetter='E:'", null);
classInstance2.InvokeMethod("Lock", new object[] { 0 });//throws: 'Invalid object path'.

3 个答案:

答案 0 :(得分:0)

似乎您没有调用Get()方法。试试这个:

ManagementObject classInstance2 = new ManagementObject("root\\CIMV2\\Security\\MicrosoftVolumeEncryption", "Win32_EncryptableVolume.DriveLetter='E:'", null);
classInstance2.Get();
classInstance2.InvokeMethod("Lock", new object[] { 0 });

查看此文档:https://docs.microsoft.com/en-us/windows/desktop/wmisdk/retrieving-an-instance

答案 1 :(得分:0)

不幸的是,您不能使用不是键属性的属性实例化对象。 WMI中的关键属性是具有CIM_Key qualifier的属性,WMI文档进一步详细介绍了Key Qualifier。有关WMI使用带有键的完整路径引用对象的WMI要求的更多信息,您可以阅读有关Instance Object Paths的WMI文档。

在C#中,对于您指定的特定类(Win32_EncryptableVolume),您只能通过使用ManagementObjectSearcher来完成您要尝试执行的操作,如示例所示。这是因为您试图获取基于标准属性而不是键属性的实例。

探索WMI的一个很好的实用工具是WMI Explorer 2.0。这给了WMI类一个很好的可视化表示。在此实用程序中,关键属性用星号标识。

https://github.com/vinaypamnani/wmie2/releases

答案 2 :(得分:-1)

我只是假设正确答案与其他人所提到的相似,但不完全相同。

The class's page提到DeviceID具有以下属性:

  

预选赛:键

由于缺乏实际的文档,我认为通过其 Key 搜索某事物本身会返回该事物。在通过其他方式搜索时,将返回满足该条件的对象列表。即使列表仅包含1个条目-它也不是对象本身,而是列表。

但是如果有人可以提供一些文档,那就太好了。