lexura
Goto Top

Powershell - Events mehrerer Server sammeln und in HTML darstellen

Hallo, ich bin immer noch Neuling auf dem Gebiet Powershell. Als erste Aufgabe wollte ich mir ein Script schreiben, womit ich die Eventprotokolle meiner zu betreuenden Server auslesen kann, um sie dann in einer HTML Seite darzustellen. Dies ist mir auch gelungen. Zwar nicht sonderlich hübsch, aber es erfüllt seinen Zweck.
Ein Problem bekomm ich aber leider nicht gelöst:
Ein paar Event-Einträge kommen ständig und können aber grundsätzlich vernachlässigt werden. Diese möchte ich mir dann auch gar nicht anzeigen lassen, also gleich rausfiltern. Das filtern mehrerer Einträge habe ich nicht hinbekommen. Ein Einzelnen Eintrag zu filtern klappte ( $_.Message -notmatch "Unexpected failure. Error code: 490@01010004"} | ), ich brauch aber die Möglichkeit, mehrere Einträge zu filtern. Hoffe mir kann hier wieder jemand auf die Sprünge helfen.
Sollte hier noch jemand grundsätzliche Verbesserungen an meinem Script haben, bin ich na klar für alles dankbar.

Besten DANK im voraus...

Gruß Ralf

SCRIPT:

  1. Deklarieren der Variablen
#
$Datum = Get-Date -Format F

$Ueberschrift = "<h1 ALIGN=CENTER>ALLE SQL-SERVER-EVENTS DER LETZTEN 20 TAGE</h1>"
$Erstell_Dat = "<h3 ALIGN=CENTER>Erstellungsdatum:$Datum</h3>"

$S_SERVER = "<h1 ALIGN=CENTER>SQL - SERVER (virtuell)</h1>"
$M_SERVER = "<h1 ALIGN=CENTER>MANAGEMENT - SERVER (virtuell)</h1>"


  1. Serielles auslesen der SQL-Server - Events von System und Application
#
  1. Server 1 = SQLSRV01

[Array]$SRV_01 = $null

$SRV_01 += Invoke-Command -ComputerName SQLSRV01 { Get-EventLog -logname System -Newest 20 } |

Where-Object {
$_.EntryType -eq "Critical" -or
$_.EntryType -eq "Error" -or
$_.EntryType -eq "Warning" -and

$_.Message -notmatch "Unexpected failure. Error code: 490@01010004"} |

Sort-Object TimeWritten -Descending |

ConvertTo-Html -Property TimeWritten, EntryType, EventID, Source, Message -Fragment -PreContent "<h2>SQLSRV01 - SYSTEM EVENTS</h2>" -PostContent "<br>" |
foreach {
if ($_ -like "*<td>Critical</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF3333>"}
elseif ($_ -like "*<td>Error</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF6666>"}
elseif ($_ -like "*<td>Warning</td>*") {$_ -replace "<tr>","<tr bgcolor=#FFFF66>"}

else {$_ -replace "<tr>","<tr bgcolor=#33FFFF>"}}


$SRV_01 += Invoke-Command -ComputerName SQLSRV01 { Get-EventLog -logname Application -After (Get-Date).AddDays(-20) -Before (Get-Date) } |

Where-Object {
$_.EntryType -eq "Critical" -or
$_.EntryType -eq "Error" -or
$_.EntryType -eq "Warning" } |

Sort-Object TimeWritten -Descending |

ConvertTo-Html -Property TimeWritten, EntryType, EventID, Source, Message -Fragment -PreContent "<h2>SQLSRV01 - APPLICATION EVENTS</h2>" -PostContent "<br>" |
foreach {
if ($_ -like "*<td>Critical</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF3333>"}
elseif ($_ -like "*<td>Error</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF6666>"}
elseif ($_ -like "*<td>Warning</td>*") {$_ -replace "<tr>","<tr bgcolor=#FFFF66>"}

else {$_ -replace "<tr>","<tr bgcolor=#33FFFF>"}}


  1. Server 2 = SQLSRV02

[Array]$SRV_02 = $null

$SRV_02 += Invoke-Command -ComputerName SQLSRV02 { Get-EventLog -logname System -After (Get-Date).AddDays(-20) -Before (Get-Date) } |

Where-Object {
$_.EntryType -eq "Critical" -or
$_.EntryType -eq "Error" -or
$_.EntryType -eq "Warning" -and

$_.Message -notmatch "Unexpected failure. Error code: 490@01010004"} |

Sort-Object TimeWritten -Descending |

ConvertTo-Html -Property TimeWritten, EntryType, EventID, Source, Message -Fragment -PreContent "<h2>SQLSRV02 - SYSTEM EVENTS</h2>" -PostContent "<br>" |
foreach {
if ($_ -like "*<td>Critical</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF3333>"}
elseif ($_ -like "*<td>Error</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF6666>"}
elseif ($_ -like "*<td>Warning</td>*") {$_ -replace "<tr>","<tr bgcolor=#FFFF66>"}

else {$_ -replace "<tr>","<tr bgcolor=#33FFFF>"}}


$SRV_02 += Invoke-Command -ComputerName SQLSRV02 { Get-EventLog -logname Application -After (Get-Date).AddDays(-20) -Before (Get-Date) } |

Where-Object {
$_.EntryType -eq "Critical" -or
$_.EntryType -eq "Error" -or
$_.EntryType -eq "Warning" } |

Sort-Object TimeWritten -Descending |

