Auswertung von Eventlogs mit dem MS-Logparser

Autor: blub, MCSEboard.de

1. Einleitung

Das frei verfügbare Tool  Logparser in der Version 2.2 ist ein mächtiges Tool, um viele Arten von Logdateien (IIS, Netmon etc., siehe logparser /h unter /i) zu analysieren und Daten herauszufiltern. In diesem Dokument wird beschrieben, wie der Logparser zur Auswertung der Eventlogs von Windows Servern bzw. Domaincontrollern verwendet werden kann.
Damit ist es möglich, Logdateien von mehreren Rechnern in einem Dokument bzw. einer Datenbank zusammenzufassen und an einer zentralen Stelle zu analysieren. Der Einsatz von MS-ACCESS als Ablage erlaubt es, viele Erkenntnisse aus den Logs herauslesen (z.B. wie viele Anmeldungen, Reboots, Fehler-Events etc. sind in einem bestimmten Zeitraum auf mehreren Rechnern aufgetreten).

Tipps zu Beginn:

  • Den Logparser 2.2 gibt es in der englischen und japanischen Version. Mit der englischen Version können auch deutsche Systeme von deutschen Adminservern abgefragt werden, allerdings bleibt die Syntax (s.u.) weiter auf Englisch.
  • Dieses Dokument wurde auf Basis eines Logparser auf einem engl. Windows2003-Servers und eines deutschen WinXP erstellt.
  • Nach der Installation sollte man die Umgebungsvariable „Path“ mit dem Pfad der logparser.exe ergänzen, um so überall den Logparser starten zu können.
  • Grundkenntnisse in MS-Access –hauptsächlich Queries- helfen sehr, mit der Datenflut in grösseren Umgebungen umzugehen und sinnvolle Ergebnisse zu erhalten.

2. Arbeitsweise des Logparsers

Der Aufruf des Logparsers erfolgt über eine Batchdatei (*.cmd bzw. *.bat). In dieser Datei ist eine zweite Definitionsdatei referenziert, in der in SQL-Syntax die eigentlichen Aufgaben und Filter für den Logparser definiert sind.
Die Ergebnisse werden in eine Text-Datei oder über eine ODBC-Verbindung in eine Datenbank wie z.B. MS-Access gesendet.
Im Vergleich zu WMI-Skripten oder WMI-Tools (z.B. evtcomb.exe) liefert der Logparser die Ergebnisse schneller und resourcenschonender als diese zurück und erfordert fast keine Programmierkenntnisse

2.1 Das einfache Beispiel
Aus dem einfachen Beispiel dieses Kapitels als Grundgerüst, können mit den nachfolgenden Syntaxbausteinen umfangreichere Abfragen für den Logparser erstellt werden.

Aufgabe: Alle Events aus dem Systemlog mit der Eventid 5719 (das sind NT40-Trustprobleme) von drei Domaincontrollern sollen mit den Feldern "TimeGenerated, EventID, ComputerName, SID, Message, Data, SourceName, EventTypeName, EventCategory" in ein Textfile exportiert werden. Ausserdem sollen die Events zeitlich absteigend sortiert sein.

Umsetzung: Auf einem AdminPC folgende Zeile in eine cmd-Datei z.B. CallLogPa.cmd setzen

LogParser file:QueryDef.sql -i:EVT -o:TSV -resolveSIDs:ON

In der QueryDef.sql, die im gleichen Verzeichnis wie die CallLP.cmd liegt, diese Zeilen einfügen:

SELECT TimeGenerated, EventID, ComputerName, SID, Message, Data, SourceName,  EventTypeName, EventCategory

From
\\<rechner1>\system,
\\<rechner2>\system,
 \\<rechner3>\system

To output.tsv
where (eventid=5719)
ORDER by TimeGenerated DESC

Ergebnis: In der Output.tsv liegen im tsv-Format (Tabulator Separated) nun die 5719-Events der Systemlogs von den Rechnern <rechner1-3> vor.

2.2 Grundlegende Syntax der cmd-Datei

<LogParser file:QueryDef.sql -i:EVT -o:TSV -resolveSIDs:ON>

File Hier wird die Abfrage genau definiert, siehe auch 2.3
-i (Inputformat) Für Eventlogs (abgespeicherte evt-Dateien, ebenso wie online verwendete Eventlogs) lautet der Parameter „-i:EVT“
-o (Outputformat) Hier können beliebige Textformate wie „-o:tsv“, „-o:csv“,“-o:NAT“ (=Tabellenausgabe), aber auch –o:sql für eine Ausgabe in eine SQL-Datenbank angegeben werden.
–o:sql wird weiter unten ausführlich behandelt
-resolveSIDs:On/Off Wandelt die SIDs innerhalb der Eventeinträge in Usernamen um. Im Normalfall auf On.

Weitere Parameter in der logparser.chm -> Reference -> Input Formats -> EVT -> Parameters

