E-Mail-Benachrichtigung, wenn der automatische Dienst nicht gestartet wird (Windows Server 2012 R2)

E-Mail-Benachrichtigung, wenn der automatische Dienst nicht gestartet wird (Windows Server 2012 R2)

Wir haben in unserer Umgebung einige Server (Windows Server 2012 R2), die Updates automatisch installieren und danach neu starten.

Nach dem Neustart möchten wir den Status aller (Windows-)Dienste überprüfen, die auf automatischen Start eingestellt sind. Wenn ein Dienst nicht gestartet wurde, versucht das Skript dreimal, den Dienst zu starten. Wenn alle Versuche fehlschlagen, sollte es eine E-Mail-Benachrichtigung senden, damit wir überprüfen können, was mit diesem Dienst auf diesem Server nicht stimmt.

Ich habe mich gefragt, ob es bereits eine einfache Lösung gibt, vielleicht ein PowerShell-Skript?

Antwort1

Ich würde Ihnen raten, sich nach einem NMS umzusehen. Wir verwenden PRTG und es funktioniert gut. Darin können Sie Sensoren erstellen, die Windows-Dienste mithilfe von WMI überwachen. Sie können den Sensor so konfigurieren, dass er E-Mails sendet/Skripte startet, wenn der Dienst ausfällt.

PRTG wird pro Sensor lizenziert, die kostenlose Version bietet Ihnen jedoch 100 Sensoren, was für einige Server ausreichen sollte (Sie benötigen einen Sensor pro zu überwachendem Dienst).

Antwort2

Powershell wäre eine großartige Möglichkeit, diese Dienste zu überwachen. Seltsamerweise habe ich heute gerade einen Blog darüber gelesen. Ich werde versuchen, das Skript zu verlinken, wenn ich es finden kann, aber der allgemeine Tenor wäre:

1.) Suchen Sie nach Diensten, die auf automatischen Start eingestellt sind.

2.) Überprüfen Sie den Status des Dienstes.

Der Trick ist, dass die

get-service

Das Cmdlet gibt keinen „StartupType“ aus, daher müssen Sie stattdessen das WMI-Objekt „Win32_Service“ verwenden.

Foreach($Server in $ServerList){
    Get-WmiObject -ComputerName $Server Win32_Service | 
    Where-Object {$_.StartMode -eq 'Auto' -AND $_.State -eq 'Stopped'}
}

Sie sollten dann eine Liste mit Diensten erhalten, die Ihren gewünschten Parametern entsprechen.

ANMERKUNGEN Hierzu sind einige Anmerkungen erforderlich:

1.) Ich empfehle dringend, dieses Skript einige Minuten nach dem Hochfahren der Server zu starten, da $_.StartMode -eq „Auto“ sowohl Dienste umfasst, die so eingestellt sind, dass sie unmittelbar nach dem Booten starten, als auch solche, die so eingestellt sind, dass sie nach einer Verzögerung automatisch starten.

2.) Es gibt Dienste, die durch diesen Einzeiler zurückgegeben werden, deren Überwachung für Sie wahrscheinlich nicht wichtig ist. (Auf meinem Laptop beispielsweise erfüllte ein Dienst namens „TrustedInstaller“ dieses Kriterium und wurde als gestoppter Dienst zurückgegeben :/ ) Daher müssen Sie diese höchstwahrscheinlich ebenfalls herausfiltern.

Antwort3

Service > Eigenschaften > Wiederherstellung

Bildbeschreibung hier eingeben

Kann auswählen, was bei den ersten drei Fehlern geschehen soll, einschließlich Neustart des Dienstes oder Ausführen eines Befehls.

Hier würden Sie auch verwendenProgramm ausführenum Ihr Skript festzulegen, das den Dienst neu startet, eine Datei löscht, Ihnen eine Benachrichtigung sendet usw. Ich bin ganz für NMS (Zabbix) oder Powershell-Skripte, aber das meiste davon kann nativ gelöst werden und GPO (falls auf Ihre Umgebung zutrifft) kann dies für alle erforderlichen Dienste/Maschinen festlegen.

Antwort4

Ich habe ein Powershell-Skript gefunden, das perfekt für mich ist. Ich muss es nur noch ein wenig anpassen. Hier ist der Linkhttp://doitcloudy.blogspot.de/2014/07/scriptgesteuerter-neustart-von-windows.html(Deutsch, aber das Skript unten auf der Seite ist komplett auf Englisch). Ich brauche jedoch bei diesem Teil etwas Hilfe (Zeilen 130 und folgende):

foreach ($item in $report){
Write-Host "Starting Service " $item.Name " on server: " $item.Server -Foregroundcolor yellow
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
    if ($j.State -ne 'Running') { break} 
    $j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)

}

Ich sehe, dass dies der Teil ist, in dem das Skript einen Dienst startet, aber ich bin nicht an Jobs in Powershell gewöhnt. Wie soll ich das Skript bearbeiten, damit es den Dienstnamen in eine Protokolldatei schreibt, wenn der Start des Dienstes fehlschlägt? Vielleicht mit try/catch?

Bearbeiten:

Falls jemand darüber stolpert und wissen möchte, wie ich es gelöst habe: Nach vielen Recherchen habe ich herausgefunden, dass es extrem schwierig ist, die Ausgabe von Receive-Job in eine Protokolldatei zu schreiben. Daher habe ich einen anderen Ansatz gewählt: Ich prüfe, ob der Server läuft, nachdem der Job beendet ist. Hier ist der Code:

foreach ($item in $report){
Write-Output "Starting Service " $item.Name " on server: " $item.Server
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
    if ($j.State -ne 'Running') { break} 
    $j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)
$newService = Get-Service -ComputerName $item.Server -Name $item.Name
if ($newService.Status -ne "Running") { LogWrite "$item could not start" }

}

verwandte Informationen