ConvertTo-Html -Property TimeWritten, EntryType, EventID, Source, Message -Fragment -PreContent "<h2>SQLSRV02 - APPLICATION EVENTS</h2>" -PostContent "<br>" |
foreach {
if ($_ -like "*<td>Critical</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF3333>"}
elseif ($_ -like "*<td>Error</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF6666>"}
elseif ($_ -like "*<td>Warning</td>*") {$_ -replace "<tr>","<tr bgcolor=#FFFF66>"}

else {$_ -replace "<tr>","<tr bgcolor=#33FFFF>"}}


  1. Serielles auslesen des MANAGEMENT-Servers - Events von System und Application
#
  1. Server 03 = MANAGESRV03

[Array]$SRV_03 = $null

$SRV_03 += Invoke-Command -ComputerName MANAGESRV03 { Get-EventLog -logname System -After (Get-Date).AddDays(-20) -Before (Get-Date) } |

Where-Object {
$_.EntryType -eq "Critical" -or
$_.EntryType -eq "Error" -or
$_.EntryType -eq "Warning" -and

$_.Message -notmatch "Unexpected failure. Error code: 490@01010004"} |

Sort-Object TimeWritten -Descending |

ConvertTo-Html -Property TimeWritten, EntryType, EventID, Source, Message -Fragment -PreContent "<h2>MANAGESRV03 - SYSTEM EVENTS</h2>" -PostContent "<br>" |
foreach {
if ($_ -like "*<td>Critical</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF3333>"}
elseif ($_ -like "*<td>Error</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF6666>"}
elseif ($_ -like "*<td>Warning</td>*") {$_ -replace "<tr>","<tr bgcolor=#FFFF66>"}

else {$_ -replace "<tr>","<tr bgcolor=#33FFFF>"}}


$SRV_03 += Invoke-Command -ComputerName MANAGESRV03 { Get-EventLog -logname Application -After (Get-Date).AddDays(-20) -Before (Get-Date) } |

Where-Object {
$_.EntryType -eq "Critical" -or
$_.EntryType -eq "Error" -or
$_.EntryType -eq "Warning" } |

Sort-Object TimeWritten -Descending |

ConvertTo-Html -Property TimeWritten, EntryType, EventID, Source, Message -Fragment -PreContent "<h2>MANAGESRV03 - APPLICATION EVENTS</h2>" -PostContent "<br>" |
foreach {
if ($_ -like "*<td>Critical</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF3333>"}
elseif ($_ -like "*<td>Error</td>*") {$_ -replace "<tr>","<tr bgcolor=#FF6666>"}
elseif ($_ -like "*<td>Warning</td>*") {$_ -replace "<tr>","<tr bgcolor=#FFFF66>"}

else {$_ -replace "<tr>","<tr bgcolor=#33FFFF>"}}


ConvertTo-Html -Title "Eventübersicht" -body "$Ueberschrift $Erstell_Dat <br/> <hr NOSHADE SIZE=6 WIDTH=80% COLOR=#0033CC /> <br/>
$S_SERVER <br/> $SRV_01 <br/> <hr NOSHADE SIZE=3 WIDTH=80% COLOR=#0033CC /> <br/> $SRV_02 <br/> <hr NOSHADE SIZE=8 WIDTH=80% COLOR=#0033CC /> <br/> <br/> <br/>
$M_SERVER <br/> $SRV_03" |

Out-File D:\HTML\TEMP_EVENT.html

Content-Key: 242576

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

Printed on: April 23, 2024 at 12:04 o'clock

Member: colinardo
Solution colinardo Jul 03, 2014 updated at 13:19:25 (UTC)
Goto Top
Moin lexura,
ich brauch aber die Möglichkeit, mehrere Einträge zu filtern. Hoffe mir kann hier wieder jemand auf die Sprünge helfen.
du kannst mit -notmatch auch mehrere Einträge ausfiltern. Dazu hast du mehrere Möglichkeiten:
1. Du hängst alle Einträge mit -and hintereinander:
$_.Message -notmatch "Dich nicht" -and  $_.Message -notmatch "Dich auch nicht"
was aber ein längeres unübersichtliches Konstrukt ergibt.

2. Du benutzt Regex-Syntax in -notmatch. Du solltest unbedingt wissen das alles was du in den String hinter notmatch eingibst der Regular-Expression Syntax folgt, d.h. bestimmte Sonderzeichen haben eine spezielle Bedeutung. Z.b entspricht ein Punkt nicht einem Punkt sondern bedeutet "Matche einen beliebigen Buchstaben". Mehr zu Regex-Syntax kannst du hier nachlesen: Regular Expressions Tutorial. Sollte dich das überfordern nutze stattdessen den Operator -notlike der Strings als Strings behandelt.

Mit Regex hast du die Möglichkeit ein Oder zu benutzen um einen von mehreren Strings zu matchen. Dazu trennst du die Strings mit einer Pipe voneinander:
$_.Message -notmatch "Dich nicht|Dich auch nicht|Noch einer nicht"

Zum Code selber sage ich jetzt erst mal nichts weiter, da man immer etwas verbessern kann.
Bitte nutze Code-Tags für deinen Quellcode: <code> Quellcode </code>, ansonsten kommen uns hier eventuell wichtige Sonderzeichen abhanden.

Zur Info: Wie man Events schon im vornherein exakter mit Get-WinEvent und dem Parameter -FilterXPath ausfiltern kann, kannst du hier nachlesen: Automatische Eventlogauswertung mit Filterung

Hier noch ein Tipp um die HTML-Ausgabe übersichtlicher zu gestalten indem man das HTML selber aufbaut, dann hat man das Design besser im Griff:
Powershell Export memberof jede Gruppe in neue Zeile schreiben


Grüße Uwe