Veeam Backup & Replication Jobs via PRTG überwachen

[Aktualisiert: 27.09.2019] Leider gibt es bisher für Paessler PRTG noch keinen Sensoren für die Sicherungssoftware Veeam Backup & Replication und deren Agenten. Daher habe ich ein bestehendes PowerShell Skript entsprechend als Grundlage genommen und um unsere Anforderungen/Wünsche erweitertet.

Es werden aktuell folgende Arten von Jobs von meinem PowerShell Skript unterstützt:

  • Backup & Replication Jobs
  • Backup Agent Jobs managed by Client
  • Backup Agent Jobs managed by Backup Server

Die aktuelle Fassung des PowerShell Skripts ist mit Veeam B&R 9.5 Update 4b  (Community Edition) und Windows Agent 3.0.2.1170 entwickelt worden.

<#
.SYNOPSIS
PRTG Sensor script to monitor a Veeam Backup & Replication environment

THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE
RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER. 

.DESCRIPTION

.PARAMETER PrtgDevice
Name des Servers, auf dem die NoSpamProxy Intranet Rolle installiert ist.

.PARAMETER VeeamBRJobName
Name des Jobs, der innerhalb von Veeam Backup & Replication abgefragt werden soll.

 
.INPUTS
None
 
.OUTPUTS
Output exit code and a description
 
.NOTES
File:           paessler-prtg_monitor-veeam-backupand-replication-job.ps1
Version:        1.1
Author:         Daniel Wydler
Creation Date:  10.03.2019, 10:54 Uhr
Purpose/Change:
 
Date                   Comment
-----------------------------------------------
10.03.2019, 10:54 Uhr  Initial community release
18.09.2019, 21:39 Uhr  Code base revised
19.09.2019, 00:11 Uhr  Added informations to the header
27.09.2019, 09:49 Uhr  Fixed query of JobId


.COMPONENT
Veeam Backup & Replication Powershell-Module

.LINK
www.vmbaggum.nl/2015/03/monitor-veeam-backup-jobs-with-prtg/
github.com/dwydler/Powershell-Skripte/blob/master/Paessler/PRTG/paessler-prtg_monitor-veeam-backupand-replication-job.ps1


.EXAMPLE
.\paessler-prtg_monitor-veeam-backupand-replication-job.ps1 -PrtgDevice "localhost" -VeeamBRJobName "Job1"
.\paessler-prtg_monitor-veeam-backupand-replication-job.ps1 "localhost" "Job1"
#>

#---------------------------------------------------------[Initialisations]--------------------------------------------------------
 
Param (
   [Parameter(
        ValueFromPipelineByPropertyName,
        Position=0,
        Mandatory=$true
    )]
    [ValidateNotNullOrEmpty()]
   [string] $PrtgDevice,

   [Parameter(
        ValueFromPipelineByPropertyName,
        Position=1,
        Mandatory=$true
    )]
    [ValidateNotNullOrEmpty()]
   [string] $VeeamBRJobName
)

Clear-Host

#----------------------------------------------------------[Declarations]----------------------------------------------------------

[string] $FunctionForInvokeCommand = ""

#-----------------------------------------------------------[Functions]------------------------------------------------------------

function Set-PrtgResult {
        
        Param (
		    [Parameter(Mandatory=$true, Position=0)]
            [ValidateNotNullOrEmpty()]
		    [System.Object] $obLocalVBRxSession
	    )

        [string] $strVeeamBackupJobResult = ""

        # Auswertung des letzten Backup Jobs
	    If ($obLocalVBRxSession.Result -eq "Success") {
            $strVeeamBackupJobResult = "0:Job erfolgreich ausgeführt am"
        }
        ElseIf ($obLocalVBRxSession.Result -eq "Warning") {
            $strVeeamBackupJobResult = "1:Job mit Warnungen ausgeführt am"
        }
	    ElseIf ($obLocalVBRxSession.Result -eq "Failed") {
            $strVeeamBackupJobResult = "2:Job fehlgeschlagen am"
        }
	    Else {
            $strVeeamBackupJobResult = "2:Der Job hat einen unbekannten Status."
        }

        # Zeitstempel anhängen
        $strVeeamBackupJobResult += " " + $obLocalVBRxSession.CreationTime.ToString("dd.MM.yyyy HH:mm")

        return $strVeeamBackupJobResult
    }

#------------------------------------------------------------[Modules]-------------------------------------------------------------



#-----------------------------------------------------------[Execution]------------------------------------------------------------

