Scheduled Task Batch und 0x1

Der Scheduler von Windows meldet bei einem fehlerhaften Lauf eines Tasks entsprechend einen Fehler ins Event-Log.Doch wenn ein Batch ( cmd oder bat ) einen Errorcode auslöst, dann wird dies nur mit dem letzten Status angezeigt. zB 0x1 oder 0x2 etc.

Wie kann man dies nun monitoren ? Wie überwachen, sodass man zB eine Info per eMail oder gar ein Ticket eröffnet wird ?

Ich habe mir diese Frage gestellt, da ich auf einem Windows Server das OTRS Ticket-System laufen habe, und OTRS einige Jobs benötigt, um richtig zu funktionieren. …. und wozu hat man den Windows-Scheduler ? 😉

Ich schrieb kurzerhand ein Power-Shell Script, welches die Scheduled Tasks von OTRS überwacht.

Zu Beginn die Parameter die angepaßt werden müssen, wie eMail-Adressen etc.
Das Script ist so aufgebaut, dass es innerhalb des Pfades des Windows Schedulers ( Variable $TaskFolder ) die hinterlegten Tasks abfrägt.
Da ein OTRS-Task zuständig ist, die eMails zu übermitteln, hat es nur wenig Sinn, die selbe eMail-Adresse zu verwenden, wie auch das Ticket-System – zB. support@blabla.at ( wenn man die eMail-Alerts an das Ticket-System übermitteln will, was ja wiederum Sinn macht ).
Dahingehend gibt es für diesen Fall weitere eMail-Adressen ( Variable [string[]]$eMailTo2 …. ja muss ein Array sein, da der send-mailmessage sonst nicht mit den Adressen umgehen kann. )
Somit ist die Variable $eMailTask entsprechend zu benennen, damit die alternativen eMail-Adressen verwendet werden, falls dieser Task ein Problem hat.


# Script-Name: check_scheduler.ps1
# Erstellt am: 27.02.2014
# Author: Stefan Pachlina
# Version: 1.1
#
# Mit diesem Script wird überprüft, ob ein Scheduled-Task von OTRS den Rückgabewert ungleich 0 enthält
# Wenn ja, wird ein eMail ausgelöst.
# ————————————————————————————————–

# Start: Anzupassende Parameter
# —————————————————————————————
# Task Scheduler Sub-Ordner, in dem sich die Tasks befinden
$TaskFolder   = „OTRS“
# eMail Absenderadresse
$eMailFrom    = „adresse@domain.at
# eMail Empfängeradresse
$eMailTo      = „adresse@domain.at
# eMail Empfängeradresse(n) für den Fall, wenn der OTRS-eMail-Task nicht läuft,
# und die Adresse unter $eMailTo ans Ticket-System meldet
[string[]]$eMailTo2     = „Vorname Nachname <
adresse@domain.at> „, „Vorname Nachname <adresse@domain.at >
# Mail-Server
$smtpserver   = „servername.domain.at“
# Name des Scheduled Tasks, welcher die eMails an OTRS übermittelt
$eMailTask    = „check eMails“
# —————————————————————————————
# End: Anzupassende Parameter

$Foldertocheck = $TaskFolder + „\“
$checkString  = schtasks /query /FO LIST /V /TN $Foldertocheck | findstr „TaskName“
$Tasks = $checkString

foreach ($TaskName in $Tasks) {
$checkTaskname = $TaskName.TrimStart(„TaskName:“).Trim()
$checkString  = schtasks /query /FO LIST /V /TN $checkTaskname | findstr „Result“

if ($checkString -notmatch „0“) {
$eMailSubject = „Task failed: “ + $checkTaskname

# Aufbereitung des eMail-Textes
$det1 = schtasks /query /FO LIST /V /TN $checkTaskname | findstr /c:“HostName“
$det2 = schtasks /query /FO LIST /V /TN $checkTaskname | findstr /c:“Folder“
$det3 = schtasks /query /FO LIST /V /TN $checkTaskname | findstr /c:“TaskName“
$det4 = schtasks /query /FO LIST /V /TN $checkTaskname | findstr /c:“Next Run Time“
$det5 = schtasks /query /FO LIST /V /TN $checkTaskname | findstr /c:“Last Run Time“
$det6 = schtasks /query /FO LIST /V /TN $checkTaskname | findstr /c:“Last Result“
$det7 = schtasks /query /FO LIST /V /TN $checkTaskname | findstr /c:“Task To Run“
$det8 = schtasks /query /FO LIST /V /TN $checkTaskname | findstr /c:“Run As User“
$det9 = schtasks /query /FO LIST /V /TN $checkTaskname | findstr /c:“Schedule Type“

$eMailBody = „Ein scheduled Task schlug fehl !<br><br><b>Error details:</b><br><br><font size=3>“
$eMailBody = $eMailBody + $det1 + „<br>“ + $det2 + „<br>“ + $det3 + „<br>“ + $det4 + „<br>“ + $det5 + „<br>“ + $det6 + „<br>“ + $det7 + „<br>“ + $det8 + „<br>“ + $det9 + „<br>“

if ($checkTaskname -match $eMailTask) {
$eMailTo = $eMailTo2
}

send-mailmessage -to $eMailTo -from $eMailFrom -subject $eMailSubject -body $eMailBody -smtpServer $smtpserver -BodyAsHtml
}
}

 


Das Power-Shell Script selbst trägt man ebenfalls als Scheduled-Task ins Root ein …. ein Lauf alle 12h sollte wohl genügen.

Es steht natürlich frei, dies auch für andere Scheduled Tasks zu verwenden, anzupassen etc.
Sollte etwas unklar sein, einfach nen Kommentar hinterlassen 😉

Schreibe einen Kommentar