2.3 Syntax der SQL-Datei
Innerhalb der SQL-Datei wird die eigentliche Query definiert.

Select Legt fest, welche Spalten aus dem Eventlog ausgelesen werden.
Beispiel :
select TimeGenerated, EventID, ComputerName, SID, Message, Data, SourceName, EventTypeName, EventCategory

Die vollständige Tabelle siehe 2.3.1
From Legt fest, von welchem Rechner aus welchem EVT-File, bzw, welchem Eventlog die Daten gezogen werden. Zu beachten ist das Kommazeichen.
Beispiel:
From
\\myserver1\system, \\myserver2\system

Die vollständige Tabelle unter 2.3.2
Where Hier können sowohl einfache wie komplexe Abfragen in der SQL-Syntax definiert werden, z.B.
- where (SID='mydomain\Administrator')
- Where (EventID=5719) and (Timegenerated > '2007-05-20 06:00:00' and Timegenerated < '2007-05-21 06:00:00')

Weitere Beispiele in der logparser.chm chm -> Reference -> Query Syntax

2.3.1 Select
EVT Input Format Fields.
The input records generated by the EVT input format contain the following fields:

Name
Typ
Description
EventLog STRING Name of the Event Log or Event Log backup file containing this event
RecordNumber INTEGER Index of this event in the Event Log or Event Log backup file containing this event
TimeGenerated TIMESTAMP The date and time at which the event was generated (local time)
TimeWritten TIMESTAMP The date and time at which the event was logged (local time)
EventID TIMESTAMP The ID of the event
EventType INTEGER The numeric type of the event
EventTypeName INTEGER The descriptive type of the event
EventCategory STRING The numeric category of the event
EventCategoryName INTEGER The descriptive category of the event
SourceName STRING The source that generated the event
Strings STRING The textual data associated with the event
ComputerName STRING The name of the computer on which the event was generated
SID STRING The Security Identifier associated with the event
Message STRING The full event message
Data STRING The binary data associated with the event

2.3.2 From
Die Eventlogs auf einem DC lauten Englisch wie Deutsch:

Name
Aufruf im SQL-File
Application \\myserver1\application
System \\myserver1\system
Security \\myserver1\security
Directory Service \\myserver1\Directory\u0020Service
DNS Server \\myserver1\DNS\u0020Server
File Replication Service \\myserver1\File\u0020Replication\u0020Service

3. Ausgabe in eine SQL-Datenbank

Aus Sicht des Logparsers müssen nur 2 Stellen verändert werden, um den Datenstrom nicht in eine Textdatei, sondern in eine Datenbank zu leiten.

3.1 Cmd-Datei
Die cmd-Datei aus Beispiel 2.1 verändert sich folgendermassen

LogParser file:QueryDef.sql -i:EVT -o:SQL -server:myOfficeserver -dsn:"myDSN" -createTable:ON -cleartable:on -resolveSIDs:ON

Die SQL-Parameter:

o:SQL Ausgabe im SQL-Format
Server: Datenbankserver
Dsn: DSN-Name
createTable:on/off Existiert die Zieltabelle nicht, so wird diese bei “on” erstellt, bei “off” kommt es zu einem Fehler. Normalerweise auf „on“
Cleartable:on/off Eine evtl. vorhandene Zieltabelle wird gelöscht.

Anhang: Einrichten des DSN (engl. Windows Server 2003)
- Aufruf von odbcad32.exe
- Auswahl einer UserDSN oder SystemDSN (User gilt nur für dieses Profil, System für alle)
- den passenden Treiber aus den Sourcen auswählen (z.B. MS Access Database)
- Data Source Name den Namen wählen, den man in der cmd-Datei für den DSN-Parameter verwendet
- Select oder Create, jenachdem ob eine Datenbank bereits existiert
- SystemDatabase: No

3.2 SQL-Datei
Im Vergleich zu der SQL-Datei des Beispiels 2.1 ist nur die Zeile

To output.tsv

durch

Into <Name der Zieltabelle in Access>

zu ersetzen.
<Name der Zieltabelle in Access> kann z.B. „securitylog“ lauten

4. Eine Beispielabfrage in Access2003

In einer Access Tabelle (Tabellenname: securitylog) sind einige 100tausend Securityevents von einem oder mehrerer DCs eingesammelt worden. Nun soll festgestellt werden, wieviele 540-er Events (erfolgreiche Anmeldungen) jeder einzelne gelogged hat
Dazu ist im Entwurfsfenster -> Menü Ansicht -> SQL-Ansicht diese Abfrage hineinzukopieren:

SELECT securitylog.ComputerName, Count(securitylog.ComputerName) AS Anzahl, securitylog.EventID
FROM securitylog
GROUP BY securitylog.ComputerName, securitylog.EventID
HAVING (((securitylog.EventID)=540))
ORDER BY Count(securitylog.ComputerName) DESC;

Dann die Abfrage über das rote Ausrufezeichen starten.

 

© MCSEboard.de, blub