Как запросить данные журнала событий с заданным идентификатором события? - PullRequest
10 голосов
/ 17 марта 2010
  1. Как узнать, зарегистрировано ли конкретное событие (заданный идентификатор события, время и узел в качестве входных данных) или нет? [В этом случае я знаю, что будет зарегистрировано только одно событие]
  2. Если событие зарегистрировано, как я могу получить подробности, такие как описание события, имя журнала и т. Д.

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

Ответы [ 2 ]

19 голосов
/ 17 марта 2010

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

  1. Вам нужно будет использовать классы из пространства имен 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);
        }
11 голосов
/ 17 марта 2010

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

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 имеет тенденцию быть довольно большой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...