2012-01-31 3 views
1

Я прошел через все соответствующие темы, но ответа не нашел. Я запускаю запрос WMI для получения даты и времени самого старого события в журнале приложений. К сожалению, запрос ниже всегда возвращает 0 значений, но, по-видимому, синтаксис верен, потому что сообщение об ошибке не возвращается. Любая идея, почему это происходит? На самом деле встроенное решение C# загружает весь Eventviewer, и поскольку я подключаюсь к удаленным машинам, выступления ужасны. Поэтому я выбрал запрос WMIЗапрос WMI - найти старое событие регистрации приложения

SelectQuery query = new SelectQuery("select * from Win32_NtLogEvent where Logfile ='" + logFileName + "' and RecordNumber = '1'"); 

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query, opt)) { 
    foreach (ManagementObject mo in searcher.Get()) { 
     DateTime firstEventTime; 
     DateTime.TryParseExact(mo["TimeGenerated"].ToString().Substring(0, 12), "yyyyMMddHHmm", null, DateTimeStyles.None, out firstEventTime); 
     // if the time of the first entry of the application log is older that the dayback to check date 
     // set dayback to check to first app log entry date 
     logbox.writetoLogFile(this.GetType().Name, "First event time is " + firstEventTime, LogLevel.Debug); 
      if (firstEventTime > endDate) { 
       endDate = firstEventTime; 
       logbox.writetoLogTextbox("First eventviewer entry has date " + firstEventTime + ". Check log will stop at this date", Color.Black); 
       logbox.writetoLogFile(this.GetType().Name, "First eventviewer entry has date " + firstEventTime + ". Check log will stop at this date", LogLevel.Info); 
      } 
    } 
} 

К сожалению, я понял это сейчас. Номер записи не сбрасывается, поэтому событие 1 исчезло с возрастов. :(Любая идея, как я мог бы собрать эту информацию?

Спасибо, Marco

ответ

0

RecordNumber является уникальным идентификатором и не обязательно совпадают с LogFile вы используете, это то, как первичный ключ, и вы получите разные номера для каждого компьютера, msdn определение для RecordNumber:

  • Определяет событие внутри файла журнала событий Windows NT Это специфичные для файла журнала и используется вместе с именем файла журнала однозначно иден. tify экземпляр этого класса.

Так что вы должны сделать, это получить все события с конкретной LogFile, сортировать по TimeGenerated и получить старшее событие и сделать еще один поиск числа старшего события: то есть:

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Management; 

namespace WmiEventQuery 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SelectQuery query = new SelectQuery("select * from Win32_NtLogEvent where LogFile = 'Application' "); 
      //execute the query using WMI 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
      //loop through each log found 
      List<EventDateTime> datetimesEvents = new List<EventDateTime>(); 
      foreach (ManagementObject mo in searcher.Get()) 
      { 
       DateTime firstEventTime; 
       DateTime.TryParseExact(mo["TimeGenerated"].ToString().Substring(0, 12), "yyyyMMddHHmm", null, DateTimeStyles.None, out firstEventTime); 

       datetimesEvents.Add(new EventDateTime 
       { 
        RecordNumber = Convert.ToInt32(mo["RecordNumber"]), 
        TimeGenerated = firstEventTime 
       }); 
      } 

      int olderRecordNumber = datetimesEvents.OrderBy(p => p.RecordNumber).FirstOrDefault().RecordNumber; 

      SelectQuery queryUnique = new SelectQuery(
       System.String.Format("select * from Win32_NtLogEvent where RecordNumber = {0}", olderRecordNumber) 
       ); 

      ManagementObjectSearcher searcherUnique = new ManagementObjectSearcher(queryUnique); 

      foreach (ManagementObject mo in searcherUnique.Get()) 
      { 
       //get the older event 
       Console.WriteLine(mo["Message"]); 
       Console.WriteLine(mo["RecordNumber"]); 
      } 

      Console.Read(); 

     } 
    } 

    public class EventDateTime 
    { 
     public DateTime TimeGenerated { get; set; } 
     public int RecordNumber { get; set; } 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^