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 „%device“ 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. 🙂

43
Hinterlasse einen Kommentar

avatar
19 Kommentar Themen
24 Themen Antworten
0 Follower
 
Kommentar, auf das am meisten reagiert wurde
Beliebtestes Kommentar Thema
19 Kommentatoren
ChristianAlexanderRüdiger PelzRüdigerJaco Vokoun Letzte Kommentartoren
  Abonnieren  
neueste älteste
Benachrichtige mich bei
Christian
Gast
Christian

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?

Alexander
Gast
Alexander

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
Gast
Rüdiger

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

Jaco Vokoun
Gast
Jaco Vokoun

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
Gast
Dan

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
Gast
Vaupo

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
Gast
poik

Hallo Daniel
Vielen Dank für das Skript!

Lieber Gruss
Poik

Spencer
Gast
Spencer

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.

Patrick
Gast
Patrick

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
Gast
DopeFish

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
Gast
Norman

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
Gast
Joe

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
Gast
Tim

Hi Daniel,

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

Wolfgang Nilges
Gast
Wolfgang Nilges

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
Gast
Thorsten

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
Gast
Maik

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
Gast
Maik

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

0:07.09.2016 22:00

Koenig Andy
Gast
Koenig Andy

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
Gast
Robin `ypid` Schneider

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

Back to top