Eventlog aktuellsten Event auslesen
Ich möchte per VBS aus dem Eventlog den aktuellsten Wert angezeigt bekommen.
leider funktioniert jedoch mein Skript nicht wie ich möchte.
Speziell gehts mir darum, das ganze nach Datum (TimeWritten) aktuellste-älteste anzeigen zu lassen und das ganze auf 1 Datensatz zu begrenzen (LIMIT)
Vielleicht kann mir jemand auf die Sprünge helfen.
Danke & GRuss
leider funktioniert jedoch mein Skript nicht wie ich möchte.
Speziell gehts mir darum, das ganze nach Datum (TimeWritten) aktuellste-älteste anzeigen zu lassen und das ganze auf 1 Datensatz zu begrenzen (LIMIT)
Vielleicht kann mir jemand auf die Sprünge helfen.
Set objWMIService = GetObject("winmgmts:" & "\\" & "localhost" & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent Where ( EventType='1' OR EventType='2' OR EventType='3' OR EventType='4' ) and SourceName='WMI' ORDER BY TimeWritten DESC LIMIT 1")
For Each objEvent In colLoggedEvents
last_Message = objEvent.Message
wscript.echo last_Message
Next
Danke & GRuss
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 144060
Url: https://administrator.de/forum/eventlog-aktuellsten-event-auslesen-144060.html
Ausgedruckt am: 23.02.2025 um 15:02 Uhr
12 Kommentare
Neuester Kommentar
Hallo!
Nachdem Dir innerhalb der letzten Stunde niemand geantwortet hat, versuch ichs mal...
(Könnte natürlich auch an der fehlenden Begrüßung Deinerseits liegen, aber lassen wir das mal beiseite)
Von Eleganz ist diese Lösung zwar weit entfern, sie dürfte aber dennoch funktionieren.
IMHO wird die Event-Liste ohne unser Zutun richtig geordnet (letztes also zuerst...)
hm...
Nachdem Dir innerhalb der letzten Stunde niemand geantwortet hat, versuch ichs mal...
(Könnte natürlich auch an der fehlenden Begrüßung Deinerseits liegen, aber lassen wir das mal beiseite)
Set objWMIService = GetObject("winmgmts:" & "\\" & "localhost" & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent")
For Each objEvent In colLoggedEvents
last_Message = objEvent.Message & "von: " & objEvent.TimeWritten
if last = 0 then
wscript.echo last_Message
last = last+1
end if
Next
Von Eleganz ist diese Lösung zwar weit entfern, sie dürfte aber dennoch funktionieren.
IMHO wird die Event-Liste ohne unser Zutun richtig geordnet (letztes also zuerst...)
hm...
So, achtung Bastla, DAS wird jetzt schmutzig... 
Set objWMIService = GetObject("winmgmts:" & "\\" & "localhost" & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent")
anzahl = colLoggedEvents.Count
For Each objEvent In colLoggedEvents
last_Message = objEvent.Message & "von: " & objEvent.TimeWritten
if last = anzahl-1 then
wscript.echo last_Message
end if
last = last+1
Next
Hallo Edi!
Etwas sauberer
:
Grüße
bastla
Etwas sauberer
Set objWMIService = GetObject("winmgmts:" & "\\" & "localhost" & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent")
For Each objEvent In colLoggedEvents
last_Message = objEvent.Message & "von: " & objEvent.TimeWritten
Next
wscript.echo last_Message
bastla
Hallo Edi!

Die "Scripting Guys" haben übrigens einen von der Grundidee her gar nicht unähnlichen Ansatz zu bieten ...
Grüße
bastla
selten so über mich selbst gelacht
Danke dafür!!!
War zwar nicht die Zielsetzung, aber: gerne ... Danke dafür!!!
Die "Scripting Guys" haben übrigens einen von der Grundidee her gar nicht unähnlichen Ansatz zu bieten ...
Grüße
bastla
Ja nee,
das möchte ich nicht so stehen lassen.
Hier wird halbgarer Code zitiert... auch wenn ich viel von den Redmonder "Scripting Guys" und noch mehr von den hier zu lesenden "Schroting guys" halte...
Also... in diesem Fall vergleichen diese begnadeten PraktikantInnen aus R. Äpfel mit Birnen bzw. apples with burns... oops... oranges.
In dem ziterten M$-Schnipsel, der in Ansätzen auch mir als Basis dient, wird ermittelt
a) Wie viele Sätze stehen im Log namens "Application"? [ aus objLogFile.NumberOfRecords --> ergibt eine Anzahl ]
b) in der zweiten Abfrage wird der "neueste" Satz ermittelt als "der mit der RecordNumber == Anzahl Sätze gesamt".
is' sich Quark. Jeder von uns hat schon Sätze aus den Logs archiviert und oder selektiv gelöscht.
Also kann es sein, dass in einem ordentlich aufgeräumten Security-Log z.B. gerade mal 20 Sätze stehen. Allerdings mit RecordNumber 555001 bis 555020.
Beispiel aus dem Leben... aus meinem realen ApplLog (ungetürkt)
Ausgabe dieses Machwerks ist
Anmerkungen (zusätzlich zu dem im Source stehenden)
a) bitte beachten in der Ausgabe die LastModified-Angabe des Logs und die Date-Werte darunter (TimeWritten) !
b) Schnipsel ist auch schnell runtergepfuscht... insbesondere die von Hand mit Leerzeichen ausgerichtete "Spalten untereinander"-Ausgabe.
Sollte natürlich für allgemeine Verwendung auf jeweils gleiche "Spalten"-Länge formatiert werden. War mir für die Demo nicht wichtig.
c) Überprüft ist es: der lt. Ausgabe älteste Satz ist auch der älteste, der neueste ist auch der neueste.
d) ABER: natürlich ist es bei mir insofern geschwindelt mit der Ermittlung der "ältesten" Satzes, dass unterstellt wird (von mir),
es sind vielleicht mal "alle Sätze älter als 2 Jahre" bzw. "älter als 2. Februar 2010" gelöscht worden.
Also eine ununterbrochene RecordNumber-Folge von Satz 1 bis Satz 11574 inclusive.
--> Achtung: Wenn jemand SELEKTIV einzelne Sätze mittendrin löscht, passt diese Milchmädchen-FDP-Rechnung natürlich nicht
e) bei diesem ganzen objWMI-Service-Gelumpe gilt:
Kein Satz muss zugesicherterweise ALLE denkbaren Attribute haben.
Ich habe genauso beim Testen auf die Schnauze bekommen wie Kollege djbazo in seinem letzten Post.
Es gibt Events ohne evtLog.Sourcename, ohne evtlog.messagetext, ohne....usw. ---> "On Error Resume Next".
f) für den jüngsten Satz braucht man/frau nichts davon...das ist einfach immer der erste.
Der Code basiert - wie geschrieben- auf den Hey Scripting-Guy-Skizzen
Grüße
Biber,
der sich jetzt auch wieder zu seinen unkomplizierteren Onelinern zurückzieht.
das möchte ich nicht so stehen lassen.
Hier wird halbgarer Code zitiert... auch wenn ich viel von den Redmonder "Scripting Guys" und noch mehr von den hier zu lesenden "Schroting guys" halte...
Also... in diesem Fall vergleichen diese begnadeten PraktikantInnen aus R. Äpfel mit Birnen bzw. apples with burns... oops... oranges.
In dem ziterten M$-Schnipsel, der in Ansätzen auch mir als Basis dient, wird ermittelt
a) Wie viele Sätze stehen im Log namens "Application"? [ aus objLogFile.NumberOfRecords --> ergibt eine Anzahl ]
b) in der zweiten Abfrage wird der "neueste" Satz ermittelt als "der mit der RecordNumber == Anzahl Sätze gesamt".
is' sich Quark. Jeder von uns hat schon Sätze aus den Logs archiviert und oder selektiv gelöscht.
Also kann es sein, dass in einem ordentlich aufgeräumten Security-Log z.B. gerade mal 20 Sätze stehen. Allerdings mit RecordNumber 555001 bis 555020.
Beispiel aus dem Leben... aus meinem realen ApplLog (ungetürkt)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objInstalledLogFiles = objWMIService.ExecQuery _
("Select * from Win32_NTEventLogFile Where LogFileName = 'Application'")
' als erstes mal schauen wieviel Sätze da dümpeln im ApplLog...
' Hier sollte e i g e n t l i c h immer EIN 'Application'-Logfile herauskommen... *g
For Each objLogfile in objInstalledLogFiles
' für das eine von einem Application-Logfile tue...
intApplLogRecords = objLogFile.NumberOfRecords
wscript.echo "Logfile " & chr(34) & objLogFile.LogFilename & chr(34) & _
" # " & objLogFile.NumberOfRecords & _
" Zuletzt geändert: " & objLogFile.LastModified
' Achtung: lastModified wird NICHT gesetzt, sobald neue Events da sind.
' Sondern wenn die Datei "zur Ruhe kommt" ... beim Runterfahren!!!
' wer seinen Rechner Tag & Nacht anhat, der kann NICHT gegen dieses Datum prüfen
' sprich: Abfragen "Hole mir den Eintrag mit dem Lastmodified-Timestamp"
' In den einzelnen Events -siehe unten- ist auch jeweils ein "TimeWritten-Datum" .
' Aber das des neuesten Events ist NICHT unbedingt gleich diesem Modified-Datum
' [anmerk] Halt Shice programmiert. [/anmerk]
Next
' jetzt mal schauen, wie im ApplLog die einzelnen Events aussehen
' Strategie: ALLE Sätze holen... nur den ersten lesen
' Zeitlich-chronologische Reihenfolge ist (garantiert?) "Neueste zuerst"
' jedenfalls auf allen Rechnern, mit denen ich getestet habe
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent Where Logfile = 'Application'" )
' hole alle Einträge des EventLogs "Application" (optimistisch: eines)
For Each objEvent In colLoggedEvents
Wscript.echo "Neuester ApplLog-Record: "& objEvent.RecordNumber & _
" Time Written : " & objEvent.TimeWritten & _
" EventCode: " & objEvent.EventCode & _
" Source: " & objEvent.SourceName
' wenn der erste Record auch der neueste ist, dann steht der älteste am Ende
' und dann kann ich den berechnen... aktuelle Satznr abzgl. AnzahlAlle plus 1
oldestApplRec = objEvent.RecordNumber - intApplLogRecords + 1
' De-Comment bei Bedarf & Langeweile WScript.Echo objEvent.getObjectText_
Exit for
Next
' Und eine gezielte Abfrage hinterher...nur den ältesten
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent " & _
"Where Logfile = 'Application' and RecordNumber = " & oldestApplRec )
For Each objEvent in colLoggedEvents
' für jeden einen Satz von einem einzigen Satz tue...*gg
Wscript.echo "Ältester ApplLog-Record: "& objEvent.RecordNumber & _
" Time Written : " & objEvent.TimeWritten & _
" EventCode: " & objEvent.EventCode & _
" Source: " & objEvent.SourceName
' Bei Bedarf & Langeweile: WScript.Echo objEvent.getObjectText_
Next
Wscript.quit ' so genannte Reissleinenprogrammierung
'-------------------------------hier is' sich Ende ---
' bei Bedarf auch die gewünschten Details formatiert anzeigen.
' dann bitte bedienen aus der momentan unerreichbaren FOR-Next-Konstruktion unten
For Each objEvent in colLoggedEvents
Wscript.Echo "Category: " & objEvent.Category
Wscript.Echo "Computer Name: " & objEvent.ComputerName
Wscript.Echo "Event Code: " & objEvent.EventCode
Wscript.Echo "Message: " & objEvent.Message
Wscript.Echo "Record Number: " & objEvent.RecordNumber
Wscript.Echo "Source Name: " & objEvent.SourceName
Wscript.Echo "Time Written: " & objEvent.TimeWritten
Wscript.Echo "Event Type: " & objEvent.Type
Wscript.Echo "User: " & objEvent.User
Next
Ausgabe dieses Machwerks ist
>e:\schnipsel\GetLastLogEvent.vbs
Logfile "Application" # 1345 Zuletzt geändert: 20100601220546.211425+120
Neuester ApplLog-Record: 12919 Time Written : 20100603164706.000000+120 EventCode: 257 Source: McLogEvent
Ältester ApplLog-Record: 11575 Time Written : 20100202203707.000000+060 EventCode: 1904 Source: HHCTRL
Anmerkungen (zusätzlich zu dem im Source stehenden)
a) bitte beachten in der Ausgabe die LastModified-Angabe des Logs und die Date-Werte darunter (TimeWritten) !
b) Schnipsel ist auch schnell runtergepfuscht... insbesondere die von Hand mit Leerzeichen ausgerichtete "Spalten untereinander"-Ausgabe.
Sollte natürlich für allgemeine Verwendung auf jeweils gleiche "Spalten"-Länge formatiert werden. War mir für die Demo nicht wichtig.
c) Überprüft ist es: der lt. Ausgabe älteste Satz ist auch der älteste, der neueste ist auch der neueste.
d) ABER: natürlich ist es bei mir insofern geschwindelt mit der Ermittlung der "ältesten" Satzes, dass unterstellt wird (von mir),
es sind vielleicht mal "alle Sätze älter als 2 Jahre" bzw. "älter als 2. Februar 2010" gelöscht worden.
Also eine ununterbrochene RecordNumber-Folge von Satz 1 bis Satz 11574 inclusive.
--> Achtung: Wenn jemand SELEKTIV einzelne Sätze mittendrin löscht, passt diese Milchmädchen-FDP-Rechnung natürlich nicht
e) bei diesem ganzen objWMI-Service-Gelumpe gilt:
Kein Satz muss zugesicherterweise ALLE denkbaren Attribute haben.
Ich habe genauso beim Testen auf die Schnauze bekommen wie Kollege djbazo in seinem letzten Post.
Es gibt Events ohne evtLog.Sourcename, ohne evtlog.messagetext, ohne....usw. ---> "On Error Resume Next".
f) für den jüngsten Satz braucht man/frau nichts davon...das ist einfach immer der erste.
Der Code basiert - wie geschrieben- auf den Hey Scripting-Guy-Skizzen
Grüße
Biber,
der sich jetzt auch wieder zu seinen unkomplizierteren Onelinern zurückzieht.