# Vorberreitung, um bestehende Funktionen an das Invoke Command zu übergeben
$FunctionForInvokeCommand = "function Set-PrtgResult { ${function:Set-PrtgResult} }"

# Nachstehende Befehle werden auf dem entfernen Computer ausgeführt
$QueryResult = Invoke-Command -Computername $PrtgDevice -Args $VeeamBRJobName, $FunctionForInvokeCommand -ScriptBlock {

    # Variablen übergeben
	param(
        [string] $strVeeamBackupJobName,
        [System.Object] $FunctionForInvokeCommand
    )

    # Bereitgestellte Funktion wird aufgerufen
    . ([ScriptBlock]::Create($FunctionForInvokeCommand))
    
    # Füge das Veeam Powershell SnapIn zu aktuellen Sitzung hinzu
    try {
        Add-PSSnapin -Name VeeamPSSnapIn
    }
    catch {
        return "2:Powershell - Veeam PSSnapIn konnte nicht geladen werden!"
    }

    # Überprüfung, ob es bei dem Jobname um ein Backup & Replication Objekt handelt
    if (Get-VBRJob -Name $strVeeamBackupJobName -ErrorAction SilentlyContinue) {

        # Auslesen des letzten Ausführungsergebnis vom dem angegebenen Veeam Backup Job
        $strVeeamBackupJobId = Get-VBRJob -Name $strVeeamBackupJobName | Select -ExpandProperty Id
        $obVBRSession = Get-VBRBackupSession | Select JobId, Result, CreationTime | Where-Object { $_.JobId -eq $strVeeamBackupJobId } | Sort -Descending -Property "CreationTime" | Select -First 1
     
        # Auswertung des Ausführungsergebnis. Rückgabewert entspricht dem notwendigen Format für PRTG
        if($obVBRSession) {
            Set-PrtgResult -obLocalVBRxSession $obVBRSession
        }
        else {
            return "1:Der Job ist bisher noch nie gelaufen."
        }
    }
    # Überprüfung, ob es bei dem Jobname um ein Backup & Replication Entpoint Objekt handelt.
    elseif (Get-VBREPJob -Name $strVeeamBackupJobName -ErrorAction SilentlyContinue) {

        # Auslesen des letzten Ausführungsergebnis vom dem angegebenen Veeam Backup Job
        $strVeeamBackupJobId = Get-VBREPJob -Name $strVeeamBackupJobName | Select -ExpandProperty Id
        $obVBREPSession = Get-VBREPSession | Select JobId, Result, CreationTime | Where-Object { $_.JobId -eq $strVeeamBackupJobId } | Sort -Descending -Property "CreationTime" | Select -First 1

        # Auswertung des Ausführungsergebnis. Rückgabewert entspricht dem notwendigen Format für PRTG
        if($obVBREPSession) {
            Set-PrtgResult -obLocalVBRxSession $obVBREPSession
        }
        else {
            return "1:Der Job ist bisher noch nie gelaufen."
        }
    }
    else {
        return "1:Es konnte kein Job mit dem Namen '$strVeeamBackupJobName' gefunden werden!"
    }
}

# String splitten
$exitcode = $QueryResult -Split(':')

# Ausgabe für PRTG
write-host $QueryResult

# Script mit entsprechenden Fehlercode beenden
exit $exitcode[0]

Quelle: Git Repository

Das Skript muss im Verzeichnis auf der jeweiligen PRTG Probe unter „.\PRTG Network Monitor\Custom Sensors\EXE“ (z.B. C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXE) abgespeichert werden. Ob ihr den Dateinamen beibehaltet oder nicht wird später nicht relevant sein.

Danach in die Weboberfläche von PRTG wechseln. Falls dort noch kein Gerät für den Server, auf dem Veeam Backup & Replication installiert ist, existiert, muss dieses natürlich vorher noch angelegt werden. Anschließend einen neuen Server auf dem Gerät hinzufügen. Wichtig dabei ist, dass dieser Sensor vom Typ „Programm/Skript“ ist.

Nun erscheint der Dialog für die Allgemeinen- und Sensoreinstellungen für den Neuen.

Parameter:

Als erster Parameter muss „%host“ (ist im Screenshot leider falsch) eingegeben werden. Grund dafür ist, dass ich den Computername im PowerShell Skript in eine Variable gepackt habe. Gerade wenn man unabhängige Veeam B&R Instanzen in seiner Landschaft hat, ist das PowerShell Skript flexibel und muss nicht unnötig oft dupliziert werden. PRTG speichert den Computernamen des übergeordneten Geräts in der Variablen %device. Das ist auch in der Dokumentation von PRTG nachzulesen.

