. NET WMI - Как определить, разблокировано ли устройство с битлокером - PullRequest
0 голосов
/ 13 марта 2020

У меня есть конкретное c приложение, которое должно реагировать (поиск указанного c файла на устройстве) каждый раз, когда новый том USB подключается или отключается от системы.

Для Обычные незашифрованные устройства. Мне удалось создать наблюдателя для нового USB, используя

  ManagementEventWatcher watcher = new ManagementEventWatcher();
  WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 or EventType = 3");
  watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
  watcher.Query = query;
  watcher.Start();

Моя проблема связана с дисками с битлокерами. Предупреждение срабатывает, но мне нужно подождать, пока пользователь введет правильный пароль. Как бороться с этим ожиданием - моя главная забота.

Может ли кто-нибудь помочь мне точно настроить wql-запрос, чтобы он предупреждал только о незашифрованных томах? Идея состоит в том, что сразу после того, как пользователь вводит пароль битлокера, должен сработать наблюдатель (с точно настроенным запросом). Так что в основном для моей программы битлокер становится прозрачным.

1 Ответ

0 голосов
/ 13 марта 2020

После нескольких часов поиска решения я нашел далеко не идеальное рабочее решение.

Сначала я нашел класс Win32_EncryptableVolume https://docs.microsoft.com/en-us/windows/win32/secprov/win32-encryptablevolume и использовал очень полезный инструмент WMI Code. Создатель для определения свойств и получения рабочего примера C# code https://www.microsoft.com/en-us/download/details.aspx?id=8572

Насколько я знаю, нет класса событий, связанного с этим классом EncryptableVolume. Итак, сначала я получил букву диска из предыдущего Win32_VolumeChangeEvent, а затем запустил второй запрос WMI (используя Win32_EncryptableVolume) и эту букву диска, чтобы проверить значение свойства ProtectionStatus. Из тестов я обнаружил, что до тех пор, пока пользователь не введет действительный пароль, его значение будет равно 2. После разблокировки значение станет равным 1. Поэтому в основном я запустил поток и жду, пока ОС изменит это свойство.

Для ожидающей части, и эта часть мне нравится меньше всего, я поддерживаю поток, работающий в активном l oop, вместо того, чтобы иметь возможность "потреблять" указанное c событие всякий раз, когда оно приходит.

Еще одним побочным эффектом этого решения является то, что для доступа к root \ cimv2 \ Security \ MicrosoftVolumeEncryption необходимы права администратора, поэтому теперь у меня будет разработка Visual Studio, выполняемая с правами администратора (runas). : /

ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("root\\cimv2\\Security\\MicrosoftVolumeEncryption", "SELECT * FROM Win32_EncryptableVolume WHERE driveletter ='" + s_drive_letter + "'");
try
{
   ManagementObjectCollection queryCollection = searcher2.Get();
   ManagementObject mo = queryCollection.OfType<ManagementObject>().FirstOrDefault();

   if (mo["ProtectionStatus"].ToString() == "2")
   {
       new Thread(() =>
       {
           while (mo["ProtectionStatus"].ToString() == "2")
           {
               Thread.Sleep(2000);
               queryCollection = searcher2.Get();
               mo = queryCollection.OfType<ManagementObject>().FirstOrDefault();
               if (mo == null)
                  Thread.CurrentThread.Abort();  
           }
           // Here the code we want to execute once the device gets unlocked.
       }).Start();
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...