Исключение в то время как ManagementEventWatcher (WMI) для уведомления о событиях с удаленного компьютера - PullRequest
4 голосов
/ 06 мая 2010

Я пытаюсь получить уведомление от программы просмотра событий удаленного компьютера, используя WMI и C #. Я могу подключиться к системе, а также получить журнал событий, используя ManagementObjectSearcher. Но когда я пытался использовать метод ManagementEventWatcher.Start, я получал исключение:

Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))

Я дал разрешения в WMI Control на root\cimv2, а также предоставил права администратора для учетной записи пользователя в конфигурации DCOM.

У меня нормальное приложение для Windows, поэтому в моем случае я не использую ASP.net (пользователь ASPNET).

Мой код:

ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = @"Domain\UName";//txtUserName.Text;
connectionOptions.Password = "pass";//txtPassword.Text;
connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope managementScope = new ManagementScope(@"\\server\root\cimv2",connectionOptions);
managementScope.Options.EnablePrivileges = true;
managementScope.Connect(); // this line is executing fine.
eventWatcher = new ManagementEventWatcher(managementScope, new EventQuery("Select * From __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent'  and TargetInstance.LogFile = 'Application'"));
eventWatcher.EventArrived += new EventArrivedEventHandler(Arrived);
eventWatcher.Scope.Options.EnablePrivileges = true;
eventWatcher.Start(); // Error occurs here

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

Во-первых, имейте в виду, что Microsoft рекомендует использовать полусинхронные операции (как предложил Брайан):

Если вы можете, мы рекомендуем использовать полу-синхронная операция вместо.Эффект производительности невелик, и полусинхронная операция обеспечивает те же функциональные возможности, но не требует обратного соединения.

См. Также Настройка безопасности для асинхронного вызова в VBScript .

Если вы все еще хотите использовать асинхронные операции, обратитесь к следующим статьям:

YMMV, но для меня (Клиент: Win7 x64 SP1 Server: Windows Server 2008 Enterprise SP2 без брандмауэра) решение для исключения E_ACCESSDENIED было найдено в третьей статье:

  1. Нажмите Пуск, выберите Выполнить, введите DCOMCNFG и нажмите кнопку ОК.
  2. В диалоговом окне Службы компонентов разверните Службы компонентов , разверните Компьютеры , а затем щелкните правой кнопкой мыши Мой компьютер и выберите Свойства .
  3. В МойВ диалоговом окне «Свойства компьютера» откройте вкладку Безопасность COM .
  4. Под Права доступа , нажмите Изменить ограничения .
  5. В диалоговом окне Разрешение на доступ выберите АНОНИМНЫЙ ВХОД имя в Группа или имена пользователей box.В столбце Разрешить в разделе Разрешения для пользователя выберите Удаленный доступ , а затем нажмите ОК .

Обратите внимание, что я сделал выше в клиенте .Хотя это решило проблему с разрешением DCOM, я столкнулся с ошибками доступа к WMI (0x80041003).Оказывается, это произошло из-за ключа реестра, упомянутого во второй статье:

Параметры CIMOM необходимо обновить, если удаленное соединение между компьютерами, не имеющими доверительные отношения;в противном случае асинхронное соединение не будет установлено.Этот параметр не следует изменять для компьютеров в том же домене или в доверенных доменах.

Чтобы разрешить анонимные обратные вызовы, необходимо изменить следующую запись реестра: HKLM \ SOFTWARE \ Microsoft \ WBEM \ CIMOM \ AllowAnonymousCallback

Если ключ AllowAnonymousCallback установлен в 0, служба WMI предотвращает анонимные обратные вызовы для клиента.Если установлено значение 1, служба WMI разрешает клиенту анонимные обратные вызовы.

Обратите внимание, что вам необходимо установить вышеприведенное на сервере .Как только я это сделал, сработали асинхронные обратные вызовы.Другие вещи, которые вы можете попробовать, это запустить ваш клиент в качестве администратора и установить для ConnectionOptions.EnablePrivileges значение true.