Als zweiter Parameter muss den exakten Namen des Jobs aus der Veeam Backup & Replication Konsole eingegeben. Bitte die Anführungszeichen nicht vergessen. Denn meistens enthalten die Namen der Jobs Leerzeichen, weil es schöner aussieht. 😉

Sicherheitskontext:

Nach einer PRTG Probe Standardinstallation wird der dazugehörige Dienst „PRTG Probe Service“ unter dem Benutzer „Lokales System“ ausgeführt. Mit diesem Systembenutzer ist es nicht möglich über das Netzwerk eine PowerShell Remoteverbindung auf einen entfernen Server aufzubauen. Daher muss die zweite Option ausgewählt werden. In 99% der Fälle ist bereits entsprechende Zugangsdaten im übergeordneten Gerät bzw. in oberste Hierarchie konfiguriert. Denn Sensoren für Windows-Systeme (z.B. WMI) greifen auf dieselben Zugangsdaten zurück.

Sind alle Einstellungen und ein schöner Name für den Sensor vergeben, kann der Sensor über die Schaltfläche „Erstellen“ am rechten Bildschirmrand erzeugt werden.

Das Ergebnis im laufenden Betrieb sieht in meinem LAB aktuell so aus:
Der Code bzw. Sensor ist sozusagen noch BETA. Ich habe die Überarbeitung des Codes nur in meinem LAB getestet, da ich zurzeit keinen Zugriff auf eine größere Umgebung habe. Somit würde ich mich natürlich freuen, wenn sich weitere Tester finden lassen. Viel Spaß beim Ausprobieren. 🙂

Abonnieren
Benachrichtige mich bei
53 Comments
neueste
älteste
Inline Feedbacks
View all comments
Stefan
10.07.2020 08:51

Hi, zuerst besten Dank für dein Script!
Lässt sich das erweitern damit im jeweiligen Job auch die Channels mit den Informationen über „Size“ „Machines“ enthalten sind?
Der Channel „Execution Time“ – woher kommt diese Zeit? Die Zeit für den Job ist es jedenfalls nicht.
Vielen Dank und Gruss

Alina B.
06.07.2020 11:53

Hallo zusammen, ich habe das Problem, dass Windows Agents Backup Jobs (über Veeam Backup & Replication konfiguriert) nicht erkannt werden.
Ich bekomme als Ausgabe immer „der Jobs ist noch nie gelaufen“, ob dieser Job genauso wie die anderen Jobs regelmäßig läuft. Somit steht der Sensor auf Warnung.
Woran könnte das liegen?

Geert B.
18.05.2020 09:41

Hallo und guten Morgen.
Vielen Dank für die Mühen um das Script.

Leider habe ich folgendes Problem:
Wir setzen Veeam in der aktuellsten Version (10.irgendwas) ein. PRTG ebenfalls in der aktuellsten Version.

Wir haben etliche Jobs, die gemonitort werden möchten. Der erste klappt. Jeder weitere angelegte Sensor sagt mir, das es den Job nicht geben würde, obwohl er Namenstechnisch genau so im Veeam zu finden ist.

Geert B.
Reply to  Geert B.
18.05.2020 10:11

Vielleicht eine „Korrektur“…es handelt sich wohl ausschließlich um Jobs, auf denen die Dasi auf Tape katapultiert werden soll…lt.Veeam erfolgreich, lt. dem Script gibt es diese Jobs wohl nicht.

Danke und Gruß

Geert B.
Reply to  dw
18.05.2020 17:14

