Seit längerer Zeit mal wieder was zu bloggen, Projektarbeit und Abschlussvorbereitungen nahmen doch einen Großteil meiner Zeit ein. Nebenbei wollten daheim ein paar Zimmer neu eingerichtet werden, so dass Freizeit fast zu einem Luxusgut wurde.
Umso mehr freut es mich, euch heute wieder ein kleines Tool vorstellen zu können: eventcreatef.
Zunächst aber ein bisschen zur Vorgeschichte: Zum Sichern unserer wichtigen Daten auf unseren Maschinen benutzen wir ein eigenes Batchscript, das NTBackup antriggert und uns wöchentlich ein Full- sowie täglich ein Incremental-Backup erstellt. Diese werden xx Tage vorgehalten und danach verworfen.
Im Falle eines Fehlerfalles erfahren wir jedoch darüber nicht viel, dass das Backup nicht durchgelaufen ist, da die Logs etwas versteckt unter “%USERPROFILE%\Lokale Einstellungen\Anwendungsdaten\Microsoft\Windows NT\NTBackup\data” des angemeldeten Benutzers liegen und diese nicht unbedingt nach Erstellungsdatum durchnummeriert angelegt werden. Dies ist jedoch das kleinere Problem, vielmehr machten wir uns Gedanken, wo wir diese Logs einbinden können, damit sie zentral überwacht werden können.
Bei einer Raucherpause meinte Schakko dann, es wäre ganz angenehm, wenn die Logs in der Ereignisanzeige unseres Servers in einem neuen Protokoll angezeigt würden. Da dieser beim täglichen Routinecheck als erstes geprüft wird, werden die Fehler schnell gefunden. Eine kurze Recherche ergab, dass es hierfür von Microsoft ein Tool namens “eventcreate.exe” gibt, das auf nahezu allen Windows-Systemen bereits vorhanden ist. Hier der Link zum TechNet-Artikel zu eventcreate.exe.
Relativ schnell zu einem Ergebnis gekommen, eigene Ereignisse zu loggen, machte ich mich nun daran, den Inhalt von Textfiles als Beschreibung für das Event zu benutzen. Gar nicht so einfach, da eventcreate.exe für den Zeilenumbruch ein einfaches carriage return verlangt, die uns verfügbaren Möglichkeiten jedoch von cmd.exe als normaler String interpretiert werden. Etwas blöde…
Aus diesem Grunde ist dann auch eventcreatef.exe entstanden, da es genau hiermit aufräumt: es nimmt als Parameter alle in eventcreate.exe verfügbaren Parameter entgegen (und reicht diese einfach weiter, daher kommt es bei fehlerhaften Parametern auch zu einer Fehlermeldung von eventcreate.exe selbst), zusätzlich noch den Parameter “-f:” in folgendem Format:
[code language=bash]
eventcreatef.exe -f:c:\log.txt
[/code]
Hiermit wird die Datei “c:\log.txt” geparst, der Inhalt aufbereitet und anschließend als Beschreibung an eventcreate.exe weitergegeben. eventcreatef.exe wurde so entwickelt, dass man den Parameter “-f:” mehrmals angeben kann und die Dateien in der entsprechenden Reihenfolge übergeben werden.
Für die Hilfe von eventcreatef.exe ruft ihr das Programm ohne Parameter auf. Falls ihr die Hilfe zu eventcreate.exe braucht, könnt ihr diese oder alternativ wieder eventcreatef.exe mit dem Parameter “-h” aufrufen.
Ein kleines Beispiel eines Aufrufs, um eine Datei in die Ereignisanzeige eines anderen Rechners (%TARGETPC%) zu loggen (%SOURCE% ist die Quelle, die in der Ereignisanzeige verzeichnet wird):
[code language=bash]
eventcreatef.exe -t information -s %TARGETPC% -id 1000 -so %SOURCE% -f:c:\log.txt
[/code]
Genug geschrieben, hier soll nun die Source von eventcreatef.exe folgen. Es handelt sich dabei um ein kleines AutoIt-Script, das zu einer .exe kompiliert wurde. Wichtig hierbei ist nur, dass es sich um eine Konsolenanwendung handelt und dementsprechend als solche kompiliert werden muss.
[code language=plain]
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.6.0
Author: Florian Weinert
Script Function:
Parsing textfile(s) for eventcreate.exe.
#ce ----------------------------------------------------------------------------
#include
#include
#RequireAdmin
If @Compiled = 0 Then
ConsoleWrite("This script needs to be compiled in order to run...")
Sleep(3000)
EndIf
If $CmdLine[0] = 0 Then
ConsoleWrite(@CRLF & @ScriptName & " Usage:" & @CRLF & @ScriptName & " -f:
ConsoleWrite("Example: " & @ScriptName & " -f:c:\backup.log" & @CRLF & @CRLF & @CRLF)
ConsoleWrite("This is some addition to eventcreate.exe by Microsoft Windows." & @CRLF)
ConsoleWrite("It parses textfile(s) in order to use them as description for an event message." & @CRLF & @CRLF)
ConsoleWrite("(C)opyright by Florian Weinert" & @CRLF)
Sleep(10000)
Exit
EndIf
Local $params = $CmdLineRaw
If StringInStr($params, "-f:") > 0 And StringInStr($params,"-d ") > 0 Then
ConsoleWrite("Please use either filename(s) or description for event message..." )
Sleep(3000)
Exit
EndIf
Local $command = "eventcreate "
Local $content = ""
Local $encapsulate = ""
If StringInStr($params, "-f:") > 0 Then
For $i = 1 to $CmdLine[0] Step 1
$filename = $CmdLine[$i]
If StringInStr($filename, "-f:") > 0 Then
$filename = StringReplace($filename, "-f:", "")
$params = StringReplace($params, "-f:" & $filename, "")
$params = StringReplace($params, "-f:" & Chr(34) & $filename & Chr(34), "")
If Not FileExists($filename) Then
ConsoleWrite($filename & " does not exist...")
Sleep(3000)
Exit
EndIf
$file = FileOpen($filename, 0)
If $file = -1 Then
ConsoleWrite("Unable to open file " & $filename)
Sleep(3000)
Exit
EndIf
While True
$line = FileReadLine($file)
If @error = -1 Then ExitLoop
$line = StringReplace($line, Chr(34), Chr(39))
$content = $content & $line & @CR
WEnd
$content = $content & @CR
FileClose($file)
EndIf
Next
$content = $content & @CR
$params = StringStripWS($params, 7)
$command = $command & $params & " /d "
$encapsulate = Chr(34)
Else
$command = $command & $params
EndIf
Local $process = Run($command & $encapsulate & $content & $encapsulate, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
Local $line
While True
$line = StdoutRead($process)
if @error Then ExitLoop
ConsoleWrite($line)
WEnd
While True
$line = StderrRead($process)
If @error Then ExitLoop
ConsoleWrite($line)
WEnd
[/code]
Hier ein Package mit allen notwendigen Dateien: Die Source eventcreatef.au3, die kompilierte eventcreatef.exe, sowie eventcreatef.cmd, Test1.txt und Test2.txt zum Ausprobieren.
Werde hier demnächst noch ein bisschen erweitern und ein kleines Tool einstellen, womit man eigene Protokolle in der Ereignisanzeige erstellen kann und ein Howto, wie man die entsprechenden Quellen den Protokollen zuweist.
So, ein bisschen Freizeit, daher hier mein Package zur Erstellung eigener Protokolle in der Ereignisanzeige und der Zuweisung der Quellen zu den Protokollen (Source & Binary). Sollte soweit selbsterklärend sein, EventLog entspricht dem späteren Namen des Protokolls in der Ereignisanzeige, EventSource der Quelle. Unter Umständen ist ein Neustart der Maschine notwendig, sollte die Zuweisung der EventSourcen nicht zur Laufzeit von Windows klappen.
Kategorie:
Tags: keine

[...] [...]