Для устранения неисправностей см .:

Наконец, я рекомендую вам воспользоваться тестером Microsoft WMI (%windir%\system32\wbem\wbemtest.exe)

4 голосов
/ 19 ноября 2010

Попробуйте прослушать полусинхронно с WaitForNextEvent ():

    var managementScope = new ManagementScope(@"\\mysever\root\onguard"); 
    managementScope.Connect(); 

    var query = new EventQuery("select * from lnl_AccessEvent");
    var eventWatcher = new ManagementEventWatcher(managementScope, query);
    var wmiEvent = eventWatcher.WaitForNextEvent();
    Console.Out.WriteLine(wmiEvent.GetPropertyValue("Description"));

Мы также нашли wbemtest.exe полезным. Нажмите кнопку Notification Query ..., чтобы прослушать события. Вы можете попробовать различные способы подключения (синхронный, асинхронный или полусинхронный). Все способы подключения работают при подключении к вашей локальной машине, но нам удалось получить только полусинхронную работу для удаленной работы. Асинхронный (который вы используете) более сложный (и менее безопасный), потому что сервер должен установить соединение с клиентом.

Немного полезной информации о настройках безопасности и конфигурации: http://www.packettrap.com/network/Knowledge-Base/PacketTrap-MSP/WMI-Troubleshooting.aspx#_Toc239699682

0 голосов
/ 26 октября 2012

Я часами разбирался в этом. Ничто из вышеперечисленного не помогло мне.

После анализа журналов событий на моем сервере IIS я обнаружил, что получаю следующее событие ошибки в системном журнале каждый раз, когда вызываю метод Start для объекта ManagementEventWatcher:

Настройки разрешений по умолчанию для компьютера не предоставляют локальную активацию разрешение для приложения COM-сервера с CLSID {49BD2028-1523-11D1-AD79-00C04FD8FDFF} и APPID {49BD2028-1523-11D1-AD79-00C04FD8FDFF} пользователю IIS APPPOOL \ DefaultAppPool SID (S-1-5-82-3006700770-424185619-1745488364-794895919-4004696415) из адрес LocalHost (с использованием LRPC). Это разрешение безопасности может быть изменено с помощью инструмента администрирования служб компонентов.

Поиск в реестре показал, что приложение с APPID, указанным в ошибке, было

Необеспеченные апартаменты Microsoft WBEM

Чтобы заставить работать асинхронный обратный вызов, необходимо предоставить полномочия локальной активации для этого COM-объекта пользователю IIS APPPOOL \ DefaultAppPool, что звучит достаточно просто, за исключением того факта, что пользователь не отображается в качестве действительной учетной записи в безопасности база данных. Это связано с тем, что это созданная системой учетная запись пользователя, автоматически создаваемая при создании пула приложений IIS.

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

  1. Запустите mmc, добавьте оснастку «Службы компонентов» в
  2. Открыть Компьютеры-> Мой компьютер-> Конфигурация DCOM
  3. Прокрутите вниз до «Необеспеченный объект квартиры Microsoft WBEM»
  4. Щелкните правой кнопкой мыши и выберите Свойства
  5. Перейдите на вкладку «Безопасность» и в разделе «Разрешения на запуск и активацию» выберите параметр «Настройка» и нажмите «Изменить»
  6. Если ваш IIS-сервер является частью домена, убедитесь, что в поле местоположения указан локальный компьютер, а не домен.
  7. Нажмите кнопку «Добавить», введите «IIS APPPool \ DefaultAppPool» в поле пользователя и нажмите кнопку «Проверить имена». Если вы не используете DefaultAppPool, замените имя используемого пула приложений.
  8. В окне появится действительный пользователь, нажмите OK.
  9. Выберите пользователя в списке и установите флажки Разрешить для локального запуска и локальной активации.
  10. Наслаждайтесь тем, что вы больше не увидите E_ACCESSDENIED в асинхронных обратных вызовах вашего прослушивателя событий WMI.
...