Auswertung von Eventlogs mit dem MS-Logparser
Autor: blub, MCSEboard.de
1. Einleitung
Das frei verfügbare Tool
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>\systemTo 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