Aktionen

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


1 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




2 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




3 Screenshots

Discovery Prototypen:
Zabbix-TaskScheduler-002.png

Beispiel aus Latest Data:
Zabbix-TaskScheduler-001.png



4 Installation

  • Kopiert die TaskSchedulerMonitoring.exe und die TaskSchedulerMonitoring-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.



5 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.



6 Anpassung Trigger

Es gibt einen Trigger-Prototypen der Auslöst wenn das letzte Ergebnis des Tasks

  • NICHT 0
  • NICHT 267009
  • NICHT 1

ist.

Zabbix-TaskScheduler-003.png

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.



7 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

8 Kommentare


Sven

24 Monaten zuvor
Punktzahl 0++

Hallo Herr Linz,

schönes Template, hat mir weitergeholfen.

Artur

18 Monaten zuvor
Punktzahl 0++

I ran the test at the command prompt (cmd): TaskSchedulerMonitoring.exe query TaskName I have a windows box with the error: line 6596 (file "c: \ .... TaskShedulerMonitoring.exe") error: Array variable has incorrect number of subscripts or subscripts dimension range exceeded

the comand: TaskSchedulerMonitoring.exe Discovertasks works.

Hans

15 Monaten zuvor
Punktzahl 0++

Strange behaviour. When I run the command for a task that has never run before I get a value. If I run it for a task that has run before I get the same error as posted by Artur: A windows error box with saying: Line 6596 (File "C:\....\TaskSchedulerMonitoring.exe"): Error: Array variable has incorrect number of subscripts or subscripts dimension range exceeded.

I'm running this on a Windows Server 2012 R2

Willem

11 Monaten zuvor
Punktzahl 0++

Can Confirm, when you run

.\TaskSchedulerMonitoring.exe query AzureBackup2NAS

in powershell i also get the error

mir@tonisch.de

9 Monaten zuvor
Punktzahl 0++

Hi,

danke für das Script. Allerdings haben wir unsere Aufgaben innerhalb der Aufgabenplanung in Ordnern aufgeteilt. Zu diesem Zweck musste das "ExitLoop" in Zeile 343 weichen... Vielleicht laufen ja andere Leute in diese Problematik.

mir@tonisch.de

9 Monaten zuvor
Punktzahl 0++

Hi, Irgendwie stelle ich mich mit der Compillierung des Scripts an. Nachdem ich wie oben beschrieben die Zeile 343 auskommentiert habe, läuft das Script nach dem Compile nicht mehr. Haben Sie dafür einen Tipp für mich? Oder können mir alternativ die veränderte Version zuschicken?

Vielen Dank!

BLinz

9 Monaten zuvor
Punktzahl 0++
Naja, wahrscheinlich kommt er nicht raus aus der Schleife - oder es dauert so lange weil er dann sämtliche Unterjobs (sind ein paar hundert unter Windows) mit nimmt.

herr huret

5 Monaten zuvor
Punktzahl 0++

Hi, Does this script works with Zabbix 3.0 ? Does it works too with a french Windows ?

dhuret@sfr.fr

Tank You

BLinz

5 Monaten zuvor
Punktzahl 0++

The Tool ist using this command: schtasks.exe /query /FO CSV and kann work with Date/Time Information written in English spelling mm/dd/yyyy and German spelling dd.mm.yyyy

Check the Output of the command

Meet Jethwa

2 Monaten zuvor
Punktzahl 0++

After i make changes in the conf file of the agent and then try restarting the zabbix agent it wont restart . what is the exact line to be included in the agent conf file .

Please help trying this since a week .

Meet

2 Monaten zuvor
Punktzahl 0++
Now i am getting an error item does not allow parameters .

BLinz

2 Monaten zuvor
Punktzahl 0++

Don't change anything at Template. Have you added the UserParameter with correct paths? Check the Output of

TaskSchedulerMonitoring.exe discovertasks

Rama Krishna

einem Monat zuvor
Punktzahl 0++

Hi, We were able to execute TaskSchedulerMonitoring.exe discovertasks. Can you please let us know how to execute a particular job.

