Почему WMI работает через поиск, а не напрямую? - PullRequest
0 голосов
/ 26 февраля 2019

Первый из этих двух блокирует диск BitLocked.2-й 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 голосов
/ 28 февраля 2019

К сожалению, вы не можете создать экземпляр объекта, используя свойство, которое не является ключевым свойством.Ключевое свойство в WMI - это свойство, которое имеет квалификатор CIM_Key , документация WMI более подробно описывает Key Qualifier .Дополнительную информацию о требованиях WMI к использованию полного пути с ключом для ссылки на объект вы можете прочитать в документации WMI о путях к объектам экземпляра .

В C # для определенного класса, который вы указали (Win32_EncryptableVolume), вы можете выполнить то, что вы пытаетесь сделать, используя ManagementObjectSearcher, как показано в вашем примере.Это потому, что вы пытаетесь получить экземпляр на основе стандартного свойства, а не ключевого свойства.

Отличной утилитой для изучения WMI является WMI Explorer 2.0.Это дает отличное визуальное представление классов WMI.В этой утилите ключевые свойства помечены звездочкой.

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

0 голосов
/ 08 марта 2019

Я просто предположу, что правильный ответ похож на то, что упоминали другие, но не совсем.

На странице класса упоминается, что DeviceID имеет следующее свойство:

Квалификаторы: Ключ

Я предполагаю, что из-за отсутствия актуальной документации поиск чего-либо по их Ключу возвращает саму вещь.При поиске по чему-то еще возвращается список объектов, удовлетворяющих этому условию.Даже если список содержит только 1 запись - это не сам объект, а список.

Но если бы кто-то мог предоставить какую-то документацию, это было бы неплохо.

0 голосов
/ 26 февраля 2019

Кажется, вы не вызываете 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...