10 Stimmen

Wie kann man die Details eines Ereignisprotokolls mit einer bestimmten Ereignis-ID abfragen?

  1. Wie kann man wissen, ob ein bestimmtes Ereignis (mit Ereignis-ID, Zeit und Knoten als Eingaben) protokolliert wird oder nicht? [In diesem Fall weiß ich, dass nur ein Ereignis protokolliert wird].
  2. Wenn das Ereignis protokolliert wird, wie erhalte ich Details wie Ereignisbeschreibung, Protokollname usw.?

Ich möchte z. B. ein Ereignis unter dem Knoten Applications and Services Logs > Microsoft > Windows > groupPolicy > Operational abfragen, und die Ereignis-ID ist 5315 und die Zeit ist die aktuelle Zeit.

22voto

Tj Kellie Punkte 6158

Bei der Abfrage von Ereignissen aus den neu gestalteten Windows-Ereignisprotokollen gibt es ein paar Neuerungen.

  1. Sie müssen die Klassen aus dem System.Diagnostics.Eventing.Reader Namespace, um die neuen Ereignisse zu lesen.
  2. Ihre Abfrage wird in Xpath-Form sein, so dass der Zeitwert schwierig ist, siehe msdn für die EventLogQuery Definition .
  3. Ihr Programm wird auf Zugriffsprobleme stoßen, seien Sie bereit, sich als ein Benutzer auszugeben, der in der EventReaders AD-Gruppe auf dem protokollierenden Rechner.

Dieses Beispiel zeigt einige der neuen Zugriffsmethoden:

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

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

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

11voto

Mark Seemann Punkte 216836

Sie können das betreffende Ereignisprotokoll abfragen:

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();

Es sei jedoch darauf hingewiesen, dass dieser Ansatz langsam , da die Entries Die Sammlung ist in der Regel recht groß.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X