Zabbix:Template Windows Aufgabenplanung Scheduled Tasks
Aus znilwiki
Changelog:
- 23.04.2015: Erste Version, Version der TaskSchedulerMonitoring.exe ist 1.0.0.45
Download: Zabbix-TaskSchedulerMonitoring.zip
Vorwort
Dieses Template überwacht alle Aufgaben der Aufgabenplanung / Task Scheduler
- Sprachunabhängig - funktioniert mit deutschen und englischen Windows, erkennt deutsche und englische Schreibweise des Datums
- Es wurde nur alle Task im Stammordner "Aufgabenplanungsbibliothek" bzw. "Task Scheduler Library" erkannt, alle Task aus Unterordnern werden ignoriert
- Template ist enthält Item-Discovery
- Template enthält einen Demo-Trigger
- Die Abfrage des Status einer geplanten Aufgabe wird über ein Item "Query Helper" angetriggert. Dieser erhält als Rückgabewert die Laufzeit der Abfrage in Sekunden (gerundet). Ein Wert von 0s bedeutet als "unter 0,5 Sekunden"
- Es wird automatisch eine vorhanden Zabbix-Agenten-Installation erkannt, Ziel-Server wird aus der Konfigurationsdatei ausgelesen
- Items sind vom Typ "Zabbix Trapper" und werden per Zabbix_Sender.exe befüllt (geringe Last auf Host)
- Über die Datei "TaskSchedulerMonitoring-ignore.txt" können geplante Aufgaben Namentlich ignoriert werden - im Muster sind die Zabbix-Aufgaben die durch Erweiterungen von mir erstellt sind schon eingetragen, es findet eine "Text in Text" Vergleich statt. Die Angeabe von "abc" würde also alle Aufgaben ignorieren welche die Zeichenfolge "abc" enthalten
Bekannte Fehler
- Sind mehrer Instanzen des Zabbix-Agenten installiert so wird nur die Konfiguration des ersten Agenten gefunden - und Daten somit nur an diesen gesendet
- zabbix_sender.exe muss im gleichen Verzeichnis wie die zabbix_agentd.exe liegen
- Sind mehrere Zabbix-Server in der Agentenkonfiguration eingetragen so schlägt das Senden der Daten fehl
Screenshots
Discovery Prototypen:
Beispiel aus Latest Data:
Installation
- Kopiert die
TaskSchedulerMonitoring.exe
und dieTaskSchedulerMonitoring-ignore.txt
in das Verzeichnis mit eurem Zabbix-Agenten - Bearbeitet die
zabbix_agentd.win.conf
und ergänzt folgende Zeilen
UserParameter=znil.TaskSchedulerMonitoring[*],"C:\Program Files\Zabbix\UserParameter\TaskSchedulerMonitoring.exe" "$1" "$2" "$3" "$4"
- Den Pfad müsst Ihr natürlich anpassen
- Startet den Dienst des Zabbix-Agenten einmal neu!
- Importiert in Zabbix das Template
znil_Template_Windows_Task_Scheduler.xml
- Verknüpft das Template mit eurem Host
Und jetzt warten (Zabbix Agent einmal neu starten beschleunigt das ganze), der Intervall für die Erkennung steht auf alle 60 Minuten.
von Hand Testen
Die TaskSchedulerMonitoring.exe
könnt Ihr auch in der DOS-Box von Hand testen:
C:\Program Files\Zabbix\UserParameter>TaskSchedulerMonitoring.exe /? +------------------------------------------------------------------------------ | TaskSchedulderMonitoring.exe - Version 1.0.0.44 +------------------------------------------------------------------------------ | 2015 von Bernhard Linz für http://znil.net - Kontakt: Bernhard@znil.net +------------------------------------------------------------------------------ Hilfsprogramm für Zabbix als UserParameter um die Aufgabenplanung / Geplante Tasks zu überwachen --------------------------------------------------------------------------- Aufruf: TaskSchedulerMonitoring.exe <Option> <Parameter> Optionen: --------- /? oder -? : Diese Hilfe Anzeigen discovertasks : Erzeugt eine Liste im JSON Format über alle Aufgaben. Übernommen werden nur alle Tasks die im Stammordner \ stehen, also direkt unterhalb von 'Aufgabenplanungsbibliothek' bzw. 'Task Scheduler Library' query : Benötigt als Parameter den Namen des geplanten Task. Sendet das Ergebnis direkt an den Zabbix-Server bzw. Proxy über die Zabbix_Sender.exe. Es wird die Konfiguration des installierten Zabbix Agenten ausgelesen und der dort hinterlegte Server als Ziel genommen. Die Zabbix_Sender.exe muss im gleichen Pfad liegen wie die zabbix_agentd.exe Gibt die Laufzeit des Programmes in Sekunden zurück. +------------------------------------------------------------------------------ | TaskSchedulderMonitoring.exe ist FREEWARE! | Kopieren, weitergeben ausdrücklich erlaubt! | Die jeweils aktuelleste Version und Anleitungen findet Ihr unter: | http://znil.net/index.php?title=Zabbix:TaskSchedulerMonitoring +------------------------------------------------------------------------------
Wenn Ihr
TaskSchedulerMonitoring.exe discovertasks
angebt seht Ihr den JSON-String für Zabbix:
{"data":[ { "{#TSMTASKNAME}":"AD_Report_User_no_logon_since_60_days" }, { "{#TSMTASKNAME}":"Set_IP-Phone_Numbers" } ] }
Die Task-Namen werden abgewandelt - alle Leerzeichen werden in _ umgewandelt, alle Sonderzeichen eleminiert. Wenn Ihr das query testen wollte müsst Ihr den Tasknamen so angeben wir er beim discovery ausgegeben wird. Achtung - Er sendet direkt an den Zabbix-Server! Es muss also vorher ein Discovery gelaufen sein.
Anpassung Trigger
Es gibt einen Trigger-Prototypen der Auslöst wenn das letzte Ergebnis des Tasks
- NICHT 0
- NICHT 267009
- NICHT 1
ist.
0 steht in der Regel für "Erfolgreich" - dieser Wert ist der Exit-Code des Programms oder Scripts das gestartet wurde
1 steht - meistens - für "läuft gerade"
267009 gibt bei mir einer der Server aus wenn der Task gerade läuft, deshalb habe ich diesen auch hier eingefügt
Ihr müsst andere Status-Meldungen also ggf. ergänzen gemäß des Beispiel-Schemas.
Quellcode
Auch dieses Programm habe ich wieder mit AutoIt geschrieben:
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icon256-32.ico
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Description=Zabbix Monitor scheduled Tasks
#AutoIt3Wrapper_Res_Fileversion=1.0.0.45
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=2015 Bernhard Linz
#AutoIt3Wrapper_Res_SaveSource=y
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Res_Field=Website|http://znil.net
#AutoIt3Wrapper_Res_Field=Manual|http://znil.net/index.php?title=Zabbix:TaskSchedulerMonitoring
#AutoIt3Wrapper_Res_Field=See You|znil.net
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
Opt('MustDeclareVars', 1)
#Region ;************ Includes ************
#Include <Array.au3>
#include <Constants.au3>
#include <Date.au3>
#EndRegion ;************ Includes ************
; ##########################################################################################################################
; ##########################################################################################################################
; # TaskSchedulerMonitoring.exe --> Tool for Check BackupJobs in Zabbix #
; # 2013 Bernhard Linz / Bernhard@znil.de / http://znil.net #
; # #
; # Latest Version of this Program and Template in German: #
; # http://znil.net/index.php?title=Zabbix:TaskSchedulerMonitoring #
; # #
; # ________ .__ __. __ __ .__ __. _______ .___________. #
; # | / | \ | | | | | | | \ | | | ____|| | #
; # `---/ / | \| | | | | | | \| | | |__ `---| |----` #
; # / / | . ` | | | | | | . ` | | __| | | #
; # / /----.| |\ | | | | `----.__| |\ | | |____ | | #
; # /________||__| \__| |__| |_______(__)__| \__| |_______| |__| #
; # #
; ##########################################################################################################################
; ##########################################################################################################################
Global $s_schtasksexe
Global $s_temp1, $s_temp2
Global $a_temp1, $a_temp2
Global $a_DateTemp
Global $a_RuntimeTemp
Global $a_ScheduledTasks[1][8] ; [0][0] = Anzahl der Tasks
; [x][1] = Name des Task "original"
; [x][2] = Name des Tasks "bereinigt" - ohne Leerzeichen/Sonderzeichen zur Anzeige in Zabbix unr zur Übergabe an dieses Programm hier
; [x][3] = Last Result
; [x][4] = Last Run Time
; [x][5] = Next Run Time
; [x][6] = Run As User
; [x][7] = Task To Run
Global $s_Task2IgnoreFile = @ScriptDir & "\TaskSchedulerMonitoring-ignore.txt"
Global $h_Task2IgnoreFile
Global $a_Task2Ignore[1] = [ 0 ]
Global $b_IgnoreTask = False
Global $s_CleanTaskName
Global $s_OriginalTaskName
Global $s_QueryTaskName
Global $i_ThisTask
Global $s_JSONOutput
Global $s_RunCommand
Global $iStartTime
Global $iRunTime
; 10 20 30 40 50 60 70 80
; 12345678901234567890123456789012345678901234567890123456789012345678901234567890
Dim $s__Header = _
"+------------------------------------------------------------------------------" & @CRLF & _
"| TaskSchedulderMonitoring.exe - Version " & FileGetVersion(@ScriptName) & @CRLF & _
"+------------------------------------------------------------------------------" & @CRLF & _
"| 2015 von Bernhard Linz für http://znil.net - Kontakt: Bernhard@znil.net" & @CRLF & _
"+------------------------------------------------------------------------------" & @CRLF & _
@CRLF
; 10 20 30 40 50 60 70 80
; 12345678901234567890123456789012345678901234567890123456789012345678901234567890
Dim $s__HilfeText = _
"Hilfsprogramm für Zabbix als UserParameter um die Aufgabenplanung / Geplante" & @CRLF & _
"Tasks zu überwachen" & @CRLF & _
"---------------------------------------------------------------------------" & @CRLF & _
@CRLF & _
"Aufruf: " & @CRLF & _
@CRLF & _
@ScriptName & " <Option> <Parameter>" & @CRLF & _
@CRLF & _
"Optionen:" & @CRLF & _
"---------" & @CRLF & _
" /? oder -? : Diese Hilfe Anzeigen" & @CRLF & _
@CRLF & _
" discovertasks : Erzeugt eine Liste im JSON Format über alle Aufgaben." & @CRLF & _
" Übernommen werden nur alle Tasks die im Stammordner \ stehen," & @CRLF & _
" also direkt unterhalb von 'Aufgabenplanungsbibliothek' bzw." & @CRLF & _
" 'Task Scheduler Library'" & @CRLF & _
@CRLF & _
" query : Benötigt als Parameter den Namen des geplanten Task." & @CRLF & _
" Sendet das Ergebnis direkt an den Zabbix-Server bzw. Proxy" & @CRLF & _
" über die Zabbix_Sender.exe. Es wird die Konfiguration des" & @CRLF & _
" installierten Zabbix Agenten ausgelesen und der dort" & @CRLF & _
" hinterlegte Server als Ziel genommen. Die Zabbix_Sender.exe" & @CRLF & _
" muss im gleichen Pfad liegen wie die zabbix_agentd.exe" & @CRLF & _
" Gibt die Laufzeit des Programmes in Sekunden zurück." & @CRLF & _
@CRLF & _
"+------------------------------------------------------------------------------" & @CRLF & _
"| TaskSchedulderMonitoring.exe ist FREEWARE!" & @CRLF & _
"| Kopieren, weitergeben ausdrücklich erlaubt!" & @CRLF & _
"| Die jeweils aktuelleste Version und Anleitungen findet Ihr unter:" & @CRLF & _
"| http://znil.net/index.php?title=Zabbix:TaskSchedulerMonitoring" & @CRLF & _
"+------------------------------------------------------------------------------" & @CRLF
; ##########################################################################################################################
; ##########################################################################################################################
; ########################################
; ######## ## ## ## ## ###### ######## #### ####### ## ## ###### ########################################
; ## ## ## ### ## ## ## ## ## ## ## ### ## ## ## ########################################
; ## ## ## #### ## ## ## ## ## ## #### ## ## ########################################
; ###### ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ########################################
; ## ## ## ## #### ## ## ## ## ## ## #### ## ########################################
; ## ## ## ## ### ## ## ## ## ## ## ## ### ## ## ########################################
; ## ####### ## ## ###### ## #### ####### ## ## ###### ########################################
; ########################################
; ##########################################################################################################################
; ##########################################################################################################################
Func _schtasks($s_schtasksparameter)
Local $s_RunCommand
Local $outputschtasks
Local $errorsschtasks
Local $hschtasks
Local $ischtasksmaxWaitTime = 20000
Local $ischtasksmaxWaitTimeSTART
Local $s_tdoutReadFEHLER
; build the Command for run
;ConsoleWrite($s_schtasksexe & " " & $s_schtasksparameter & @CRLF)
$s_RunCommand = $s_schtasksexe & " " & $s_schtasksparameter
; Start the timer for max wait time
$ischtasksmaxWaitTimeSTART = TimerInit()
; run the Command
$hschtasks = Run($s_RunCommand, @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)
;get the output
Do
Sleep(5)
; get the output
$outputschtasks = $outputschtasks & StdoutRead($hschtasks)
; get the errors
$errorsschtasks = $errorsschtasks & StderrRead($hschtasks)
; did we have an error while reading?
$s_tdoutReadFEHLER = @error
If $s_tdoutReadFEHLER <> "" Then
; No error, go on
If $outputschtasks = "" Then
; but also no output, let us take a 2. try
$outputschtasks = $outputschtasks & StdoutRead($hschtasks)
If $outputschtasks = "" Then
; anymore no output, oh oh
If $s_tdoutReadFEHLER <> "" Then
; but we have an error message
ConsoleWriteError($errorsschtasks & @CRLF)
EndIf
EndIf
EndIf
EndIf
Until $s_tdoutReadFEHLER Or TimerDiff($ischtasksmaxWaitTimeSTART) > $ischtasksmaxWaitTime
;MsgBox(0,"",$outputschtasks)
Return $outputschtasks
EndFunc ;<== End _schtasks()
; ###################################################################################
; _ANSI2OEM löst das Problem mit dem Umlauten und anderen Sonderzeichen. Es wandelt Text so um das er korrekt in der DOS-Box dargestellt wird
; So können hier im Quellcode auch Umlaute verwendet werden (in den Textausgaben) und diese werden dann korrekt dargestellt
; Wir zudem für die Prüfung der Gruppenzugehörigkeit benötigt für Gruppen mit Umlauten, z.B. Domänen-Admins
; Dank an Xenobiologist von AutoIt.de für diese Lösung: http://www.autoit.de/index.php?page=Thread&threadID=9461&highlight=ANSI2OEM
Func _ANSI2OEM($text)
$text = DllCall('user32.dll', 'Int', 'CharToOem', 'str', $text, 'str', '')
Return $text[2]
;Return $text
EndFunc ;==>_ANSI2OEM
; ###################################################################################
; Hilfsroutine die den Hilfetext ausgibt
Func _HilfeAusgeben()
ConsoleWrite(_ANSI2OEM($s__Header))
ConsoleWrite(_ANSI2OEM($s__HilfeText))
EndFunc ;==>_HilfeAusgeben
; ##################################################################################################################
; ######## ### ######## ######## #### ## ## ###### ####### ## ## ########
; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## ##
; ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ##
; ## ## ## ######## ######## ## ### ## ## ## ## ## ## ######
; ## ######### ## ## ## ## ## ## ## ## ## ## ## #### ##
; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ##
; ####### ######## ## ## ######## ######## #### ## ## ####### ###### ####### ## ## ##
; ##################################################################################################################
Global $sZabbix_agentd_exe
Global $sZabbix_agentd_conf
Global $sZabbix_sender_exe
Global $sZabbix_Hostname
Global $sZabbix_Server
Global $iZabbix_Server_Port
Global $sZabbix_String2Send
Func _Zabbix_conf()
Dim $sRegTMP
Dim $iRegTMP = 0
Dim $iLoop
Dim $aRegTMP
Dim $aZabbix_config
Dim $sZabbix_config_file
Dim $a2temp
While 1
$iRegTMP = $iRegTMP + 1
$sRegTMP = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services", $iRegTMP)
If @error Then
ExitLoop
EndIf
$sRegTMP = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\" & $sRegTMP, "ImagePath")
If @error = 0 Then
If StringInStr($sRegTMP, "zabbix_agentd.exe") > 0 Then
;ConsoleWrite("Gefunden: " & $sRegTMP & @CRLF)
$aRegTMP = StringSplit($sRegTMP, '"')
;_ArrayDisplay($aRegTMP)
$sZabbix_agentd_exe = $aRegTMP[2]
$sZabbix_sender_exe = StringReplace($sZabbix_agentd_exe, "zabbix_agentd.exe", "zabbix_sender.exe")
$sZabbix_config_file = $aRegTMP[4]
$sZabbix_agentd_conf = $sZabbix_config_file
$aZabbix_config = FileReadToArray($sZabbix_config_file)
If @error = 0 Then
For $iLoop = 0 To (UBound($aZabbix_config) -1)
If StringLeft($aZabbix_config[$iLoop], StringLen("ServerActive=")) = "ServerActive=" Then
$sZabbix_Server = StringReplace($aZabbix_config[$iLoop], "ServerActive=", "")
$sZabbix_Server = StringReplace($sZabbix_Server, " ", "")
$a2temp = StringSplit($sZabbix_Server, ":")
If $a2temp[0] = 1 Then
$iZabbix_Server_Port = 10051
Else
$sZabbix_Server = $a2temp[1]
$iZabbix_Server_Port = $a2temp[2]
EndIf
EndIf
If StringLeft($aZabbix_config[$iLoop], StringLen("Hostname=")) = "Hostname=" Then
$sZabbix_Hostname = StringReplace($aZabbix_config[$iLoop], "Hostname=", "")
$sZabbix_Hostname = StringReplace($sZabbix_Hostname, " ", "")
EndIf
Next
Else
ConsoleWrite("File not found: " & $sZabbix_config_file & @CRLF)
Exit 1
EndIf
If FileExists($sZabbix_sender_exe) = 0 Then
ConsoleWrite("zabbix_sender.exe not found at: " & $sZabbix_sender_exe & @CRLF)
Exit 1
EndIf
EndIf
EndIf
WEnd
;~ ConsoleWrite("zabbix_agentd.exe: " & '"' & $sZabbix_agentd_exe & '"' & @CRLF)
;~ ConsoleWrite("zabbix_sender.exe: " & '"' & $sZabbix_sender_exe & '"' & @CRLF)
;~ ConsoleWrite("Hostname used in Zabbix: " & '"' & $sZabbix_Hostname & '"' & @CRLF)
;~ ConsoleWrite("IP(:Port) Zabbix Server: " & '"' & $sZabbix_Server & '"' & @CRLF)
EndFunc
; #############################################################################################################################################################################################################################################################################
; ###### ######## ## ## ######## ## ## ### ## ## ## ######## ## ## #### ######## ## ## ######## ### ######## ######## #### ## ## ###### ######## ## ## ######## ######## ########
; ## ## ## ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## ## ## ## ## ##
; ## ## #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ## ## ## ## ##
; ###### ###### ## ## ## ## ## ## ## ## ## ## ## ## ###### ## ## ## ## ## ######### ## ## ## ######## ######## ## ### ###### ###### ## ## ## ## ## ###### ########
; ## ## ## #### ## ## ## ## ######### ## ## ## ## ## ## ## ## ## ## ## ## ######### ## ## ## ## ## ## ## ## ## ## #### ## ## ## ## ##
; ## ## ## ## ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## ## ## ## ##
; ####### ###### ######## ## ## ######## ### ## ## ######## ####### ######## ####### ### ### #### ## ## ## ####### ######## ## ## ######## ######## #### ## ## ####### ###### ######## ## ## ######## ######## ## ##
; #############################################################################################################################################################################################################################################################################
Func _SendValue_with_Zabbix_Sender($sItemName, $sItemValue)
;ConsoleWrite('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -k " & '"' & $sItemName & '" -o "' & $sItemValue & '"' & @CRLF)
RunWait('"' & $sZabbix_sender_exe & '"' & " -c " & '"' & $sZabbix_agentd_conf & '"' & " -k " & '"' & $sItemName & '" -o "' & $sItemValue & '"', "", @SW_HIDE, $RUN_CREATE_NEW_CONSOLE)
EndFunc
; ####################################################################################################################
; ###### ######## ######## ### ## ## ######## ### ###### ## ## ######
; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
; ## ## ## ## ## ## ## ## ## ## ## ## ## ##
; ## #### ###### ## ## ## ## ## ## ## ## ###### ##### ######
; ## ## ## ## ######### ## ## ## ######### ## ## ## ##
; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
; ####### ###### ######## ## ## ## ######## ######## ## ## ## ###### ## ## ######
; ####################################################################################################################
Func _GetAllScheduledTasks()
Dim $s_lastTaskName = ""
; Get all scheduled Jobs
$s_temp1 = _schtasks("/query /FO CSV")
;ConsoleWrite($s_temp1 & @CRLF)
$s_temp1 = StringReplace($s_temp1, @CRLF, "@CRLF")
$a_temp1 = StringSplit($s_temp1, "@CRLF", 1)
; _ArrayDisplay($a_temp1)
For $i = 2 To $a_temp1[0] ; Skip the first line with headlines
;_ArrayDisplay($a_temp1)
$b_IgnoreTask = False
;~ If StringLeft($a_temp1[$i], StringLen('"\Microsoft')) = '"\Microsoft' Then
;~ ExitLoop
;~ EndIf
If StringLeft($a_temp1[$i], 2) = '"\' Then
$a_temp2 = StringSplit($a_temp1[$i],",")
If $a_temp2[0] > 1 Then
$s_OriginalTaskName = StringTrimLeft(StringReplace($a_temp2[1], '"', "") ,1)
$s_CleanTaskName = StringTrimLeft(StringReplace($a_temp2[1], " ", "_") ,1)
$s_CleanTaskName = StringRegExpReplace($s_CleanTaskName, "[^\w\.@-]", "")
If $a_Task2Ignore[0] > 0 Then
For $j = 1 To $a_Task2Ignore[0]
;MsgBox(0,"","$s_OriginalTaskName" & @CRLF & $a_Task2Ignore[$j] & @CRLF & @CRLF & $s_CleanTaskName & @CRLF & $a_Task2Ignore[$j])
If StringInStr($s_OriginalTaskName, $a_Task2Ignore[$j]) > 0 Then
$b_IgnoreTask = True
EndIf
If StringInStr($s_CleanTaskName, $a_Task2Ignore[$j]) > 0 Then
$b_IgnoreTask = True
EndIf
Next
EndIf
If $s_lastTaskName = $s_OriginalTaskName Then
$b_IgnoreTask = True
EndIf
If $b_IgnoreTask = False Then
$a_ScheduledTasks[0][0] = $a_ScheduledTasks[0][0] + 1
ReDim $a_ScheduledTasks[ $a_ScheduledTasks[0][0] + 1 ][8]
; [x][1] = Name des Task "original"
$a_ScheduledTasks[ $a_ScheduledTasks[0][0] ][1] = $s_OriginalTaskName
$s_lastTaskName = $s_OriginalTaskName
; [x][2] = Name des Tasks "bereinigt" - ohne Leerzeichen/Sonderzeichen zur Anzeige in Zabbix und zur Übergabe an dieses Programm hier
$a_ScheduledTasks[ $a_ScheduledTasks[0][0] ][2] = $s_CleanTaskName
EndIf
EndIf
Else
; Er beginnt in Zeile 2 nach geplanten Aufgaben zu suchen. Diese Fangen mit "\ an.
; Gibt es keine Aufgaben wird da wieder eine Kopfzeile mit den Feldbezeichnungen kommen für den nächsten Abschnitt
; Und damit sind wir schon hier und verlassen die Schleife
ExitLoop
EndIf
Next
EndFunc
; ##########################################################################################################################
; ##########################################################################################################################
; ####################################################################################
; ## ## ### #### ## ## ####################################################################################
; ### ### ## ## ## ### ## ####################################################################################
; #### #### ## ## ## #### ## ####################################################################################
; ## ### ## ## ## ## ## ## ## ####################################################################################
; ## ## ######### ## ## #### ####################################################################################
; ## ## ## ## ## ## ### ####################################################################################
; ## ## ## ## #### ## ## ####################################################################################
; ####################################################################################
; ##########################################################################################################################
; ##########################################################################################################################
$iStartTime = _DateDiff("s", "1970/01/01 00:00:00", _NowCalc())
If $CmdLine[0] > 0 Then
If $CmdLine[1] = "/?" Or $CmdLine[1] = "-?" Then
_HilfeAusgeben()
Exit 0
EndIf
EndIf
;~ If $CmdLine[0] = 0 Then
;~ _HilfeAusgeben()
;~ Exit 0
;~ EndIf
; Ok, we need the schtasks.exe,
$s_schtasksexe = @ComSpec & " /C " & @WindowsDir & "\system32\schtasks.exe"
$a_ScheduledTasks[0][0] = 0
$a_ScheduledTasks[0][1] = "Original Name"
$a_ScheduledTasks[0][2] = "Clean Name"
$a_ScheduledTasks[0][3] = "Last Result"
$a_ScheduledTasks[0][4] = "Last Run Time"
$a_ScheduledTasks[0][5] = "Next Run Time"
$a_ScheduledTasks[0][6] = "Run As User"
$a_ScheduledTasks[0][7] = "Task To Run"
; ##########################################################################################################################
; ##########################################################################################################################
; Some of the services are irritating, just ignore them - read items from a file
If FileExists($s_Task2IgnoreFile) = 1 Then
$h_Task2IgnoreFile = FileOpen($s_Task2IgnoreFile, 0)
While 1
$s_temp1 = FileReadLine($h_Task2IgnoreFile)
If @error = -1 Then
ExitLoop
Else
If StringLen($s_temp1) > 2 Then ; at least 3 or more chars
$a_Task2Ignore[0] = $a_Task2Ignore[0] + 1
ReDim $a_Task2Ignore[$a_Task2Ignore[0] + 1] ;That's AutoIt - Redim an Array without data-loss
$a_Task2Ignore[$a_Task2Ignore[0]] = $s_temp1
EndIf
EndIf
WEnd
EndIf
;_ArrayDisplay($a_Task2Ignore)
If $CmdLine[1] = "discovertasks" Then
;If "discovertasks" = "discovertasks" Then
_GetAllScheduledTasks()
$s_JSONOutput = '{"data":[' & @CRLF
For $i = 1 To $a_ScheduledTasks[0][0]
$s_JSONOutput = $s_JSONOutput & " " & '{' & '@CRLF' & _
" " & '"{#TSMTASKNAME}":"' & $a_ScheduledTasks[$i][2] & '"' & '@CRLF' & _
" " & '},' & '@CRLF'
Next
$s_JSONOutput = StringTrimRight($s_JSONOutput, StringLen("," & "@CRLF")) & @CRLF & " " & ']' & @CRLF & '}'
$s_JSONOutput = StringReplace($s_JSONOutput, "@CRLF", @CRLF)
If StringLen($s_JSONOutput) < 11 Then
ConsoleWrite('{"data":[]}' & @CRLF)
Else
ConsoleWrite(_ANSI2OEM($s_JSONOutput))
EndIf
Exit 0
EndIf
If $CmdLine[1] = "query" And $CmdLine[0] > 1 Then
_GetAllScheduledTasks()
$s_QueryTaskName = ""
$i_ThisTask = 0
If $a_ScheduledTasks[0][0] > 0 Then
For $i = 1 To $a_ScheduledTasks[0][0]
If $CmdLine[2] = $a_ScheduledTasks[$i][2] Then
$s_QueryTaskName = $a_ScheduledTasks[$i][1]
$i_ThisTask = $i
EndIf
Next
EndIf
If $s_QueryTaskName = "" Then
ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
Exit 0
EndIf
$s_temp1 = _schtasks("/QUERY /FO CSV /V /TN " & '"' & $s_QueryTaskName & '"')
;ConsoleWrite($s_temp1 & @CRLF)
$s_temp1 = StringReplace($s_temp1, @CRLF, "@CRLF")
$a_temp1 = StringSplit($s_temp1, "@CRLF", 1)
If $a_temp1[0] < 2 Then
ConsoleWrite("ZBX_SUPPORTED" & @CRLF)
Exit 0
EndIf
$a_temp2 = StringSplit($a_temp1[2],",")
;_ArrayDisplay($a_temp2)
If $a_temp2[0] > 1 Then
;_ArrayDisplay($a_temp2)
;Last Result
$a_ScheduledTasks[$i_ThisTask][3] = StringReplace($a_temp2[7], '"', "")
;Last Run Time
; Mögliche Werte zum Beispiel: "18.04.2015 01:00:00" oder "04/14/2015 01:00:00" oder "n/a"' oder "Nicht zutreffend"
If StringRegExp($a_temp2[6], '\d+') = 1 Then ; String enthält mindestens eine Zahl
If StringInStr($a_temp2[6], "/") > 0 Then
$a_temp1 = StringSplit(StringReplace($a_temp2[6], '"', ""), "/ ", 0)
; $a_temp1[1] = MM
; $a_temp1[2] = DD
; $a_temp1[3] = YYYY
; $a_temp1[4] = HH:MM:SS
;Input Start date in the format "YYYY/MM/DD[ HH:MM:SS]"
$a_ScheduledTasks[$i_ThisTask][4] = _DateDiff("s", "1970/01/01 00:00:00", $a_temp1[3] & "/" & $a_temp1[1] & "/" & $a_temp1[2] & " " & $a_temp1[4])
Else
$a_temp1 = StringSplit(StringReplace($a_temp2[6], '"', ""), ". ", 0)
; $a_temp1[1] = DD
; $a_temp1[2] = MM
; $a_temp1[3] = YYYY
; $a_temp1[4] = HH:MM:SS
;Input Start date in the format "YYYY/MM/DD[ HH:MM:SS]"
$a_ScheduledTasks[$i_ThisTask][4] = _DateDiff("s", "1970/01/01 00:00:00", $a_temp1[3] & "/" & $a_temp1[2] & "/" & $a_temp1[1] & " " & $a_temp1[4])
EndIf
Else
$a_ScheduledTasks[$i_ThisTask][4] = "ZBX_NOTSUPPORTED"
EndIf
; Next Run Time
; Mögliche Werte zum Beispiel: "18.04.2015 01:00:00" oder "04/14/2015 01:00:00" oder "n/a"' oder "Nicht zutreffend"
If StringRegExp($a_temp2[3], '\d+') = 1 Then ; String enthält mindestens eine Zahl
If StringInStr($a_temp2[3], "/") > 0 Then
$a_temp1 = StringSplit(StringReplace($a_temp2[3], '"', ""), "/ ", 0)
; $a_temp1[1] = MM
; $a_temp1[2] = DD
; $a_temp1[3] = YYYY
; $a_temp1[4] = HH:MM:SS
;Input Start date in the format "YYYY/MM/DD[ HH:MM:SS]"
$a_ScheduledTasks[$i_ThisTask][5] = _DateDiff("s", "1970/01/01 00:00:00", $a_temp1[3] & "/" & $a_temp1[1] & "/" & $a_temp1[2] & " " & $a_temp1[4])
Else
$a_temp1 = StringSplit(StringReplace($a_temp2[3], '"', ""), ". ", 0)
; $a_temp1[1] = DD
; $a_temp1[2] = MM
; $a_temp1[3] = YYYY
; $a_temp1[4] = HH:MM:SS
;Input Start date in the format "YYYY/MM/DD[ HH:MM:SS]"
$a_ScheduledTasks[$i_ThisTask][5] = _DateDiff("s", "1970/01/01 00:00:00", $a_temp1[3] & "/" & $a_temp1[2] & "/" & $a_temp1[1] & " " & $a_temp1[4])
EndIf
Else
$a_ScheduledTasks[$i_ThisTask][5] = "ZBX_NOTSUPPORTED"
EndIf
; Run As User
$a_ScheduledTasks[$i_ThisTask][6] = StringReplace($a_temp2[8], '"', "")
; Task To Run
$a_ScheduledTasks[$i_ThisTask][7] = StringReplace($a_temp2[9], '"', "")
Else
ConsoleWrite("ZBX_SUPPORTED" & @CRLF)
Exit 0
EndIf
_Zabbix_conf()
;_ArrayDisplay($a_ScheduledTasks)
;$a_ScheduledTasks[0][8] ; [0][0] = Anzahl der Tasks
; [x][1] = Name des Task "original"
; [x][2] = Name des Tasks "bereinigt" - ohne Leerzeichen/Sonderzeichen zur Anzeige in Zabbix und zur Übergabe an dieses Programm hier
; [x][3] = Last Result
; [x][4] = Last Run Time
; [x][5] = Next Run Time
; [x][6] = Run As User
; [x][7] = Task To Run
_SendValue_with_Zabbix_Sender("znil.TaskSchedulerMonitoring[LastResult," & $a_ScheduledTasks[$i_ThisTask][2] & "]", $a_ScheduledTasks[$i_ThisTask][3])
_SendValue_with_Zabbix_Sender("znil.TaskSchedulerMonitoring[LastRunTime," & $a_ScheduledTasks[$i_ThisTask][2] & "]", $a_ScheduledTasks[$i_ThisTask][4])
_SendValue_with_Zabbix_Sender("znil.TaskSchedulerMonitoring[NextRunTime," & $a_ScheduledTasks[$i_ThisTask][2] & "]", $a_ScheduledTasks[$i_ThisTask][5])
_SendValue_with_Zabbix_Sender("znil.TaskSchedulerMonitoring[RunAsUser," & $a_ScheduledTasks[$i_ThisTask][2] & "]", $a_ScheduledTasks[$i_ThisTask][6])
$iRunTime = _DateDiff("s", "1970/01/01 00:00:00", _NowCalc()) - $iStartTime
ConsoleWrite($iRunTime & @CRLF)
Exit 0
Else
ConsoleWrite("ERROR - Option 'query' without Parameter - see /? vor Help")
EndIf
Exit 0