djbazo
Goto Top

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.


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

Content-Key: 144060

Url: https://administrator.de/contentid/144060

Printed on: May 5, 2024 at 13:05 o'clock

Member: Edi.Pfisterer
Edi.Pfisterer Jun 02, 2010 at 13:23:43 (UTC)
Goto Top
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)

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...
Member: bastla
bastla Jun 02, 2010 at 13:42:52 (UTC)
Goto Top
@Edi
Warum der Zähler - es sollte doch ein einfaches "Exit For" genügen ...

Grüße
bastla
Member: Edi.Pfisterer
Edi.Pfisterer Jun 02, 2010 at 13:51:54 (UTC)
Goto Top
Hallo Bastla!
Warum der Zähler - es sollte doch ein einfaches "Exit For" genügen
Weil ich das noch nicht kannte face-wink
Man lernt nie aus...
lg
Member: djbazo
djbazo Jun 02, 2010 at 13:52:44 (UTC)
Goto Top
Hallo Edi.Pfisterer und alle anderen!!
vor lauter Aufregung hab ich die Begrüßung vergessen - sorry dafür.

Dein Script funktioniert - jedoch wird der älteste Beitrag angezeigt, die Eventliste wird somit falsch geordnert alt - neu
Hättest du / ihr vielleicht noch eine Idee?

Grüße
Member: Edi.Pfisterer
Edi.Pfisterer Jun 02, 2010 at 14:08:59 (UTC)
Goto Top
So, achtung Bastla, DAS wird jetzt schmutzig... face-wink

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
Member: bastla
bastla Jun 02, 2010 at 14:38:14 (UTC)
Goto Top
Hallo Edi!

Etwas sauberer face-wink:
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
Grüße
bastla
Member: Edi.Pfisterer
Edi.Pfisterer Jun 02, 2010 at 16:55:15 (UTC)
Goto Top
face-wink
geil!!!!
selten so über mich selbst gelacht

Danke dafür!!!

lg
Member: bastla
bastla Jun 02, 2010 at 18:45:16 (UTC)
Goto Top
Hallo Edi!
selten so über mich selbst gelacht

Danke dafür!!!
War zwar nicht die Zielsetzung, aber: gerne ... face-wink

Die "Scripting Guys" haben übrigens einen von der Grundidee her gar nicht unähnlichen Ansatz zu bieten ...

Grüße
bastla
Member: djbazo
djbazo Jun 03, 2010 at 08:41:06 (UTC)
Goto Top
Hallo zusammen,

vielen dank für die antworten.
das stimmt, jedoch zählen die "Scripting Guys" die gesamten Einträge, nicht nur von einem bestimmten SourceName.
Denn bei einem bestmmten SourceName bekomme ich immer einen

Fehler: Das Objekt unterstützt diese EIgenschaft oder Methode nicht.: 'objLogfile.NumberOfRecords
Code 800A01B6

Grüße
Member: bastla
bastla Jun 03, 2010 at 08:47:50 (UTC)
Goto Top
Hallo djbazo!

Deshalb ja auch nur "nicht unähnlich" ... face-wink

Grüße
bastla
Member: Biber
Biber Jun 03, 2010 at 17:15:28 (UTC)
Goto Top
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)
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.
Member: djbazo
djbazo Jun 04, 2010 at 06:07:11 (UTC)
Goto Top
vielen dank für die ganzen Antworten!