Batch Wenn Prozess nicht vorhanden, dann Mail Script per Batch oder Powershell

r3m4

Commodore
Registriert
Sep. 2012
Beiträge
4.542
Hallo zusammen,
da ich leider nicht der geborene Scripter oder was auch immer Programmierer bin, habe ich gerade ein kleines Problem :)
Vielleicht kann mir der ein oder andere Crack von euch ein wenig auf die Sprünge helfen.

Das Problem:
Auf einem entfernten Server beendet sich von Zeit zu Zeit ein für mich wichtiger Prozess. Leider ist das Problem bekannt aber niemand bringt einen Bugfix oder ähnliches raus. Also muss man sich eben selbst behelfen...
Mir wäre es jetzt lieb, wenn ein geplanter Task auf einem anderen Server stündlich abfrägt ob der Prozess denn noch läuft und falls nicht mir eine kurze Mail mit der Info darüber schickt.

Die Aufgabe also:
-Prozess läuft --> nix machen
-Prozess läuft nicht mehr --> Mail an mich schreiben

Bisheriger Lösungsansatz:
tasklist /s entfernterserver /u administrator /p passwort | find /i "prozess.exe" >nul && "C:\Program Files (x86)\FreePDF_XP\blat.exe" -body "Der Dienst ist beendet!" -f absenderadresse -to zieladresse -subject "Dienst beendet!" -server exchange-server

Die Mail zu schreiben ist ja alles kein Problem. Das habe ich mit Blat gelöst. Das will ich auch nicht auf jeden Server knallen, daher die entfernte Abfrage.
Das Problem ist aber, dass ich mit meiner Anfrage immer nur ein Ergebnis bekomme, wenn der Dienst läuft. Ich möchte aber nur ein Ergebnis haben wenn der Dienst NICHT mehr läuft.

Ich steh gerade total auf dem Schlauch und bin kurz davor das ganze mit if und co in der Powershell zu basteln. Hoffe dass mir jemand einen kleinen Tipp an die Hand geben kann wie ich das mit so schmalem Code bewerkstellige.

Vielen Dank für alle Hilfe!!!
 
Hallo,

eine schnelle Lösung per Powershell könnte so aussehen:

Code:
if (!(Get-Process -ComputerName *Server* -Name *Prozessname* -ErrorAction 'SilentlyContinue' -WarningAction 'SilentlyContinue')) { Send-MailMessage -SmtpServer *Mailserver* -To *Empfänger* -From *Absender* -Subject *Betreff* -Body *Text* }

Du musst natürlich per WinRM zum Server hinkommen, ein Listener auf dem Server eingerichtet sein (winrm quickconfig) und der User unter dessen Kontext das ausgeführt wird muss die entsprechenden Rechte haben.

Gruß,
sal
 
Wieso lässt du nicht den problematischen Prozess selber als Task laufen und im Bedarfsfall automatisch neustarten?

In Batch könntest du vermutlich den Errorlevel abfragen und als Bedingung verwenden, da Find einen Fehler auswirft wenn es nichts passendes findet.
 
Servus,

hier eine "kleine" Starthilfe. Du kannst alles mit einem Powershell-Skript auf deinem Server erledigen.

Hier mal ein Code-Block um E-Mails zu generieren und zu verschicken:

# Email Konfiguration
$sendEmail = 1
$emailHost = "IP-Mailserver"
$emailUser = "E-Mail Adresse"
$emailPass = "Passwort"
$emailFrom = "..."
$emailTo = "...."
$emailSubject = "..."

## Skript-Code hier einfügen

#region Output
if ($sendEmail -eq 1) {
$body = $htmlOutput
$smtp = New-Object System.Net.Mail.SmtpClient $emailHost
$smtp.Credentials = New-Object System.Net.NetworkCredential($emailUser, $emailPass);
$msg = New-Object System.Net.Mail.MailMessage $emailFrom, $emailTo, $emailSubject, $body
$msg.isBodyhtml = $true
$smtp.send($msg)
}


Nachdem das erledigt ist, müssen wir noch den trigger definieren. Dienste kannst du in der PS mit dem Cmdlet Get-Service abfragen. Also

Get-Service Servicename

um nur den Status zu erhalten, hängst du noch eine Pipe an:

Get-Service Servicename | Select Status

Den Wert haust du in eine Variable und prüfst ob die auf Running oder Stopped steht.

Schätze den rest bekommst du hin ;-)

P.S. das gleiche gibts auch für Prozesse Get-Process
 
Vielen vielen Dank für eure Lösungen!!!
Ich habe mich jetzt weitgehend an die von sal099 genannte Lösung gehalten und es funktioniert einwandfrei!!!

Danke Humaer ich denke dass viele hier die Befehle auch noch finden werden und gebrauchen können.

@Hinagiku:
In unserem speziellen Fall ist die Sache noch ein wenig komplizierter als oben beschrieben, darum war das leider nicht möglich aber prinzipiell wäre das auch gegangen wenn nichts weiter benötigt würde.

Danke an euch für die Hilfe, hoffentlich hilft es hier noch anderen die vielleicht nach dem gleichen Problem suchen!
 
Zurück
Oben