We are getting the below error: 2508:20171010:224837.343 EXECUTE_STR() command:'"C:\Program Files\Zabbix\UserParameter\TaskSchedulerMonitoring.exe" "LastResult" "Mon-Fri_9pm_Scan" "" ""' len:58 cmd_result:'ERROR - Option 'quer' 2508:20171010:224837.343 Sending back [ERROR - Option 'query' without Parameter - see /? vor Help] 2504:20171010:224837.389 Requested [net.if.in[WAN Miniport (IPv6)]] 2504:20171010:224837.389 Sending back [0] 2496:20171010:224838.046 In collect_perfstat() 2512:20171010:224838.046 In send_buffer() host:'XX.XX.XX.XX' port:10051 entries:0/100 2512:20171010:224838.046 End of send_buffer():SUCCEED 2496:20171010:224838.046 End of collect_perfstat()

Thanks,

Rama Krishna

einem Monat zuvor
Punktzahl 0++

Hi We are able to execute the discovertasks command. But we are getting error while trying to execute a particular job from the command line. We tried to use the below command - TaskSchedulerMonitoring.exe query FSBackup

Can you please let us know the correct command to be used while working with a single task (i.e., we do not need to monitor all the jobs in tasks scheduler- we only need to monitor a singe job).

Thanks

BLinz

einem Monat zuvor
Punktzahl 0++

Can you see your job at the discovertasks output? Use 2. Parameter "query" and 3. Parameter "Excat Name of Task how discovertask display it"

this will send the data direct to Zabbix server. There must be a installed Zabbix Agent hat host with zabbix_sender.exe in the same folder of zabbix_agentd.exe.

The Parameter "Hostname" must be set in the Agent Config file!

Jayavardhan

einem Monat zuvor
Punktzahl 0++

Hello, How do i confirm that Zabbix Trapper discovery items are working properly. Because I could not see those values either in zabbix server logs or zabbix proxy logs. Zabbix UI is reporting the error as "Received value [ERROR - Option 'query' without Parameter - see /? vor Help] is not suitable for value type [Numeric (unsigned)] and data type [Decimal]" I can conform that setup was done properly as per the instructions provided. As of now am only getting data for Query discovery item prototype for all the discovered tasks. Any advice / guidelines to check further for permanent fix of this problem. It would be great if you provide us an example about how to check zabbix trapper Items result via command line either agent host or else from zabbix server. Regards,

Jay

BLinz

einem Monat zuvor
Punktzahl 0++
have your Task spaces in Name?

alpha.zhu@nexteer.com

einem Monat zuvor
Punktzahl 0++

hi sir I can get the value with the command as below in the client server , but the zabbix server can not get the value from the client server through the view of the latest data C:\zabbix>TaskSchedulerMonitoring.exe discovertasks {"data":[ { "{#TSMTASKNAME}":"Adobe_Acrobat_Update_Task" }, { "{#TSMTASKNAME}":"restart_ddmi" } ]

}

BLinz

einem Monat zuvor
Punktzahl 0++

Did you try a zabbix_agentd.exe test local at windows host?

https://znil…_Commandline

alpha.zhu@nexteer.com

einem Monat zuvor
Punktzahl 0++

hi Blinz I run the zabbix_agentd.exe in the commandline , and get the following output , I do not know where is not correct? C:\zabbix>zabbix_agentd.exe -c zabbix_agentd.win.conf -t znil.TaskSchedulerMonit oring[discovertasks] znil.TaskSchedulerMonitoring[discovertasks] [t|{"data":[ { "{#TSMTASKNAME}":"Adobe_Acrobat_Update_Task" }, { "{#TSMTASKNAME}":"restart_ddmi" } ] }]

Here is configuration for the zabbix config file LogFile=c:\zabbix\zabbix_agentd.log Server=10.243.16.78 ServerActive= 10.243.16.231 Hostname=10.243.16.231 EnableRemoteCommands=1 UnsafeUserParameters=1

UserParameter=znil.TaskSchedulerMonitoring[*],"C:\zabbix\TaskSchedulerMonitoring.exe" "$1" "$2" "$3" "$4"
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.