tuxhunt3r
Goto Top

VBS - Eventlog-Einträge (Application- und Systemlog) der letzten 24 h anzeigen

Hallo ans Forum

Wie liest man mit VBS das Eventlog eines Remotecomputers aus?
Konkret will ich alle Warnungen und Errors der letzen 24h des Zielsystems angezeigt bekommen, und zwar die des Application- und des Systemlogs.
Wie geht das?

Bei Batch gehts mit dem Tool dumpel.exe, aber ich möchte von Batch endlich mal wegkommen....

Danke im Voraus


Gruss TuXHunT3R

Edit:
Falls die Unterscheidung von Application und Systemlog zu kompliziert wird, reicht es auch, wenn einfach von allen Logs die Warnungen und Errors herausgelesen werden.

Content-Key: 80783

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

Printed on: April 16, 2024 at 17:04 o'clock

Member: bastla
bastla Feb 14, 2008 at 21:14:28 (UTC)
Goto Top
Hallo TuXHunt3R!

Als Basis (mit ein wenig Formatierung):
strComputer = "Remotecomputer"  
strPath = "D:\Eventlog_EW.csv"  
strDelim = ";"  
intDays = 1 'ab gestern (Datum - 1)  

strDate = CStr(Mid(Date - intDays, 7, 4)) & CStr(Mid(Date - intDays, 4, 2)) & CStr(Mid(Date - intDays, 1, 2))

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFile = objFSO.CreateTextFile(strPath, True)

Set objWMI = GetObject("winmgmts:" & _  
	"{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set colLoggedEvents = objWMI.ExecQuery _
	("Select * from Win32_NTLogEvent Where " & _  
	"(Logfile = 'System' Or LogFile = 'Application') And " & _  
	"EventType < '3' And TimeWritten > '" & strDate & "'") 'nur Typ 1 (Error) und 2 (Warning)  

For Each objEvent in colLoggedEvents
	With objEvent
		strLine = .Logfile
		Select Case LCase(.Type)
		Case "error"  
			strLine = strLine & strDelim & "Fehler"  
		Case "warning"  
			strLine = strLine & strDelim & "Warnung"  
		Case Else 'dürfte hier nicht vorkommen  
			strLine = strLine & strDelim & "Anderer"  
		End Select
		strLine = strLine & strDelim & Mid(.TimeWritten, 7, 2) & "." & Mid(.TimeWritten, 5, 2) & "." & Mid(.TimeWritten, 1, 4)  
		strLine = strLine & strDelim & Mid(.TimeWritten, 9, 2) & ":" & Mid(.TimeWritten, 11, 2) & ":" & Mid(.TimeWritten, 13, 2)  
		strLine = strLine & strDelim & .SourceName
		If .Category <> "0" Then  
			strLine = strLine & strDelim & .Category
		Else
			strLine = strLine & strDelim & "Keine"  
		End If
		strLine = strLine & strDelim & .EventCode
		If .User <> "" Then  
			strLine = strLine & strDelim & .User
		Else
			strLine = strLine & strDelim & "Nicht zutreffend"		  
		End If
		strLine = strLine & strDelim & .ComputerName
	End With
	'WScript.Echo strLine 'zum Testen über cscript.exe  
	objFile.WriteLine strLine
Next
objFile.Close
Zur Vereinfachung (nur Datumsabfrage) werden alle Events seit gestern (und demnach < 48 Stunden) erfasst.

Noch ein paar Links:
Win32_NTLogEvent Class
How Can I Retrieve Just Audit Failures, Warnings, and Errors from My Event Logs?
Guy's Scripting Ezine 39 - WMI and Event Logs

Grüße
bastla
Member: TuXHunt3R
TuXHunt3R Feb 15, 2008 at 12:03:49 (UTC)
Goto Top
Danke, werds testen. Gebe dir heute oder morgen Bescheid.
Member: TuXHunt3R
TuXHunt3R Feb 18, 2008 at 11:26:51 (UTC)
Goto Top
Konnte es leider noch nicht testen. Dauert noch ein Weilchen.....
Member: TuXHunt3R
TuXHunt3R Feb 23, 2008 at 16:55:37 (UTC)
Goto Top
Hallo bastla

Könntest du mir diese Zeile ein bisschen ausdeutschen?
strDate = CStr(Mid(Date - intDays, 7, 4)) & CStr(Mid(Date - intDays, 4, 2)) & CStr(Mid(Date - intDays, 1, 2))
Begreif ich nicht ganz......
Member: bastla
bastla Feb 23, 2008 at 17:14:35 (UTC)
Goto Top
Hallo TuXHunt3R!

Ist ein wenig schwer zu erklären, weil sie eigentlich so aussehen sollte: face-wink
strDate = Mid(CStr(Date - intDays), 7, 4) & Mid(CStr(Date - intDays), 4, 2) & Mid(CStr(Date - intDays), 1, 2)
Oder noch besser so:
dtAbDatum = Date - intDays ' ab welchem Datum (Heute - intDays) soll das Log ausgewertet werden - Ergebnis im Format "TT.MM.JJJJ"  
strAbDatum = CStr(dtAbDatum) ' diese Datumsangabe in einen String umwandeln ...  
'  ... und diesen zerlegen und neu zusammensetzen, damit das Datum in der Form "JJJJMMTT" zur Verfügung steht  
strDate = Mid(strAbDatum, 7, 4) & Mid(strAbDatum, 4, 2) & Mid(strAbDatum, 1, 2)
Funktioniert haben sollte aber (wegen der impliziten Typkonversion durch VBS) auch die ursprüngliche Schreibweise - es waren so nur alle CStr() überflüssig.

Grüße
bastla
Member: TuXHunt3R
TuXHunt3R Feb 23, 2008 at 17:26:59 (UTC)
Goto Top
OK, danke. Melde mich eventuell noch mal...
Member: TuXHunt3R
TuXHunt3R Feb 23, 2008 at 17:40:32 (UTC)
Goto Top
Die Datumsangabe im WMI-Query muss also folgendermassen aussehen?
yyyyMMdd

Also, z.B. so:
20080223
Member: bastla
bastla Feb 23, 2008 at 18:22:01 (UTC)
Goto Top
Hallo TuXHunt3R!

Das vollständige Datums-/Zeitformat sieht so aus (kannst Du durch ein
WScript.Echo .TimeWritten
in der Schleife nachvollziehen):
20080223190532.000000+060
Es genügt aber für die Abfrage der Datumsanteil (entspricht dann "Datum 00:00 Uhr").

Grüße
bastla
Member: bastla
bastla Feb 23, 2008 at 18:42:38 (UTC)
Goto Top
... als Ergänzung:

Wenn Du tatsächlich die Anforderung "letzte 24 Stunden" exakt umsetzen willst, kannst Du es so versuchen:
...
intStd = 24

dtAb = DateAdd("h", -intStd, Now)  
strAb = CStr(dtAb)
strDate = Mid(strAb, 7, 4) & Mid(strAb, 4, 2) & Mid(strAb, 1, 2) & _
	Replace(Mid(strAb, 12), ":", "") & ".000000+060"  
...

Grüße
bastla
Member: TuXHunt3R
TuXHunt3R Apr 29, 2008, updated at Oct 18, 2012 at 16:35:40 (UTC)
Goto Top
Hallo bastla

Habe es in PowerShell umgesetzt, siehe hier:
PowerShell For Runaways - Part II

Problem damit gelöst!