В .net в чем разница между Eventlog и ManagementObject для получения журналов с удаленного сервера?

Я обнаружил два способа получения записей журнала событий приложений с удаленного сервера.

<сильный>1. Использование объекта EventLog

 string logType = "Application";
 EventLog ev = new EventLog(logType,"rspl200");

 EventLogEntryCollection evColl =  ev.Entries

<сильный>2. Использование объекта ManagementObjectSearcher

ConnectionOptions co = new ConnectionOptions(); co.Username = "testA"; co.Password = "testA"; Область ManagementScope = new ManagementScope(@"\" + "machineName"+ @"\root\cimv2", co); область.Соединить();

Запрос SelectQuery = new SelectQuery(@"select * from Win32_NtLogEvent"); Параметры перечисления opt = новые Параметры перечисления(); опт.РазмерБлока = 1000;

using (ManagementObjectSearcher searcher = new  ManagementObjectSearcher(scope, query,opt))
   {

     foreach (ManagementObject mo in searcher.Get())
                {

                       // write down log entries
                       Console.Writeline(mo["EventCode"]);

                }

   }

Я могу легко получить удаленный журнал событий, используя метод № 1 (используя объект EventLog) без каких-либо исключений, связанных с безопасностью. Но, используя метод № 2 (с использованием объекта ManagementObjectSearcher), я получаю исключение с отказом в доступе.

На самом деле я хочу, чтобы журнал удаленных событий (только приложение, а также последний журнал, а не все журналы приложений) отображался в виде дерева, как показано ниже.

 -  ServerName
   - Logs
     + Error
     + Information
     + Warning

Может ли кто-нибудь помочь мне в этом, чтобы узнать лучший способ от этого или любого другого?

Also the main thing is that user who reads remote logs may be in different domain than server.

Спасибо, Митеш Патель.


person Mitesh Patel    schedule 19.04.2010    source источник


Ответы (1)


Я вижу, это старый пост...

Я думаю, что ваша единственная проблема с № 2 заключается в том, что ваша область должна быть:

ManagementScope scope = new ManagementScope(@"\\" + "machineName"+ @"\root\cimv2", co);

Вам не хватает двойной обратной косой черты в вашем.

Одна вещь, о которой следует помнить при использовании метода № 2, заключается в том, что он выполняет запросы wmi, поэтому хост-процесс wmi на удаленной машине будет забит. Из того, что я видел, он работает с загрузкой ЦП на 45% до завершения запроса wmi.

Я не знаю, как реализуется метод № 1, поэтому не могу точно сказать об этом.

Если вы беспокоитесь о производительности, я бы держался подальше от API журнала событий .Net и использовал API-интерфейсы win32:

pre-vista/2008: http://msdn.microsoft.com/en-us/library/aa363657(v=VS.85).aspx

post-vista/2008: http://msdn.microsoft.com/en-us/library/aa385785(v=VS.85).aspx

person Mitch    schedule 10.06.2010