Eventlog nach bestimmter Event-ID durchsuchen in ein Log schreiben

  • Hallo zusammen,

    ich habe folgendes vor:
    Ich möchte das Eventlog eines Computers nach bestimmten ID´s durchsuchen und diese Einträge in eine Text-Datei schreiben.
    Im 2. Schritt soll dieses Skript auch andere Rechner von einem Server aus durchsuchen. (Z.B. Start einer CMD oder Batch mit Übergabewert %1 als PC-Name per UNC-Pfad)
    Das Log sollte dann z.B. so aussehen:
    PC-Name EventID Event-Text Erfolgreich/Fehler

    Kann AutoIT sowas?

    Vielen Dank im Voraus!

    Grüße
    Uli

  • ja das geht. es gibt sogar eigene Funktionen dafür.

    Siehe Hilfe. z.B.:
    _EventLog__Read
    _EventLog__Count usw...

    Sollte recht einfach sein.

    lg, Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Mit Count kann ich doch nur zählen und nicht nach bestimmten event-ID´s filtern.
    Mit Read (wie in der Hilfe) bekomme ich es auch nicht hin.

    Wie kann ich filtern ?

    Danke nochmals ?(

  • Hi,

    den Count brauchst du damit Du erstmal weißt, wieviel Einträge in dem eventlog drin sind, damit man die Schleife dementsprechend oft durchlaufen lassen kann. Und innerhalb der Schleife liest Du die Eventzeilen mit Read und stellt Dir damit die einzelnen Zeilen mit den den Treffern zusammen.

    also eine Kombination aus beiden.

    Am einfachsten ist es dann auch mit FileWriteLine direkt Deine Ausgangsdatei zu erzeugen. Am besten auch in der Schleife, dann brauchst Du auch kein Array.

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Wollte mal wissen, ob der Autor da mal nen Lösungvorschlag hat??? Ist zwar schon ein Uralter Beitrag, aber vielleicht gibt es ja noch andere "Hacker" ( :thumbup: ) hier die da nen Lösungvorschlag haben...

    wenn nicht kann mir vielleicht jemand mal kurz erläutern, wie ich dem _eventlog_read mitteile, dass es z.B nur "Fehler" auswertet und alles andere (Informationen) "überspringt"

    EDIT:
    man sollte vielleicht erstmal wach werden^^

    [autoit]


    #include <EventLog.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $iMemo

    [/autoit][autoit][/autoit][autoit]

    _Main()

    [/autoit][autoit][/autoit][autoit]

    Func _Main()
    Local $hEventLog, $hGUI

    [/autoit][autoit][/autoit][autoit]

    $hEventLog = _EventLog__Open ("", "Application")
    $aEvent = _EventLog__Read($hEventLog, True, False)
    If $aEvent[8] = "Fehler" Then
    ConsoleWrite("Da isn Fehler" & " " & @CRLF)
    Else
    ConsoleWrite("Da is kein Fehler zu finden" & " " & @CRLF)
    EndIf
    _EventLog__Close ($hEventLog)

    EndFunc ;==>_Main

    [/autoit]

    jetzt muss ich nur noch irgendwie hinbekommen, dass er solange im Ereignisprotokll sucht, bis er alle Einträge durchgesucht hat, ob wirklich kein Fehler da ist...

    Einmal editiert, zuletzt von Volumeman (9. Juni 2011 um 07:57)

  • Soweit so gut... jetzt habe ich nur das Problem, dass er immer nur den ersten Eintrag wählt, aber halt nicht den zweiten, dritten, vierten etc...

    Jemand ne Idee

    [autoit]


    #include <EventLog.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $hEventLog

    $EventLog = _EventLog__Open ("", "System") ;Systemprotokolle auslesen
    $EventlogCount = _EventLog__Count ($EventLog) ;Zählen wieviele Einträge da sind damit for Schleife laufen kann

    For $i = 1 to $EventlogCount ;for schleife wird auch hochgezählt
    $Eventread = _EventLog__Read($EventLog, True, False) ;Eventlog lesen und ConsoleWrite
    If $Eventread[7] = 1 Then
    ConsoleWrite("Da isn Fehler" & " " & @CRLF)
    Elseif $Eventread[7] = 2 Then
    ConsoleWrite("Da ist ein Warning" & " " & @CRLF)
    Elseif $Eventread[7] = 4 Then
    ConsoleWrite("Da ist eine Information" & " " & @CRLF)

    EndIf
    _EventLog__Close ($EventLog)
    Next

    [/autoit]
  • soweit habe ich das jetzt gebaut ich ich es gerne hätte... nur ein Problem stellt sich mir immer wieder auf... unzwar verschwindet der Text einfach, aus der $aEvent[13]. Wenn man sich das Eventlog so aufmacht, ganz normal steht mehr Text drin als hier?!

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <EventLog.au3>
    #include <Date.au3>
    HotKeySet("{ESC}", "Terminate")
    Dim $hEventLog, $sumEventlog, $aEvent, $j, $aDatum, $datumheute, $datum_neu
    $datumheute = _NowCalcDate()

    [/autoit] [autoit][/autoit] [autoit]

    ;TrayIcon()
    Eventlogopen()
    Eventloggesamtzaehlen()
    Eventlogauslesen()
    Eventlogmustclose()

    [/autoit] [autoit][/autoit] [autoit]

    Func TrayIcon()
    TraySetIcon(@ScriptDir & "\MW.ico")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Eventlogopen()
    $hEventLog = _EventLog__Open("", "system")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Eventloggesamtzaehlen()
    $sumEventlog = _EventLog__Count ($hEventLog)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Eventlogauslesen()
    For $i = 1 to $sumEventlog
    $aEvent = _EventLog__Read($hEventLog, True, True)
    ;~ ConsoleWrite($aEvent[7] & @CR)
    If $aEvent[7] = 1 Then ;Nur Fehler feststellen
    $aDatum = $aEvent[2]
    datumumschreiben()
    If $datum_neu = $datumheute Then
    ConsoleWrite($aEvent[1] & @CR & $aEvent[10] & @CR & $aEvent[13] & @CR)
    $j = $j + 1
    Else
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Else
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Next
    Msgbox(0, "Für heute erkannte Elemente", $j)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Eventlogmustclose()
    _EventLog__Close($hEventLog)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func datumumschreiben()
    $datum = StringSplit($aDatum, '/')
    $datum_neu = ($datum[3] & "/" & $datum[1] & "/" & $datum[2])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Terminate()
    Eventlogmustclose()
    Exit 0
    EndFunc

    [/autoit]