kallewirsch
Goto Top

Powershell - Systemeventlog auslesen

Powrshell - Newbie
Hallo Forum, ich möchte die System-Eventlogs mit Hilfe der Powershell von einem zentralen Scriptserver aus auf verschiedenen W2K / W2K3-Servern auslesen. Allerdings nicht das komplette Eventlog, sondern nur bestimmte Einträge, aber immer für die letzten 24h Stunden.

Hier das kleine Powershellscript:


#Computer, von dem ich das Systemevent auslesen möchte...
$strComputer = "Hans"  

#Datum im Format YYYYMMDD bereitstellen und zu Testzwecken ausgeben
$datum1=(get-date (get-date).AddDays(-1) -uformat %Y%m%d)
Write-Host $datum1

#Von-Datum im Epochendatumsformat zusammenbauen und zu Testzwecken ausgeben
$datum2=($datum1+"000000.000000")  
Write-Host $datum2

#BIS-Datum im Epochendatumsformat zusammenbauen und zu Testzwecken ausgeben
$datum3=($datum1+"235959.999999")  
Write-Host $datum3


#Objekt anlegen
$colItems = get-wmiobject -class "Win32_NTLogEvent" -namespace "root\CIMV2" -computername $strComputer -Filter "LogFile='System' and EventCode='10' and SourceName='Print'" | where {"$_.TimeWritten -gt $datum2 -and $_.TimeWritten -lt $datum3"}  

#For-Schleife durcharbeiten und ausgeben
foreach ($objItem in $colItems) {
      write-host "Message: " $objItem.Message  
      write-host "Time Written: " $objItem.TimeWritten  
      write-host
}

Könnt Ihr mir helfen? Könnte das Problem vielleicht in der Epochen-Zeit liegen? Ich vermute, das es ein Problem mit der Where-Bedingung ist, da keine der beiden Datumsabfragen greift.....
Ein Auslesen über VB-Script oder Logparser kommt leider nicht in Frage, so dass ich es mit der Powershell machen muss.......

Vielen Dank

Content-ID: 67709

Url: https://administrator.de/forum/powershell-systemeventlog-auslesen-67709.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

TuXHunt3R
TuXHunt3R 03.09.2007 um 21:57:10 Uhr
Goto Top
Pack bitte den Code in Codeblöcke, so ist er fast nicht lesbar.

z.B. so:

write-host "Hier ist der Code"  


Hilfe findest du unter "Formatierungshilfe"
kallewirsch
kallewirsch 03.09.2007 um 23:01:55 Uhr
Goto Top
Sorry, hatte ich vergessen, danke für den Hinweis.
TuXHunt3R
TuXHunt3R 04.09.2007 um 21:15:42 Uhr
Goto Top
Versuch die where-Bedingung mal so (Nicht getestet):

where {$_.TimeWritten -gt $datum2 and $_.TimeWritten -lt $datum3}


Hilfe zum Where-CMDlet gibts durch die Eingabe von
get-help where-object -detailed

"where" ist ein Alias vom CMDlet "where-object"
kallewirsch
kallewirsch 12.09.2007 um 09:38:32 Uhr
Goto Top
Hi TuXHunt3R,

die Hilfe hat mich ein Stück weiter gebracht und jede Menge ausprobieren.

Als Ergebnis habe ich zwei Varianten gefunden, eine Schlechte und eine Gute, allerdings nur durch das Measure-Command.

Nun das Script:
#Skriptname: Eventlog Remote auslesen
#
#Autor: kallewirsch
#
#Auflage: 1.0
#
#Verzeichnis: /Scripte
#
#Beschreibung: 
#Anmerkungen: keine
#
#
#
#Variablendeklaration
#

$strComputer="Hans"  
$lfdzae=0
$lfzeit=0

$datum1=(get-date (get-date).AddDays(-1) -uformat %Y%m%d)
#Write-Host $datum1
$datum2=($datum1+"000000.000000+120")  
#Write-Host $datum2
$datum3=($datum1+"235959.999999+120")  
#Write-Host $datum3
#

# Schlechte Variante:
$lfzeit=(Measure-Command {$colItems=Get-WmiObject -class "Win32_NtLogEvent" -Namespace "root\cimv2" -computername $strComputer | where-object -FilterScript {$_.logfile -eq 'System' -and $_.Eventcode -eq 10 -and $_.Sourcename -eq 'Print' -and $_.TimeWritten -gt "$datum2" -and $_.Timewritten -lt "$datum3"}}).Totalseconds  
#

# Gute Variante:
#$lfzeit=(Measure-Command {$colItems=Get-WmiObject -Namespace "root\cimv2" -computername $strComputer -Query "select * from win32_ntlogevent where logfile = 'System' and Eventcode=10 and Sourcename = 'Print' and TimeWritten >= '$datum2' and Timewritten <= '$datum3'"}).Totalseconds  
foreach ($objItem in $colItems) {
   $lfdzae=$lfdzae+1
   write-host
   write-host "Message: "      $objItem.Message  
   write-host "Time Generated: " $objItem.Generated  
   write-host "Time Written: " $objItem.TimeWritten  
   write-host
}

Write-Host "lfdzae :" $lfdzae  
Write-Host "Ausfuehrungsdauer betraegt $lfzeit Sekunden"  

Der Unterschied liegt in der Abarbeitung des Befehles, in der schlechten Variante wird das wohl das gesamte Eventlog des Remote-Rechners auf den lokalen Rechner gezogen und dann entsprechend des Pipe-Befehls das Filter-Script angewendet.
Im anderen Fall wird die SQL-ähnliche Abfrage benutzt, diese filtert auf dem Remote-Server sofort das Eventlog und gibt nur entsprechend der where-Klausel das Ergebnis zurück.

Im Zusammenhang mit dem Measure-Command wird das ganze deutlich.

Sollte ich in der Beschreibung der Befehle einen Fehler haben, bitte um Korrektur.

Danke und viel Spaß beim ausprobieren.
TuXHunt3R
TuXHunt3R 12.09.2007 um 12:14:45 Uhr
Goto Top
Sehr gutes Script.

Werds gleich mal testen
TuXHunt3R
TuXHunt3R 28.04.2008, aktualisiert am 18.10.2012 um 18:35:40 Uhr
Goto Top
Hier noch was zum Thema Eventlog+PowerShell (unter Anderem):
PowerShell For Runaways - Part II