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-Key: 67709

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

Printed on: April 19, 2024 at 07:04 o'clock

Member: TuXHunt3R
TuXHunt3R Sep 03, 2007 at 19:57:10 (UTC)
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"
Member: kallewirsch
kallewirsch Sep 03, 2007 at 21:01:55 (UTC)
Goto Top
Sorry, hatte ich vergessen, danke für den Hinweis.
Member: TuXHunt3R
TuXHunt3R Sep 04, 2007 at 19:15:42 (UTC)
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"
Member: kallewirsch
kallewirsch Sep 12, 2007 at 07:38:32 (UTC)
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.
Member: TuXHunt3R
TuXHunt3R Sep 12, 2007 at 10:14:45 (UTC)
Goto Top
Sehr gutes Script.

Werds gleich mal testen
Member: TuXHunt3R
TuXHunt3R Apr 28, 2008, updated at Oct 18, 2012 at 16:35:40 (UTC)
Goto Top
Hier noch was zum Thema Eventlog+PowerShell (unter Anderem):
PowerShell For Runaways - Part II