Eventlogs 6006,6008 und 6009 auslesen und in Datei schreiben

  • VBScript

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Sachsenbauch.

    Eventlogs 6006,6008 und 6009 auslesen und in Datei schreiben

    Ich betrachte mich als Anfänger in VBS und habe viele Scripte, die ich im WWW fand schon ausprobiert. Durch Kombination zweier Scripte habe ich ein Script erstellt, daß mir die Logs der Ereignisanzeige ("System"), hier besonders 6006, 6008, 6009 - also Systemstart, Shutdown und Absturz in eine Datei schreiben soll. Für jede Event-ID eine.
    Es werden zwar Lösungen mit Echo und MsgBox angeboten, aber da drückt man sich die Finger wund. Mir wäre es lieber, die Meldungen in eine Logdatei zu schreiben. Leider funktioniert das nur mit einem Parameter in der For Each .. Next-Schleife. Wie kann ich alles, was die MSgBox anzeigt, auch in eine Logdatei bekommen ?

    Quellcode

    1. strComputer = "." ' Dieser Computer
    2. ' Retrieving Specific Events from an Event Log
    3. textFilePath = "6008.txt"
    4. set objFSO = createobject("Scripting.FileSystemObject")
    5. set objTextFile = objFSO.CreateTextFile(textFilePath)
    6. Set objWMIService = GetObject("winmgmts:" _
    7. & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    8. Set colLoggedEvents = objWMIService.ExecQuery ("Select * from Win32_NTLogEvent Where Logfile = 'System' and " & "EventCode = '6008'")
    9. txt=""
    10. For Each objEvent in colLoggedEvents
    11. MsgBox "Ereignisdatum: " & objEvent.TimeGenerated & vbCrLf & "Beschreibung: " & objEvent.Message ' <--- DAS FUNKTIONIERT
    12. objTextFile.WriteLine "Ereignisdatum: " & objEvent.TimeGenerated & vbCrLf & "Beschreibung: " & objEvent.Message ' <-- DAS NICHT !!
    13. ' txt=txt & " Beschreibung: " & objEvent.Message & vbcrlf ' .Message funktioniert NICHT
    14. txt=txt & "Ereignisdatum: " & objEvent.TimeGenerated & vbcrlf ' .TimeGenerated funktioniert
    15. Next
    16. objTextFile.WriteLine(txt)
    17. Wscript.Echo "Unerwartete Shutdowns: " & colLoggedEvents.Count
    18. objTextFile.Close


    Es wäre schön, wenn mir da jemand helfen könnte...
    Beste Grüße

    Micha

    Eventlog 6008

    Hallo und danke erst einmal,
    Was immer ich auch tue - es kommt immer der Fehler 005 "Ungültiger Prozeduraufruf oder ungültiges Argument"

    Wird Zeile 18 aktiviert - Fehler bei Zeile 18, Zeichen 3 (...writeLine)
    wird Zeile 20 aktiviert - Fehler bei Zeile 25, Zeichen 1 (..writeLine)

    es funktioniert nur wenn Zeilen 18 und 20 deaktiviert (ge-remarkt) sind, d.h. auch wenn Zeilen 20 und 21 aktiv sind, kommt der Fehler.
    Mit der Dateiangabe hat das nichts zu tun, denn das Ereignisdatum (bei mir 3 Ereignisse) wird ja zeilenweise in die erstellte Datei eingetragen.
    Auch write statt writeLine (Zeile 25) bringt nix.
    Gibt es keine Möglichkeit die Ausgabe von der Msgbox in eine Datei zu redirecten !?

    Grüße

    Lösung gefunden ??

    Auf dieser Seite habe ich eine ertragbare Lösung gefunden. Und zwar wird
    • in Zeile 17 das Msgbox "... ersetzt durch Wscript.echo "...
    • die Zeilen 18 bis 20 werden deaktiviert.
    In der Eingabeaufforderung (Konsole) gebe ich diesen Redirect-Befehl ein CSCRIPT "6008.vbs" > 6008.log und erhalte das Gewünschte.
    Allerdings muss ich im Script noch das Datum/Zeitformat ändern und suche nach einer Möglichkeit das ganze als Batchdatei auszuführen.
    Hier ist nun mein vorläufiges Script, es ist noch eine "kleine Änderung" notwendig, die ich aber nicht allein bewerkstelligen kann und um die Hilfe erfahrener "VBler" bitte.

    Visual Basic-Quellcode

    1. strComputer = "." ' Dieser Computer
    2. ' Retrieving Specific Events from an Event Log
    3. Set objWMIService = GetObject("winmgmts:" _
    4. & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    5. Set colLoggedEvents = objWMIService.ExecQuery ("Select * from Win32_NTLogEvent Where Logfile = 'System' and " & "EventCode = '6005' or EventCode = '6006'")
    6. For Each objEvent in colLoggedEvents
    7. objEvent.Message=strReplace(objEvent.Message,"?", "", True) & vbCrlf ' Funktion zum Ersetzen der Fragezeichen funktioniert nur bei Strings
    8. Wscript.echo "Ereignisdatum: " & WMIDateToString(objEvent.TimeGenerated, True) & vbCrLf & "Beschreibung: " & objEvent.Message
    9. Next
    10. Wscript.Echo "Unerwartete Shutdowns: " & colLoggedEvents.Count
    11. ' *************** Hilfsfunktionen ****************
    12. Function WMIDateToString(ByVal dtmDate, ByVal blnLocal) ' Schreibt WMIDatum in einen "ordentlichen Datumstring"
    13. Dim objSWbemDateTime
    14. If IsNull(dtmDate) or IsEmpty(dtmDate) or dtmDate="" Then
    15. WMIDateToString = Empty
    16. Else
    17. On Error Resume Next
    18. Set objSWbemDateTime = CreateObject("WbemScripting.SWbemDateTime")
    19. If Err.Number <> 0 Then
    20. On Error GoTo 0
    21. 'Use the older text manipulation method, with no local time zone adjustment.
    22. WMIDateToString = CDate(Mid(dtmDate, 5, 2) & "/" & _
    23. Mid(dtmDate, 7, 2) & "/" & _
    24. Left(dtmDate, 4) & " " & _
    25. Mid(dtmDate, 9, 2) & ":" & _
    26. Mid(dtmDate, 11, 2) & ":" & _
    27. Mid(dtmDate, 13, 2))
    28. Else
    29. On Error GoTo 0
    30. objSWbemDateTime.Value = dtmDate
    31. WMIDateToString = objSWbemDateTime.GetVarDate(blnLocal)
    32. Set objSWbemDateTime = Nothing
    33. End If 'Err.Number <> 0
    34. End If 'Not IsNull(dtmDate)
    35. End Function 'WMIDateToString
    36. Function strReplace(ByVal strSearch, ByVal strMatch, ByVal strSub, ByVal blnCase)
    37. ' Dim intSearch
    38. ' intSearch = ReturnCaseComparisonValue(blnCase) ' Fehler: Typen unverträglich
    39. If IsNull(strSearch) Then
    40. 'Null causes error with the Replace function, just return Null
    41. strReplace = Null
    42. Else
    43. strReplace = Replace(strSearch, strMatch, strSub, 1, -1, intSearch)
    44. End If 'IsNull(strSearch)
    45. End Function 'strReplace


    In diesem Script wird also das Starten (6005) und das Beenden (6006) des Ereignisprotokolldienstes protokolliert, was um Millisekunden identisch sein dürfte mit dem Einschalten und Herunterfahren des PC
    Zeile 8: Beim Eventlog 6008 (unerwartete Abstürze) wird das Ergebnisdatum mit drei Fragezeichen geschrieben, was komischerweise in der Messagbox nicht erscheint. Die implementierte Function strReplace bringt es auch nicht weg, wer kann helfen ?

    Quellcode

    1. Ereignisdatum: 21.03.2012 13:08:08
    2. Beschreibung: Das System wurde zuvor am ?21.?03.?2012 um 09:07:28 unerwartet heruntergefahren.
    3. Ereignisdatum: 11.02.2012 19:26:03
    4. Beschreibung: Das System wurde zuvor am ?11.?02.?2012 um 19:24:28 unerwartet heruntergefahren.
    5. Ereignisdatum: 05.02.2012 16:44:03
    6. Beschreibung: Das System wurde zuvor am ?05.?02.?2012 um 16:42:46 unerwartet heruntergefahren.
    7. Unerwartete Shutdowns: 3


    Über Hilfe wäre ich sehr dankbar. :S

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sachsenbauch“ ()