Как предотвратить зависание приложения во время проверки прав доступа с помощью WMI - PullRequest
3 голосов
/ 21 марта 2011

Я использую WMI, мне нужно получить некоторую информацию, но когда класс недоступен из-за недостаточных разрешений, все зависает на несколько (~ 5) секунд.Даже установка низкого тайм-аута не работает (не говоря уже о том, что это глупое решение).

Проблема не в недостаточных разрешениях, проблема "зависает".

Есть ли способпроверить, есть ли у текущего процесса привилегии на чтение информации из некоторого класса, чтобы предотвратить исключение «зависание» и «отказ в доступе»?

ConnectionOptions co = new ConnectionOptions();
co.Impersonation = ImpersonationLevel.Impersonate;
co.Authentication = AuthenticationLevel.Packet;
co.Timeout = new TimeSpan(0, 0, 1); // 1 second, but still hangs for ~5
co.EnablePrivileges = false; // false or true, doesn't matter
ManagementPath mp = new ManagementPath();
mp.NamespacePath = @"root\CIMV2\Security\MicrosoftTpm";
mp.Server = "";

ManagementScope ms = new ManagementScope(mp, co);
ms.Connect(); // Hangs for ~5 seconds and throws "access denied"

1 Ответ

1 голос
/ 24 марта 2011

Что вам нужно сделать, это запустить операцию в фоновом потоке. Это может все еще занять пять секунд (или больше), но ваше приложение будет реагировать, а не зависать. Попробуйте что-то вроде этого:

  Task.Factory.StartNew(() =>
  {
    // Your permission checking code here.....
  }).ContinueWith((t) =>
  {
    // Inform user of permissions status.
  });

Если вы не используете версию платформы, которая поддерживает «Задачу», попробуйте вместо этого BackgroundWorker. Это распространенные способы предотвращения зависания вашего приложения на долго работающих процессах.

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