Zabbix:Template BackupExec 2012 Jobs: Unterschied zwischen den Versionen
Aus znilwiki
BLinz2 (Diskussion | Beiträge) K (Textersetzung - „<comments>“ durch „<comments />“) |
(kein Unterschied)
|
Aktuelle Version vom 6. August 2017, 19:52 Uhr
Changelog:
- 25.04.2014: Erste Öffentliche Version 0.0.0.40
- 29.01.2015: Version 0.0.0.42 unterstützt auch BackupExec 2014
- 20.02.2015: Version 0.0.0.43 kann nun auch wirklich gleichzeitig 2014 und 2012
- 13.05.2015: Version 0.0.0.45 kann auch mit BackupExec 15 umgehen
- 13.09.2016: Version 1.0.0.7 (BETA Version) sollte pauschal mit allen BackupExec Versionen mit PowerShell umgehen können
Bekannte Fehler:
- Der Zabbix Agent wird mit SYSTEM-Rechten ausgeführt. Die Abfrage von BackupExec 2012 erfolgt über die BEMCLI, das ist die PowerShell Erweiterung zu BackupExec 2012. In der Praxis bedeutet dies, das eine PowerShell gestartet wird, diese die BackupExec Erweiterungen nachlädt und dann die eigentlichen Abfragen durchführt. Die Erweiterungen werden über PowerShell-Scripts (.ps1) geladen. Und bei deren Ausführung zickt Windows gerne rum wenn diese z.B. nicht signiert sind. Beim Programmieren musste ich leider mehrmals feststellen das es hakte. Deshalb führt mein Programm bei der Abfrage ein
Set-ExecutionPolicy Bypass
aus. DAMIT WERDEN ALLE POWERSHELL-SCRIPTE OHNE ÜBERPRÜFUNG DER SIGNATUR AUSGEFÜHRT. DIESE EINSTELLUNG IST FÜR DEN SERVER GGF. DAUERHAFT FÜR ALLE SCRIPTE
Download
Download: ZabbixTemplateBackupExec2012.zip Version 0.0.0.43 mit BackupExec 2014 Unterstützung
Download BETA: ZabbixTemplateBackupExecPS.zip Version 1.0.0.7 mit BackupExec PS Unterstützung
Vorwort
Nachdem ich so etwas für BackupExec 2010 geschrieben hatte fehlte noch das Gegenstück für BackupExec 2012. Hier gibt es keine bemcmd.exe
sondern die BEMCLI
wird genutzt.
Dabei handelt es sich um eine PowerShell Erweiterung.
Die aktuelle Version sollte mit BackupExec 2014 und BackupExec 15 auch umgehen können.
Screenshots / Bilder
Funktionsweise
Wie funktioniert es?
Die BackupExec2012.exe
wird vom Zabbix Agenten auf dem jeweiligen Server aufgerufen.
Die .exe ermittelt in der Registry den Installationspfad von BackupExec 2012 und sucht darüber den Pfad zur PowerShell-Erweiterung BEMCLI
Diese wird von der BackupExec2012.exe aufgerufen und kennt verschiedene Parameter:
discoverjobs : Erzeugt eine Liste im JSON Format über alle Backup-Aufträge die wiederkehrend geplant oder gerade aktiv sind. Die nachfolgenden Parameter erwarten als 2. Parameter die Job Id! jobstatus : Gibt den Status des letzen Backup-Auftrages zurück. Rückgabewert ist Text jobhowlongago : Gibt die Zeit in Sekunden zurück die seit dem letzen Start des Auftrages vergangen sind. Mit einem Trigger läßt sich so abfangen das ein Auftrag nicht mehr wie geplant angelaufen ist. jobbytes : Gibt die gesamte gesicherte Datenmenge in Bytes zurück jobruntime : Gibt die Laufzeit des Backup-Auftrages in Sekunden zurück jobPercentComplete : In Prozent wieviel gesichert wurde, 0 bis 100 möglich jobErrorCode : Gibt den letzten Fehlercode zurück (scheinbar immer 0) jobErrorCategory : Ist bei einem Fehler nicht 0, mögliche Werte noch unbekannt
Damit könnt Ihr das ganze zuvor einmal auf der Kommandozeile / DOS-Box testen.
Template
Im Zip-Archiv findet Ihr neben der BackupExec2012.exe
auch das Template in Deutsch.
Die deutschen Versionen findet Ihr nach dem Import in der Hostgruppe 'Templates znil.net' mit den Namen
znil Template BackupExec 2012 Auftragsueberwachung ACTIVE AGENT
Also nur eine Active Agent Version - paasiv müsstet ihr eben selbst daraus bauen bei Bedarf
Darin sind NUR die Items - keine Trigger - die müsst ihr euch selbst anlegen. Als Hilfe dafür habe ich z.B. die Rückgabewerte gebaut wie lange der letzte Start her ist. Damit lässt sich indirekt erkennen wenn z.B,. ein Job hängt (wenn er z.B. mehr als 25h nicht neu gestartet wurde) etc.
Rückgabewerte "letzter Status"
Folgende Rückgabewerte sind bei "letzter Status" möglich:
Unknown Canceled Completed SucceededWithExceptions OnHold Error Missed Recovered Resumed Succeeded ThresholdAbort Dispatched DispatchFailed InvalidSchedule InvalidTimeWindow NotInTimeWindow Queued Disabled Active Ready Scheduled Superseded ToBeScheduled Linked RuleBlocked
In der Praxis einige wie "Queued" oder "Scheduled" eher nicht da meine Funktion den letzten Rückgabewert des letzten Auftrages/Jobs zurück liefert, nicht zukünftiger oder gerade laufender Aufträge.
Download
Download: ZabbixTemplateBackupExec2012.zip Version 0.0.0.45
Installation
Zur Installation müsst Ihr folgendes tun:
- Kopiert die
BackupExec2012.exe
in das Verzeichnis in dem auch schon der Zabbix-Agent ist, z.B.
C:\Program Files\Zabbix
- Tragt in die Agenten-Konfigurationsdatei, in der Regel ist das die
zabbix_agentd.win.conf
die Zeile
UserParameter=znil.BackupExec2012[*],"C:\Program Files\Zabbix\BackupExec2012.exe" $1 "$2"
ein - Pfad natürlich ggf. anpassen
- Startet des Zabbix Agenten Dienst neu
net stop "zabbix agent" net start "zabbix agent"
- Import eine der
.XML
Dateien in Zabbix und verknüpft diese mit dem Host. - Warten! Alle 3600 Sekunden = 1 Stunde wird die Abfrage gestartet.
- Da erst die Aufträge gefunden werden und dann daurch die Items angelegt werden dauert es eine Weile bis der Agent davon weis.
- Als Beschleunigung: Nachdem Ihr in Zabbix die Items sehen könnt startet den AGenten auf dem Server noch einmal neu. Wen Ihr noch einen Proxy dazwischen habt müsst ihr den Dienst auf diesen auch einmal neu starten ... oder einfach abwarten!
Quellcode
Hier noch für Interessierte der Quellcode der BackupExec2012.exe
:
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icon256-32.ico
#AutoIt3Wrapper_Outfile=BackupExec2014.exe
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Description=Zabbix Available Windows Updates
#AutoIt3Wrapper_Res_Fileversion=0.0.0.46
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=2014 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:Template_BackupExec_2014_Jobs
#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 ************
; ##########################################################################################################################
; ##########################################################################################################################
; # backupexec2014.exe --> Tool for Check BackupJobs in Zabbix #
; # 2014 Bernhard Linz / Bernhard@znil.de / http://znil.net #
; # Idea and Original at Zabbix Wiki #
; # #
; # Latest Version of this Program and Template in German: #
; # http://znil.net/index.php?title=Zabbix:Template_BackupExec_2014_Jobs #
; # #
; # ________ .__ __. __ __ .__ __. _______ .___________. #
; # | / | \ | | | | | | | \ | | | ____|| | #
; # `---/ / | \| | | | | | | \| | | |__ `---| |----` #
; # / / | . ` | | | | | | . ` | | __| | | #
; # / /----.| |\ | | | | `----.__| |\ | | |____ | | #
; # /________||__| \__| |__| |_______(__)__| \__| |_______| |__| #
; # #
; ##########################################################################################################################
; ##########################################################################################################################
; find the 'BEMCLI.exe' - take a look at Registry of Host
Dim $SoftwareBasePaths[9] = ["HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Symantec Backup Exec 14.2", _
"HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Symantec Backup Exec 14.2", _
"HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Symantec Backup Exec 14.2", _
"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Symantec Backup Exec 14.1", _
"HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Symantec Backup Exec 14.1", _
"HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Symantec Backup Exec 14.1", _
"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Symantec Backup Exec 14.0", _
"HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Symantec Backup Exec 14.0", _
"HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Symantec Backup Exec 14.0"]
Global $bemcli
Dim $aparameter[4]
;$aparameter[0] = "Get-BEJob -JobType Backup -Status Scheduled,Active | select-object -property *" ; get a List of scheduled and active jobs
$aparameter[0] = "Get-BEJob -JobType Backup,Duplicate -Status Scheduled,Active,Linked | select-object -property *" ; get a List of scheduled and active jobs
$aparameter[1] = "Get-BEJob -JobType Duplicate -Status Linked | select-object -property *" ; get a list of Duplicate Jobs
$aparameter[2] = '-o21 -e -j"Name of Job"' ; get last Exit-Code of a specific job by Name
$aparameter[3] = 'Get-BEJob -Id {ID of Job} | Get-BEJobHistory -FromLastJobRun | select-object -property *' ; get last Exit-Code of a specific job by ID
Dim $stemp
Dim $atemp
Dim $aatemp
Dim $aDateTemp
Dim $aRuntimeTemp
Dim $aBackupJobs_byName[1] = [ 0 ]
Dim $aBackupJobs_byID[1] = [ 0 ]
Dim $aBackupJobs_Selection[1] = [ 0 ]
Dim $s_JSONOutput
Dim $sRunCommand
Dim $sJobStatus
Dim $iJobStatus
Dim $iJobhowlongago
Dim $iJobBytes
Dim $iJobRuntime
Dim $iJobPercentComplete
Dim $iJobErrorCode
; Ok, we need the BEMCLI Extension for PowerShell, just find the BackupExec Installation Folder
; we take 3 try - depends of we are a 32 or 64 bit exe and if we run on a 32 or 64 bit system
$bemcli = RegRead($SoftwareBasePaths[0], "InstallLocation")
If $bemcli = "" Then
$bemcli = RegRead($SoftwareBasePaths[1], "InstallLocation")
If $bemcli = "" Then
$bemcli = RegRead($SoftwareBasePaths[2], "InstallLocation")
If $bemcli = "" Then
$bemcli = RegRead($SoftwareBasePaths[3], "InstallLocation")
If $bemcli = "" Then
$bemcli = RegRead($SoftwareBasePaths[4], "InstallLocation")
If $bemcli = "" Then
$bemcli = RegRead($SoftwareBasePaths[5], "InstallLocation")
If $bemcli = "" Then
$bemcli = RegRead($SoftwareBasePaths[6], "InstallLocation")
If $bemcli = "" Then
$bemcli = RegRead($SoftwareBasePaths[7], "InstallLocation")
If $bemcli = "" Then
$bemcli = RegRead($SoftwareBasePaths[8], "InstallLocation")
If $bemcli = "" Then
ConsoleWriteError("Error, no installed BackupExec 2012/2014 found" & @CRLF)
Exit 1
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
$bemcli = "Import-Module '" & $bemcli & "Modules\BEMCLI\BEMCLI'"
; ##########################################################################################################################
; ##########################################################################################################################
; ########################################
; ######## ## ## ## ## ###### ######## #### ####### ## ## ###### ########################################
; ## ## ## ### ## ## ## ## ## ## ## ### ## ## ## ########################################
; ## ## ## #### ## ## ## ## ## ## #### ## ## ########################################
; ###### ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ########################################
; ## ## ## ## #### ## ## ## ## ## ## #### ## ########################################
; ## ## ## ## ### ## ## ## ## ## ## ## ### ## ## ########################################
; ## ####### ## ## ###### ## #### ####### ## ## ###### ########################################
; ########################################
; ##########################################################################################################################
; ##########################################################################################################################
Func _BEMCLI($sbemparameter)
Local $sRunCommand
Local $outputBEMCLI
Local $errorsBEMCLI
Local $hBEMCLI
Local $iBEMCLImaxWaitTime = 20000
Local $iBEMCLImaxWaitTimeSTART
Local $stdoutReadFEHLER
; build the Command for run
$sRunCommand = $bemcli & " ; " & $sbemparameter
; Start the timer for max wait time
$iBEMCLImaxWaitTimeSTART = TimerInit()
; run the Command
;ConsoleWrite('powershell.exe Set-ExecutionPolicy Bypass ; "' & $sRunCommand & '"' & @CRLF)
$hBEMCLI = Run('powershell.exe Set-ExecutionPolicy Bypass ; "' & $sRunCommand & '"', @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)
StdinWrite($hBEMCLI, @CRLF)
StdinWrite($hBEMCLI)
;get the output
Do
;Sleep(5)
; get the output
$outputBEMCLI = $outputBEMCLI & StdoutRead($hBEMCLI)
; get the errors
$errorsBEMCLI = $errorsBEMCLI & StderrRead($hBEMCLI)
; did we have an error while reading?
$stdoutReadFEHLER = @error
If $stdoutReadFEHLER <> "" Then
; No error, go on
If $outputBEMCLI = "" Then
; but also no output, let us take a 2. try
$outputBEMCLI = $outputBEMCLI & StdoutRead($hBEMCLI)
If $outputBEMCLI = "" Then
; anymore no output, oh oh
If $stdoutReadFEHLER <> "" Then
; but we have an error message
Return $errorsBEMCLI
EndIf
EndIf
EndIf
EndIf
Until $stdoutReadFEHLER Or TimerDiff($iBEMCLImaxWaitTimeSTART) > $iBEMCLImaxWaitTime
;MsgBox(0,"",$outputBEMCLI)
Return $outputBEMCLI
EndFunc ;<== End _BEMCLI()
; ##########################################################################################################################
; ##########################################################################################################################
; ####################################################################################
; ## ## ### #### ## ## ####################################################################################
; ### ### ## ## ## ### ## ####################################################################################
; #### #### ## ## ## #### ## ####################################################################################
; ## ### ## ## ## ## ## ## ## ####################################################################################
; ## ## ######### ## ## #### ####################################################################################
; ## ## ## ## ## ## ### ####################################################################################
; ## ## ## ## #### ## ## ####################################################################################
; ####################################################################################
; ##########################################################################################################################
; ##########################################################################################################################
If StringInStr($CmdLineRaw, "discoverjobs") > 0 Then
Dim $s_JSONOutput
; Get all scheduled and active Jobs
$stemp = _BEMCLI($aparameter[0])
$atemp = StringSplit($stemp, @CRLF)
For $i = 1 To $atemp[0]
If StringLeft($atemp[$i],StringLen("Id")) = "Id" Then
$aatemp = StringSplit($atemp[$i],' : ', 1)
_ArrayAdd($aBackupJobs_byID, $aatemp[$aatemp[0]])
$aBackupJobs_byID[0] = $aBackupJobs_byID[0] + 1
EndIf
If StringLeft($atemp[$i],StringLen("Name")) = "Name" Then
$aatemp = StringSplit($atemp[$i],' : ', 1)
_ArrayAdd($aBackupJobs_byName, $aatemp[$aatemp[0]])
$aBackupJobs_byName[0] = $aBackupJobs_byName[0] + 1
EndIf
If StringLeft($atemp[$i],StringLen("SelectionSummary")) = "SelectionSummary" Then
$aatemp = StringSplit($atemp[$i],' : ', 1)
_ArrayAdd($aBackupJobs_Selection, $aatemp[$aatemp[0]])
$aBackupJobs_Selection[0] = $aBackupJobs_Selection[0] + 1
EndIf
Next
$s_JSONOutput = '{"data":['
For $i = 1 To $aBackupJobs_byName[0]
$s_JSONOutput = $s_JSONOutput & @CRLF
$s_JSONOutput = $s_JSONOutput & " " & '{' & @CRLF
$s_JSONOutput = $s_JSONOutput & " " & '"{#BACKUPEXECJOB}":"' & $aBackupJobs_byName[$i] & '",' & @CRLF
$s_JSONOutput = $s_JSONOutput & " " & '"{#BACKUPEXECID}":"' & $aBackupJobs_byID[$i] & '",' & @CRLF
;$s_JSONOutput = $s_JSONOutput & " " & '"{#BACKUPEXECSELECTION}":"' & $aBackupJobs_Selection[$i] & '"' & @CRLF
$s_JSONOutput = $s_JSONOutput & " " & '"{#BACKUPEXECSELECTION}":"' & "---" & '"' & @CRLF
$s_JSONOutput = $s_JSONOutput & " " & '},'
Next
$s_JSONOutput = StringTrimRight($s_JSONOutput, 1) & @CRLF & ']}'
ConsoleWrite($s_JSONOutput & @CRLF)
EndIf
If $CmdLine[0] = 2 Then
If $CmdLine[1] = "jobstatus" Then
$stemp = _BEMCLI(StringReplace($aparameter[3], '{ID of Job}',$CmdLine[2]))
$atemp = StringSplit($stemp, @CRLF)
For $i = 1 To $atemp[0]
If StringLeft($atemp[$i],StringLen("JobStatus")) = "JobStatus" Then
$aatemp = StringSplit($atemp[$i],' : ',1)
$sJobStatus = $aatemp[$aatemp[0]]
ConsoleWrite($sJobStatus & @CRLF)
Exit 0
EndIf
If StringInStr($atemp[$i], "Get-BEJob : Cannot find") > 0 Then
ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
Exit 0
EndIf
Next
EndIf
If $CmdLine[1] = "jobhowlongago" Then
$stemp = _BEMCLI(StringReplace($aparameter[3], '{ID of Job}',$CmdLine[2]))
$atemp = StringSplit($stemp, @CRLF)
For $i = 1 To $atemp[0]
If StringLeft($atemp[$i],StringLen("StartTime")) = "StartTime" Then
$aatemp = StringSplit($atemp[$i],' : ',1)
$stemp = $aatemp[$aatemp[0]]
$aDateTemp = StringSplit($stemp, " .")
; [1] = Tag
; [2] = Monat
; [3] = Jahr
; [4] = Uhrzeit als hh:mm:ss
$iJobhowlongago = _DateDiff("s", $aDateTemp[3] & "/" & $aDateTemp[2] & "/" & $aDateTemp[1] & " " & $aDateTemp[4], @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC)
ConsoleWrite($iJobhowlongago & @CRLF)
Exit 0
EndIf
If StringInStr($atemp[$i], "Get-BEJob : Cannot find") > 0 Then
ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
Exit 0
EndIf
Next
EndIf
If $CmdLine[1] = "jobbytes" Then
$stemp = _BEMCLI(StringReplace($aparameter[3], '{ID of Job}',$CmdLine[2]))
$atemp = StringSplit($stemp, @CRLF)
For $i = 1 To $atemp[0]
If StringLeft($atemp[$i],StringLen("TotalDataSizeBytes")) = "TotalDataSizeBytes" Then
$aatemp = StringSplit($atemp[$i],' : ',1)
$stemp = $aatemp[$aatemp[0]]
$iJobBytes = Int($stemp)
ConsoleWrite($iJobBytes & @CRLF)
Exit 0
EndIf
If StringInStr($atemp[$i], "Get-BEJob : Cannot find") > 0 Then
ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
Exit 0
EndIf
Next
EndIf
If $CmdLine[1] = "jobruntime" Then
$stemp = _BEMCLI(StringReplace($aparameter[3], '{ID of Job}',$CmdLine[2]))
$atemp = StringSplit($stemp, @CRLF)
For $i = 1 To $atemp[0]
If StringLeft($atemp[$i],StringLen("ElapsedTime")) = "ElapsedTime" Then
$aatemp = StringSplit($atemp[$i],' : ',1)
$stemp = $aatemp[$aatemp[0]]
$aRuntimeTemp = StringSplit($stemp,":")
; [1] = Stunden
; [2] = Minuten
; [3] = Sekunden
$iJobRuntime = Int($aRuntimeTemp[3]) + (Int($aRuntimeTemp[2]) * 60) + (Int($aRuntimeTemp[1]) * 3600)
ConsoleWrite($iJobRuntime & @CRLF)
Exit 0
EndIf
If StringInStr($atemp[$i], "Get-BEJob : Cannot find") > 0 Then
ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
Exit 0
EndIf
Next
EndIf
If $CmdLine[1] = "jobPercentComplete" Then
$stemp = _BEMCLI(StringReplace($aparameter[3], '{ID of Job}',$CmdLine[2]))
$atemp = StringSplit($stemp, @CRLF)
For $i = 1 To $atemp[0]
If StringLeft($atemp[$i],StringLen("PercentComplete")) = "PercentComplete" Then
$aatemp = StringSplit($atemp[$i],' : ',1)
$iJobPercentComplete = $aatemp[$aatemp[0]]
If $iJobPercentComplete = -1 Then
$iJobPercentComplete = 0
EndIf
ConsoleWrite($iJobPercentComplete & @CRLF)
Exit 0
EndIf
If StringInStr($atemp[$i], "Get-BEJob : Cannot find") > 0 Then
ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
Exit 0
EndIf
Next
EndIf
If $CmdLine[1] = "jobErrorCode" Then
$stemp = _BEMCLI(StringReplace($aparameter[3], '{ID of Job}',$CmdLine[2]))
$atemp = StringSplit($stemp, @CRLF)
For $i = 1 To $atemp[0]
If StringLeft($atemp[$i],StringLen("ErrorCode")) = "ErrorCode" Then
$aatemp = StringSplit($atemp[$i],' : ',1)
$iJobErrorCode = $aatemp[$aatemp[0]]
ConsoleWrite($iJobErrorCode & @CRLF)
Exit 0
EndIf
If StringInStr($atemp[$i], "Get-BEJob : Cannot find") > 0 Then
ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
Exit 0
EndIf
Next
EndIf
If $CmdLine[1] = "jobErrorCategory" Then
$stemp = _BEMCLI(StringReplace($aparameter[3], '{ID of Job}',$CmdLine[2]))
$atemp = StringSplit($stemp, @CRLF)
For $i = 1 To $atemp[0]
If StringLeft($atemp[$i],StringLen("ErrorCategory")) = "ErrorCategory" Then
$aatemp = StringSplit($atemp[$i],' : ',1)
$iJobErrorCode = $aatemp[$aatemp[0]]
ConsoleWrite($iJobErrorCode & @CRLF)
Exit 0
EndIf
If StringInStr($atemp[$i], "Get-BEJob : Cannot find") > 0 Then
ConsoleWrite("ZBX_NOTSUPPORTED" & @CRLF)
Exit 0
EndIf
Next
EndIf
EndIf
Exit 0