coreknabe
Goto Top

Ping und anschließende Mail mit Powershell

Moin,

folgendes möchte ich erreichen:
- Automatisiertes Ping mit Mail an Admin, wenn Ping nicht erfolgreich
- Wenn der Test fehlschlägt, Ping nach 10 Minuten wiederholen und im Erfolgsfall eine Mail an Admin

Dafür habe ich dieses Powershell-Skript gestrickt:

$testConnection = Test-Connection IP-Adresse -Quiet
$EmailFrom = "no-server@admin.de"  
$SubjectFAIL = "Server nicht erreichbar!"  
$SubjectOK = "Server wieder erreichbar!"  
$BodyFAIL = "4 Pingversuche sind fehlgeschlagen, bitte Server pruefen!"  
$BodyOK = "Server antwortet wieder auf Pingversuche!"  
$SMTPServer = "mail.admin.de"  
$EmailTo = "admin@admin.de"  

If ($testConnection -eq $false){
    Send-MailMessage -Body $BodyFAIL -to $EmailTo -from $EmailFrom -Subject $SubjectFAIL -SmtpServer $SMTPServer
} 

Start-Sleep -s 600

If ($testConnection -eq $true){
    Send-MailMessage -Body $BodyOK -to $EmailTo -from $EmailFrom -Subject $SubjectOK -SmtpServer $SMTPServer
}

Die erste Mail bekomme ich noch, wenn ich einen Fehler simuliere, jedoch bleibt die zweite Mail aus, wenn der Fehler beendet ist.
Ich sehe den Fehler nicht?

Gruß

Content-ID: 621894

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

Ausgedruckt am: 22.11.2024 um 08:11 Uhr

dwaldmannDE
dwaldmannDE 13.11.2020 aktualisiert um 15:36:42 Uhr
Goto Top
Hallo Coreknabe,

du befüllst die Variable $testConnection nur einmal am Anfang des Scripts. Diese hat daher nach 10 Minuten auch immer noch denselben Wert. Du musst nach dem Sleep nochmal ein Ping absetzen und das neue Ergebnis in die Variable schreiben.

Grüße
Daniel
Coreknabe
Coreknabe 13.11.2020, aktualisiert am 17.11.2020 um 09:46:13 Uhr
Goto Top
Hi Daniel,

vielen Dank, klingt plausibel.

Frage ist nur, wie mache ich das? Nach dem Sleep-Befehl habe ich jetzt die Variable geleert, dann müsste doch mit diesem Ablauf eigentlich ein neuer Wert auftauchen.

Code sieht dann so aus:
$testConnection = Test-Connection IP-Adresse -Quiet
$EmailFrom = "no-server@admin.de"  
$SubjectFAIL = "Server nicht erreichbar!"  
$SubjectOK = "Server wieder erreichbar!"  
$BodyFAIL = "4 Pingversuche sind fehlgeschlagen, bitte Server pruefen!"  
$BodyOK = "Server antwortet wieder auf Pingversuche!"  
$SMTPServer = "mail.admin.de"  
$EmailTo = "admin@admin.de"  

If ($testConnection -eq $false){
    Send-MailMessage -Body $BodyFAIL -to $EmailTo -from $EmailFrom -Subject $SubjectFAIL -SmtpServer $SMTPServer
} 

Start-Sleep -s 600
Clear-Variable testConnection

If ($testConnection -eq $true){
    Send-MailMessage -Body $BodyOK -to $EmailTo -from $EmailFrom -Subject $SubjectOK -SmtpServer $SMTPServer
}

Funktioniert auch nicht. Nächster Versuch:
$testConnection = Test-Connection IP-Adresse -Quiet
$EmailFrom = "no-server@admin.de"  
$SubjectFAIL = "Server nicht erreichbar!"  
$SubjectOK = "Server wieder erreichbar!"  
$BodyFAIL = "4 Pingversuche sind fehlgeschlagen, bitte Server pruefen!"  
$BodyOK = "Server antwortet wieder auf Pingversuche!"  
$SMTPServer = "mail.admin.de"  
$EmailTo = "admin@admin.de"  

