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:
$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>"
[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>"}}
[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>"}}
[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
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:
- 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>"
- Serielles auslesen der SQL-Server - Events von System und Application
- 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>"}}
- 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>"}}
- Serielles auslesen des MANAGEMENT-Servers - Events von System und Application
- 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
Please also mark the comments that contributed to the solution of the article
Content-Key: 242576
Url: https://administrator.de/contentid/242576
Printed on: April 24, 2024 at 23:04 o'clock
1 Comment
Moin lexura,
1. Du hängst alle Einträge mit -and hintereinander:
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:
Zum Code selber sage ich jetzt erst mal nichts weiter, da man immer etwas verbessern kann.
Bitte nutze Code-Tags für deinen Quellcode:
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
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"
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