После нескольких часов поиска решения я нашел далеко не идеальное рабочее решение.
Сначала я нашел класс 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();
}