test-connection IP-Adresse -quiet
If ($testConnection -eq $false){
    Send-MailMessage -Body $BodyFAIL -to $EmailTo -from $EmailFrom -Subject $SubjectFAIL -SmtpServer $SMTPServer
} 

Start-Sleep -s 600

test-connection IP-Adresse -quiet
If ($testConnection -eq $true){
    Send-MailMessage -Body $BodyOK -to $EmailTo -from $EmailFrom -Subject $SubjectOK -SmtpServer $SMTPServer
}

Führe ich das über ISE aus, sehe ich auch die Resultate, beim ersten Mal "False", beim zweiten Mal "True".

Klappt trotzdem nicht, die zweite Mail wird nicht versandt.

Gruß
dwaldmannDE
Lösung dwaldmannDE 13.11.2020 um 19:03:29 Uhr
Goto Top
Der zweite Ansatz ist richtig - nur hast du die Ausgabe von test-connection nicht in die Variable geschrieben.
So sollte es gehen:
$testConnection = Test-Connection IP-Adresse -Quiet
$EmailFrom = "no-server@admin.de"  
$SubjectFAIL = "Server nicht erreichbar!"  
$SubjectOK = "Server wieder erreichbar!"  
$BodyFAIL = "4 Pingversuche sind fehlgeschlagen, bitte Server pruefen!"  
$BodyOK = "Server antwortet wieder auf Pingversuche!"  
$SMTPServer = "mail.admin.de"  
$EmailTo = "admin@admin.de"  

If ($testConnection -eq $false){
    Send-MailMessage -Body $BodyFAIL -to $EmailTo -from $EmailFrom -Subject $SubjectFAIL -SmtpServer $SMTPServer
} 

Start-Sleep -s 600

$testConnection = Test-Connection IP-Adresse -Quiet

If ($testConnection -eq $true){
    Send-MailMessage -Body $BodyOK -to $EmailTo -from $EmailFrom -Subject $SubjectOK -SmtpServer $SMTPServer
}
Coreknabe
Coreknabe 14.11.2020 um 14:18:33 Uhr
Goto Top
Klappt, super. Dir herzlichen Dank und ein schönes Restwochenende!
Coreknabe
Coreknabe 17.11.2020 aktualisiert um 09:45:24 Uhr
Goto Top
Noch ein kleiner Fehler in meinem Konstrukt:

Es wird abschließend immer eine Mail verschickt, wenn der Server erreichbar ist. So ist das aber nicht geplant, wenn der Server im ersten Versuch erreicht wird, ist alles gut. Ich habe dafür noch eine Else-Bedingung verwurstet. So sieht das dann final aus, vielleicht hilft das jemandem.

$testConnection = Test-Connection IP-Adresse -Quiet
$EmailFrom = "no-server@admin.de"  
$SubjectFAIL = "Server nicht erreichbar!"  
$SubjectOK = "Server wieder erreichbar!"  
$BodyFAIL = "4 Pingversuche sind fehlgeschlagen, bitte Server pruefen!"  
$BodyOK = "Server antwortet wieder auf Pingversuche!"  
$SMTPServer = "mail.admin.de"  
$EmailTo = "admin@admin.de"  

If ($testConnection -eq $false){
    Send-MailMessage -Body $BodyFAIL -to $EmailTo -from $EmailFrom -Subject $SubjectFAIL -SmtpServer $SMTPServer
} 

else
{
    Exit
}

Start-Sleep -s 600

$testConnection = Test-Connection IP-Adresse -Quiet

If ($testConnection -eq $true){
    Send-MailMessage -Body $BodyOK -to $EmailTo -from $EmailFrom -Subject $SubjectOK -SmtpServer $SMTPServer
}