Как запросить данные журнала событий с заданным идентификатором события?

  • Как узнать, зарегистрировано ли какое-либо конкретное событие (заданный идентификатор события, время и node как входы) или нет? [В этом случае я знаю, что будет зарегистрировано только одно событие]
  • Если событие регистрируется, как мне получить информацию, такую ​​как описание события, имя журнала и т.д.

например, я хочу запросить событие в node Журналах приложений и служб > Microsoft > Windows > groupPolicy > Operational, а идентификатор события - 5315, а время - текущее время.

Ответ 1

Есть несколько новых поворотов, если вы собираетесь запрашивать события из нового стиля Windows EventLogs.

  1. Вам нужно будет использовать классы из System.Diagnostics.Eventing.Reader имен System.Diagnostics.Eventing.Reader для чтения новых событий.
  2. Ваш запрос будет в форме Xpath, так что значение времени сложно, см. Msdn для определения EventLogQuery.
  3. Ваша программа столкнется с проблемами доступа, будьте готовы выдать себя за пользователя, который включен в группу EventReaders AD на компьютере регистрации.

Этот пример показывает некоторые из новых методов доступа, ура.

        string eventID = "5312";
        string LogSource = "Microsoft-Windows-GroupPolicy/Operational";  
        string sQuery = "*[System/EventID=" + eventID + "]";

        var elQuery = new EventLogQuery(LogSource, PathType.LogName, sQuery);
        var elReader = new System.Diagnostics.Eventing.Reader.EventLogReader(elQuery);

        List<EventRecord> eventList = new List<EventRecord>();
        for (EventRecord eventInstance = elReader.ReadEvent();
            null != eventInstance; eventInstance = elReader.ReadEvent())
        {
            //Access event properties here:
            //eventInstance.LogName;
            //eventInstance.ProviderName;
            eventList.Add(eventInstance);
        }

Ответ 2

Вы можете запросить журнал событий:

var sourceName = "MySource";
var el = new EventLog("Application");
var latestEntryTime = (from entry in el.Entries.Cast<EventLogEntry>()
                       where entry.Source == sourceName
                       && // put other where clauses here...
                       orderby entry.TimeWritten descending
                       select entry).First();

Однако следует предупредить, что этот подход медленный, поскольку коллекция Entries имеет тенденцию быть довольно большой.