none
Windows Dienst überwachen und Mail verschicken, wenn Dienst beendet RRS feed

  • Frage

  • Hallo Zusammen,

    ich versuche ein Skript zu schreiben, das jede Minute überprüft, ob ein Dienst läuft. Wenn dieser nicht gestartet ist, soll eine E-Mail verschickt werden. Ich habe folgenden Skript getestet, funktioniert aber nicht 100%ig:

    $servicename="PeerDistSvc" #Dienstname
    $timespan = New-Object System.TimeSpan(0,1,0) #Stunden,Minuten,Sekunden
    $scope = New-Object System.Management.ManagementScope("\\.\root\cimV2") 
    $query = New-Object System.Management.WQLEventQuery ("__InstanceModificationEvent",$timespan, "TargetInstance ISA 'Win32_service'" )
    $watcher = New-Object System.Management.ManagementEventWatcher($scope,$query)
    
    
    do
        {
            $b = $watcher.WaitForNextEvent()
            
            $b.TargetInstance.Name
            $b.TargetInstance.caption     # Eigenschaftenn der WMI-Klasse: win32_service
            if ($(get-service -name $servicename).status -eq "Stopped") {
              start-service -name $servicename
              
    		  Send-MailMessage -smtpServer server fqdn -From admin@ab.loc -To user@ab.loc -Subject 'Dienst auf Server XX-01 unerwartet beendet. Dienst wurde neugestartet' -Body "Body content"	
            }
            
        }
    while ($a -ne 1)

    Danke



    • Bearbeitet sonicalert Montag, 7. August 2017 08:59
    Mittwoch, 17. Februar 2016 11:21

Antworten

  • Hi,

    ich würde das so lösen:

    $computer = "Server"
    $service  = "Dienstname"
    
    $foo = Get-Service -ComputerName $computer -Name $Service
    
    if ($foo.Status -ne "Running") 
    {
    
     send-mailmessage .....
    
    }

    Das Skript dann per geplanten Task alle Minute ausführen.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    • Als Antwort markiert sonicalert Mittwoch, 17. Februar 2016 14:00
    Mittwoch, 17. Februar 2016 11:30

Alle Antworten

  • Hi,

    ich würde das so lösen:

    $computer = "Server"
    $service  = "Dienstname"
    
    $foo = Get-Service -ComputerName $computer -Name $Service
    
    if ($foo.Status -ne "Running") 
    {
    
     send-mailmessage .....
    
    }

    Das Skript dann per geplanten Task alle Minute ausführen.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    • Als Antwort markiert sonicalert Mittwoch, 17. Februar 2016 14:00
    Mittwoch, 17. Februar 2016 11:30
  • Hallo edstylo,

    und was genau funktioniert nun nicht richtig? Sollen wir raten, was das Problem ist?

    Viele Grüße

    Christoph

    Mittwoch, 17. Februar 2016 11:31
  • Hi Christian,

    vielen Dank für den Tipp. Hier das Skript:

    $ComputerName = (get-wmiobject Win32_Computersystem).name $ServiceName = "Name" $ServiceDisplayName = (Get-Service $ServiceName).DisplayName function SendAlert { $FromAddress = "admin@abc.com" $ToAddress = "user@abc.com" $MessageSubject = "Name-Dienst wurde auf $ComputerName unerwartet beendet" $MessageBody = "Der Dienst $ServiceDisplayName ($ServiceName) auf dem Server $ComputerName wurde unerwartet beendet und neugestartet!" $SendingServer = "a.b.c.d" ###Create the mail message and add the statistics text file as an attachment $SMTPMessage = New-Object System.Net.Mail.MailMessage $FromAddress, $ToAddress, $MessageSubject, $MessageBody ###Send the message $SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer $SMTPClient.Send($SMTPMessage) }

    $Status = (Get-Service $ServiceName).Status
    If ($Status -ne "Running")
    {    
        Start-Service -name $ServiceName
        SendAlert    
    }

    Gruß




    • Bearbeitet sonicalert Montag, 7. August 2017 08:59
    Mittwoch, 17. Februar 2016 13:55
  • Hi Christoph,

    das wäre eine Option :) Also, der Dienst wurde 2-3 mal neugestartet und anschließend nicht mehr.

    Mittwoch, 17. Februar 2016 14:00