<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=302190&amp;view=findpost&amp;p=2583537</guid>
        <pubDate>Sat, 01 May 2010 14:25:10 +0000</pubDate>
        <title>WMI: проблема с асинхронным мониторингом событий</title>
        <link>https://forum.sources.ru/index.php?showtopic=302190&amp;view=findpost&amp;p=2583537</link>
        <description><![CDATA[arsenium: Проблема следующая: При попытке получать асинхронно события с удаленного компьютера в сети происходит ошибка 0x80070005 (E_ACCESSDENIED), т.е. отказано в доступе.<br>
Хотя если просто пытаюсь получить единоразово событие, к примеру запуск notepad.exe на удаленном компьютере то все нормально.<br>
<br>
Пример кода получения события запуска процесса: <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System;</div><div class="code_line">using System.Management;</div><div class="code_line">&nbsp;</div><div class="code_line">// This example shows synchronous consumption of events. </div><div class="code_line">// The client is blocked while waiting for events. </div><div class="code_line">&nbsp;</div><div class="code_line">public class EventWatcherPolling</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;public static int Main(string[] args)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ConnectionOptions options =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new ConnectionOptions();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;options.Username = &quot;test&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;options.Password = &quot;test123&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ManagementScope scope = </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new ManagementScope(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;\\192.168.0.102\root\cimv2&quot;, options);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;scope.Connect();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Create event query to be notified within 1 second of </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// a new process being created</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WqlEventQuery query =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new WqlEventQuery(&quot;__InstanceCreationEvent&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new TimeSpan(0, 0, 1),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;TargetInstance isa \&quot;Win32_Process\&quot;&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Initialize an event watcher and subscribe to events </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// that match this query</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ManagementEventWatcher watcher =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new ManagementEventWatcher(scope,query);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// times out watcher.WaitForNextEvent in 5 seconds</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//watcher.Options.Timeout = new TimeSpan(0, 0, 5);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Block until the next event occurs </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Note: this can be done in a loop if waiting for </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// &nbsp; &nbsp; &nbsp; &nbsp;more than one occurrence</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Console.WriteLine(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;Open an application (notepad.exe) to trigger an event.&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ManagementBaseObject e = watcher.WaitForNextEvent();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//Display information from the event</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Console.WriteLine(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;Process {0} has been created, path is: {1}&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;((ManagementBaseObject)e </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[&quot;TargetInstance&quot;])[&quot;Name&quot;],</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;((ManagementBaseObject)e</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[&quot;TargetInstance&quot;])[&quot;Caption&quot;]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Console.ReadLine();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//Cancel the subscription</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;watcher.Stop();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Тут все нормально, запускаю на компьютере с ip=192.168.0.102 notepad.exe и получаю об этом событии в консоли уведомление.<br>
<br>
А если пытаюсь получать асинхронно:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System;</div><div class="code_line">using System.Management;</div><div class="code_line">//using System.Windows.Forms;</div><div class="code_line">&nbsp;</div><div class="code_line">namespace WMISample</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;public class WMIReceiveEvent</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public WMIReceiveEvent()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ConnectionOptions options =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new ConnectionOptions();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;options.Username = &quot;test&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;options.Password = &quot;test123&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ManagementScope scope =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new ManagementScope(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;\\192.168.0.102\root\cimv2&quot;, options);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;scope.Connect();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Create event query to be notified within 1 second of </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// a new process being created</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WqlEventQuery query =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new WqlEventQuery(&quot;__InstanceCreationEvent&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new TimeSpan(0, 0, 1),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;TargetInstance isa \&quot;Win32_Process\&quot;&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // WqlEventQuery query = new WqlEventQuery(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp; &quot;SELECT * FROM __InstanceCreationEvent WITHIN 10&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ManagementEventWatcher watcher = new ManagementEventWatcher(scope,query);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.WriteLine(&quot;Waiting for an event...&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;watcher.EventArrived +=</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new EventArrivedEventHandler(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HandleEvent);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Start listening for events</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;watcher.Start();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Do something while waiting for events</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.Threading.Thread.Sleep(10000);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Stop listening for events</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;watcher.Stop();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;catch (ManagementException err)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.Write(&quot;An error occurred while trying to receive an event: &quot; + err.Message);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private void HandleEvent(object sender,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;EventArrivedEventArgs e)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.WriteLine(&quot;__InstanceCreationEvent event occurred.&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public static void Main()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WMIReceiveEvent receiveEvent = new WMIReceiveEvent();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
то на этапе: <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;watcher.Start();</div></ol></div></div></div></div><br>
<br>
Вылетает ошибка: <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">UnauthorizedAccessExeption не обработано.</div><div class="code_line">Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))</div></ol></div></div></div></div><br>
<br>
Непойму почему... может кто-нибудь подсказать?]]></description>
        <author>arsenium</author>
        <category>.NET: Распределенные приложения</category>
      </item>
	
      </channel>
      </rss>
	