DER war gut…könnte ich PS, wäre ich sicher in der Lage, nur noch vom heimischen Office aus zu arbeiten und würde Geld verdienen…;-). Schade…;-(…sehr schade…;-(. Aber vielleicht gibt es eine Antwort auf die Frage, wieso die Sensoren für die anderen Jobs liefen und dann, nach ca. 30 Minuten, in den Fehlerstatus gingen mit der Meldung: „[[ Bestätigt 5/18/2020 12:39:36 PM von gbadm bis 5/19/2020 12:39:36 PM ]]: Ihre Abfrage hat die erlaubte Zeit überschritten. Abhängig vom verwendeten Sensortyp könnte der Grund dafür sein, dass der Sensor sich nicht mit dem Zielsystem verbinden konnte oder dass ein PowerShell-Skript zu lange für… Weiterlesen »

Urs Heeb
22.04.2020 11:56

Mit der %device Variable hat es bei uns nicht funktioniert, da wir im PRTG dem Device auch noch eine Beschreibung anfügen. Wird jedoch hinter dem Job die %host Variable mitgegeben, funktioniert es 🙂

Dimi
15.01.2020 14:45

Hallo Daniel,
erst mal Danke für Script. Backupjob Abfrage funktioniert super. (Veeam Backup & Replication 9.5.4)
Was nicht funktioniert ist Abfrage von „Copy Job“ und „Backup to Tape“.
Ich erhalte eine Fehlermeldung „Systemfehler: Der Job hat einen unbekannten Status. 12.01.2020 00:00 (Code: PE022)“
Obwohl Job lauft täglich und hat Status „Success“
Heutige Datum ist 15.01.2020 14:30
Gibt es eine Lösung dafür?
Vielen Dank
Dimi

Christian
25.09.2019 15:30

Hi, wenn ich den Sensor einrichte kommt als Nachricht, Der Job ist noch nie gelaufen, obwohl er letzte Nacht gelaufen ist.
Was kann dafür die Ursache sein?

Christian
Reply to  dw
26.09.2019 10:10

Hi,
es handelt sich bei 2 Jobs um einen Windows Agent Job und um einen Hyper-V Backup Job.

Gruß
Christian

Alexander
27.08.2019 23:08

Hi,

Muss der Backupserver in der Domain sein? Was denn wenn nicht? Wir haben den bewusst rausgelassen und mit anderen Accounts als den Domänen-Accounts versehen.

LG
Alexander

Rüdiger
04.07.2019 12:32

Hallo,
funktioniert super für Jobs der VMs für Backup&Replication.
Leider funktioniert das Skript nicht für unsere (managed) Endpoint Backups.
Als Ergebnis bekommen wir immer:
!! Sensor Veeam Backup Job ………..
Systemfehler: InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorld : InvokeMethodOnNull + PSComputername : „Unser Backupserver“: (Code: PE022)
Wir haben Veeam B&R 9.5 U4 im Einsatz.

Danke und viele Grüße
Rüdiger

Rüdiger Pelz
Reply to  dw
31.07.2019 14:48

Habe nochmal nachgeschaut. die Anführungszeichen sind bei allen Endpoint Jobs gesetzt.
VG
Rüdiger

Rüdiger Pelz
Reply to  dw
05.08.2019 10:10

Die Version ist die 3.0.1.1039.
Allerdings habe ich jetzt herausgefunden, dass die Abfragen nur
bei den managed Agents fehlschlagen.
Jetzt habe ich mal einen unmanaged Agent getestet und dort funktioniert alles prima.

Viele Grüße
Rüdiger

Jaco Vokoun
14.07.2018 16:03

Hi, cooles Skript!
Unter Nachricht habe ich beim Sensor immer die Anfangszeit des Jobs stehen. Würde nicht die Endzeit sinnvoll sein?

Danke auf jeden Fall!
lg

Dan
18.01.2018 22:38

Hallo Zusammen,
Kann mir jemand sagen, wo ich den besagten Code für die Abfrage des Endpoint-Backups finde? Vielleicht täuschen mich meine Augen, aber ich finde nichts.
Danke für das B&R Script, funktioniert einwandfrei.

Vaupo
10.05.2017 14:37

Hallo!

Ist ja alles schon etwas älter, aber das Script wäre für mich super…
Leider läuft es bei mir nicht…
der Sensor zeigt einen Fehler:
Zugriff verweigert. Bitte überprüfen Sie Ihre Windows-Zugangsdaten. (Code: PE095)

Habe alle möglichen, Formen ausprobiert. Geht aber nicht…

Hat einer eine Idee??

Vielen Dank!

poik
25.04.2017 15:39

Hallo Daniel
Vielen Dank für das Skript!

Lieber Gruss
Poik

Spencer
20.03.2017 11:36

Ich kriege es nicht ans Laufen 🙁
Folgenden Fehler erhalte ich immer: Systemfehler: Keine Verbindung zu veeam.domain.local möglich! (Code: PE022)
Wobei veeam.domain.local an dieser Stelle nur ein Platzhalter ist.
Führe ich es manuell auf der Powershell (x86) aus, funktioniert das Skript.

Spencer
Reply to  dw
27.03.2017 14:06

Ja, das habe ich getan. Kommt aus auf die Schreibweise in den „Zugangsdaten für Windows Systeme“ an?

domain.local oder DOMAIN.local oder DOMAIN.LOCAL
administrator oder Administrator?

Bei einigen Systemen konnte ich hier bereits Unterschiede verzeichnen. Bei PRTG habe ich damit noch keine Erfahrungen.

Patrick
01.03.2017 12:08

Super Script, danke!

Wie sieht es mit der Überwachung ob ein Job gelaufen ist aus?

Sprich wenn der Job alle 6h laufen soll, aber bereits 2 Tage nicht läuft – bleibt es grün, weil der letzte Run vor zwei Tagen ok war?

Gäbe es eine Möglichkeit den Schedule auszulesen und dann das Creation Date in ein Verhältnis zu setzen?

Danke,
Gruss Patrick

DopeFish
07.02.2017 18:58

Müsste es nicht auch möglich sein via Script alle Veeam Jobs abzufragen?

So das als Output für PRTG so etwas steht:

0:Job1:07.09.2016 22:00
1:Job2:07.09.2016 22:10
0:Job3:07.09.2016 22:50

Würde dann doch Sensoren sparen. 🙂

Norman
02.02.2017 21:57

Hallo, sehr schön das Script, besten Dank. Anstelle von &device habe ich den Servernamen in Quota direkt rein geschrieben, funktioniert auch. So konnte ich die Sektion in PRTG ungleich dem Rechnernamen setzen, Nur am Rande. Meine Frage, wie stelle ich es an, dass ich auch die Windows „Agent“ Jobs überwachen kann? Beispiel: Ich habe einen physikalischen Server auf dem ich Veeam Endpoint Backup Free installiert mit der Install Option in das Repository. Im Veeam Backup and Replikation (V9.5) sehe ich auch die Jobs und den Status. Bekomme auch die passenden Mails und zwar vom Veeam Server. Auf der Seite des… Weiterlesen »

Joe
24.01.2017 13:14

Hallo und Vielen Dank für das Script! nachdem ich einen Fehler in Zeile 41 „Writ-Host“ statt „Write-Host“ —8<— ElseIf ($Args.Count -eq 1) { Writ-host "Die Variable %device ist nicht angegeben!" exit 2; –8<– beseitigt hatte, leider noch das Problem, daß der String %device zu folgendem LOG führt: — 8 < — SERVERNAME : Die Benennung "SERVERNAME" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang. In Zeile:1 Zeichen:274 + … SRV01.TEC.DOM (SERVERNAME); exit $LASTEXITCODE +… Weiterlesen »

Tim
19.01.2017 09:38

Hi Daniel,

danke für dein Script. Allerdings bekomme ich immer die Meldung das „Zu viele Argumente übergeben! (Code: PE022)“.

Wolfgang Nilges
04.01.2017 13:34

Hallo,

kann man mit diesem Script nur jeweils einen Job überwachen, oder gibt es auch eine
Möglichkeit mehrere Backupjobs mit unterschiedlichen Namen zu überwachen?

Vielen Dank

Thorsten
30.11.2016 08:19

Hallo,
das Script verursacht bei einem laufenden Job eine Fehlermeldung. Erst wenn der Job einwandfrei gelaufen ist, steht der Sensor wieder auf grün. Ebenfalls können keine Jobs mit Sonderzeichen (Klammern z.B.) angesprochen werden.

Danke für Deine Hilfe

Maik
08.09.2016 07:46

Auch hier das gleiche Problem:
XML: The returned xml does not match the expected schema. (code: PE233) — JSON: The returned json does not match the expected structure (Invalid JSON.). (code: PE231)

Wir setzen Veeam in der Version 9.0.0.1715 Update 2 ein.
Die Ausführung über die Powershell ist über den Veeam-Server und über die Powershell auf dem PRTG-Server erfolgreich.

Maik
Reply to  Maik
08.09.2016 07:48

Die Ausgabe sieht je nach Jobverlauf unter anderem in der Powershell so aus:

0:07.09.2016 22:00

Koenig Andy
06.09.2016 12:08

Hallo

ich wollt mal Frage ich kriege bei den Einstellungen wie hier auf der Seite immer wieder XML: The returned xml does not match the expected schema. (code: PE233) — JSON: The returned json does not match the expected structure (Invalid JSON.). (code: PE231)

Kann mir jemand da helfen?

Robin `ypid` Schneider
15.02.2016 17:33

Hi Daniel,

Veeam habe ich bisher noch nicht überwacht aber dein Skript sieht schon mal vielversprechend aus. Vielen Dank für den Blog Beitrag. Unter welcher Lizenz steht den das Skript? (Für die Nutzung und das schreiben von Patches nicht ganz unerheblich).

53
0
Would love your thoughts, please comment.x
()
x
Back to top