На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> WMI: проблема с асинхронным мониторингом событий , ошибка 0x80070005 (E_ACCESSDENIED)
    Проблема следующая: При попытке получать асинхронно события с удаленного компьютера в сети происходит ошибка 0x80070005 (E_ACCESSDENIED), т.е. отказано в доступе.
    Хотя если просто пытаюсь получить единоразово событие, к примеру запуск notepad.exe на удаленном компьютере то все нормально.

    Пример кода получения события запуска процесса:

    ExpandedWrap disabled
      using System;
      using System.Management;
       
      // This example shows synchronous consumption of events.
      // The client is blocked while waiting for events.
       
      public class EventWatcherPolling
      {
          public static int Main(string[] args)
       
          {
              ConnectionOptions options =
                       new ConnectionOptions();
              options.Username = "test";
              options.Password = "test123";
       
              ManagementScope scope =
                  new ManagementScope(
                     "\\\\192.168.0.102\\root\\cimv2", options);
              scope.Connect();
       
              // Create event query to be notified within 1 second of
              // a new process being created
              WqlEventQuery query =
                  new WqlEventQuery("__InstanceCreationEvent",
                  new TimeSpan(0, 0, 1),
                  "TargetInstance isa \"Win32_Process\"");
       
              // Initialize an event watcher and subscribe to events
              // that match this query
              ManagementEventWatcher watcher =
                  new ManagementEventWatcher(scope,query);
              // times out watcher.WaitForNextEvent in 5 seconds
            
              //watcher.Options.Timeout = new TimeSpan(0, 0, 5);
       
              // Block until the next event occurs
              // Note: this can be done in a loop if waiting for
              //        more than one occurrence
              Console.WriteLine(
                "Open an application (notepad.exe) to trigger an event.");
              ManagementBaseObject e = watcher.WaitForNextEvent();
       
              //Display information from the event
              Console.WriteLine(
                  "Process {0} has been created, path is: {1}",
                  ((ManagementBaseObject)e
                      ["TargetInstance"])["Name"],
                  ((ManagementBaseObject)e
                      ["TargetInstance"])["Caption"]);
              Console.ReadLine();
              //Cancel the subscription
              watcher.Stop();
              return 0;
          }
      }

    Тут все нормально, запускаю на компьютере с ip=192.168.0.102 notepad.exe и получаю об этом событии в консоли уведомление.

    А если пытаюсь получать асинхронно:

    ExpandedWrap disabled
      using System;
      using System.Management;
      //using System.Windows.Forms;
       
      namespace WMISample
      {
          public class WMIReceiveEvent
          {
              public WMIReceiveEvent()
              {
                  try
                  {
                      ConnectionOptions options =
                      new ConnectionOptions();
                      options.Username = "test";
                      options.Password = "test123";
       
                      ManagementScope scope =
                          new ManagementScope(
                             "\\\\192.168.0.102\\root\\cimv2", options);
                      scope.Connect();
       
                      // Create event query to be notified within 1 second of
                      // a new process being created
                      WqlEventQuery query =
                             new WqlEventQuery("__InstanceCreationEvent",
                             new TimeSpan(0, 0, 1),
                             "TargetInstance isa \"Win32_Process\"");
       
       
                     // WqlEventQuery query = new WqlEventQuery(
                       //   "SELECT * FROM __InstanceCreationEvent WITHIN 10");
       
                      ManagementEventWatcher watcher = new ManagementEventWatcher(scope,query);
                      Console.WriteLine("Waiting for an event...");
       
                      watcher.EventArrived +=
                          new EventArrivedEventHandler(
                          HandleEvent);
       
                      // Start listening for events
                      watcher.Start();
       
                      // Do something while waiting for events
                      System.Threading.Thread.Sleep(10000);
       
                      // Stop listening for events
                      watcher.Stop();
                      return;
                  }
                  catch (ManagementException err)
                  {
                      Console.Write("An error occurred while trying to receive an event: " + err.Message);
                  }
              }
       
              private void HandleEvent(object sender,
                  EventArrivedEventArgs e)
              {
                  Console.WriteLine("__InstanceCreationEvent event occurred.");
              }
       
              public static void Main()
              {
                  WMIReceiveEvent receiveEvent = new WMIReceiveEvent();
                  return;
              }
       
          }
      }

    то на этапе:
    ExpandedWrap disabled
              watcher.Start();


    Вылетает ошибка:
    ExpandedWrap disabled
      UnauthorizedAccessExeption не обработано.
      Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))


    Непойму почему... может кто-нибудь подсказать?
    Сообщение отредактировано: arsenium -
    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0170 ]   [ 15 queries used ]   [ Generated: 18.05.24, 08:44 GMT ]