PowerShell: Serversystemfehlerprotokoll auslesen

25. April 2016 14:02

Mit diesem Skript kann aus einem Server das Systemsystemfehlerprotokoll in eine Datei (hier im Freigabepfad "\\MyServer\MySwapFolder\Logs) exportiert werden.
Aus der von Windows erzeugten Datei werden dann die ersten 3 Zeilen entfernt, damit die Datei problemlos direkt per XMLport/Dataport weiterverarbeitet werden kann.

Die erzeugte Datei enthält die Daten, die hier in der Ereignisanzeige sonst manuell eingesehen werden können.
ServerErrorLog2.png


Die Spaltenformatierung kann man beim Cmdlet Get-Eventlog optional vorgeben (format-table -Property Timewritten,Index,Source,InstanceID,Message -Wrap -AutoSize) es gibt außer beim Zeitstempel aber keine feste Spaltenbreite, diese hängt von den aktuellen Fehlern ab. Über -Wrap -AutoSize verhindert man das sonst auftretende Abschneiden der Fehlermeldungen.

Die Anzahl der Rückschautage in der Datei (hier 7) wird über -After (Get-Date).AddDays(-7) eingestellt. Falls außer Fehlern (-EntryType -eq "Error" ) noch mehr ins Protokoll soll, kann man natürlich auch weitere Filter setzen (Information, FailureAudit, SuccessAudit, Warning) oder diese auch ganz weglassen. In diesen Fällen muss der EntryType bei der Spaltenauflistung nach Format-Table dann natürlich noch mit dazu genommen werden.

Bitte beachten, dass das Verwenden von Out-GridView bei Remotesessions nicht möglich ist. Bei lokalen Sessions kann man sich das Fehlerprotokoll dagegen statt in die Datei ins GridView holen (also statt Out-File -filepath … dann Out-GridView). Bei Out-GridView das Format-Table in der Pipeline weglassen, da hier die Fehlermeldung mitsamt der anderen Spalten in einer Zeile ohne Umbruch und Abschneiden untergebracht wird.

Das Passwort zur Anmeldung wird im Skript aus einer verschlüsselten Datei ausgelesen, die Grundlagen dazu stehen hier.

Oben die erzeugte Rohdatei mit Spaltenüberschriften, unten die Datei ohne Spaltenüberschriften zur Weiterverarbeitung.
ServerErrorLog1.png

Code:
$User = 'MyDomain\administrator'
$pwFile = "X:\MyEncryptedPasswordFile.txt"
$cred = New-Object -TypeName System.Management.Automation.PSCredential ` -ArgumentList $User, (Get-Content $pwFile | ConvertTo-SecureString -key (1..16))
Write-Host 'Exporting error log from MyServerName to server path \\MyServer\MySwapFolder\Logs'
$MySession = New-PSSession -computerName MyServerName -credential $cred
invoke-command -Session $MySession -scriptblock {New-item "\\MyServer\MySwapFolder\Logs" -itemtype directory -Force}
invoke-command -Session $MySession -scriptblock {if (test-path "\\MyServer\MySwapFolder\Logs\Errorlog.txt") {remove-item "\\MyServer\MySwapFolder\Logs\Errorlog.txt"}}
invoke-command -Session $MySession -scriptblock {if (test-path "\\MyServer\MySwapFolder\Logs\ErrorlogRaw.txt") {remove-item "\\MyServer\MySwapFolder\Logs\ErrorlogRaw.txt"}}
invoke-command -Session $MySession -scriptblock {get-eventlog -logname system -After (Get-Date).AddDays(-7) | where-object { $_.EntryType -eq "Error" } | format-table -Property Timewritten,Index,Source,InstanceID,Message -Wrap -AutoSize | out-file -filepath "\\MyServer\MySwapFolder\Logs\ErrorlogRaw.txt" -noclobber}
invoke-command -Session $MySession -scriptblock {if (Test-path "\\MyServer\MySwapFolder\Logs\ErrorlogRaw.txt") {(Get-Content "\\MyServer\MySwapFolder\Logs\ErrorlogRaw.txt" | Select-Object -Skip 3) | Set-Content "\\MyServer\MySwapFolder\Logs\Errorlog.txt"}}
Remove-PSSession $MySession
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.