2013-08-13 5 views
3

Я разрабатываю приложение для сбора журналов событий (безопасности) из нескольких систем Windows. У меня есть обработчик EntryWritten. Я могу отобразить большинство полей из средства просмотра событий в запись EntryWrittenEventArgs в .net. Однако я не могу найти сопоставления для полей Level, OpCode и Task Category, которые отображаются в Event Viewer. Любые идеи о том, как я получаю это в vb.net или C#? БлагодаряЖурнал событий Windows

ответ

3

EventLog класса в System.Diagnostics пространства имен не содержит поле для Level, OpCode или Task. Однако существует класс EventRecord в пространстве имен System.Diagnostics.Eventing.Reader, который способен возвращать эти поля. Обратите внимание, что это пространство имен - , в основном используется для извлечения журналов событий с удаленного компьютера. Даже если вы можете использовать его для получения журналов на локальной машине, он открывает локальный канал в системе, что делает его более медленным, чем класс EventLog. Если вам действительно нужно, чтобы получить доступ тех полей, хотя, это, как правило, используется этот класс:

private void LoadEventLogs() 
    { 
     List<EventRecord> eventLogs = new List<EventRecord>(); 

     EventLogSession session = new EventLogSession(); 

     foreach (string logName in session.GetLogNames()) 
     { 
      EventLogQuery query = new EventLogQuery(logName, PathType.LogName); 
      query.TolerateQueryErrors = true; 
      query.Session = session; 

      EventLogWatcher logWatcher = new EventLogWatcher(query); 
      logWatcher.EventRecordWritten += 
        new EventHandler<EventRecordWrittenEventArgs>(LogWatcher_EventRecordWritten); 

      try 
      { 
       logWatcher.Enabled = true; 
      } 
      catch (EventLogException) { } 


      // This is how you'd read the logs 
      //using (EventLogReader reader = new EventLogReader(query)) 
      //{ 
      // for (EventRecord eventInstance = reader.ReadEvent(); eventInstance != null; eventInstance = reader.ReadEvent()) 
      // { 
      //  eventLogs.Add(eventInstance); 
      // } 
      //} 
     } 
    } 

И обработчик LogWatcher_EventRecordWritten события:

Обратите внимание, что я обернул logWatcher.Enabled = true; заявление в try-catch блоке , потому что не все источники позволяют входным письменным слушателям (безопасность должна работать нормально). Заключенный раздел показывает вам пример чтения всех журналов, если вам это нужно.