Im November hatte ich die Möglichkeit zusammen mit Stefano Heisig ein Veeam PowerShell Deep Dive Webinar zu halten. Ich hoffe, dass es allein Teilnehmern ähnlich viel Spaß bereitet hat mir zuzusehen, wie es mir selbst Spaß gemacht die 45 Minuten vorzubereiten und abzuhalten. Veeam hat auch mittlerweile die Aufzeichnung des Webinars online zur Verfügung gestellt. Als Ergänzung zum Video habe ich mein Script Runbook auf GitHub veröffentlicht.
In diesem Artikel möchte ich noch einmal die Inhalte des Webinars etwas aufarbeiten und teilweise weiter erläutern.
Veeam PowerShell Deep Dive – Basics
Auch ein Veeam PowerShell Deep Dive muss mit ein paar Grundlagen beginnen. Ich werde es aber versuchen kurz zu halten.
PowerShell SnapIn laden
Das Veeam PowerShell SnapIn wird zusammen mit der Veeam Backup & Replication Konsole ausgeliefert. Somit ist das SnapIn auf dem Backup Server direkt installiert, um noch auf weiteren Server die Veeam PowerShell zu nutzen einfach die Konsole vom Veeam Backup & Replication installations Medium installieren.
Get-PSSnapin -Registered | fl *
Add-PSSnapin VeeamPSSnapin
(Get-Command VeeamPSSnapIn\*).Count

Veeam Backup Server verbinden
Nach dem Laden des SnapIns kann die Verbindung zum Veeam Backup & Replication Server mit anderen Credential oder den Session Credentials aufgebaut werden.
Referenz: Connect-VBRServer, Get-VBRServerSession
$VeeamCred = Get-Credential -Message "Veeam Credential"
Connect-VBRServer -Server "192.168.3.100" -Credential $VeeamCred
Get-VBRServerSession

Alle Jobs auflisten
Mit dem Cmdlet Get-VBRJob lassen sich die gängigsten Veeam Job Typen anzeigen:
- Backup jobs
- Replication jobs
- Backup copy jobs
- File copy jobs
- VM Copy jobs
Spezielle Cmdlets gibt es zusätzlich noch für diese Veeam Job Typen:
- Get-VBRTapeJob: Tape Jobs
- Get-VSBJob: SureBackup Jobs
- Get-VBREPJob: Veeam Agent Backup Jobs
Referenz: Get-VBRJob
Get-VBRJob | Select-Object Name, JobType, SourceType | Format-Table -AutoSize

Job Objekte auflisten
Die Objekte innerhalb eines Jobs können mit einem eigenen Cmdlet oder mit einer Methode der Jobs aufgelistet werden. Wenn in einem Slript der Veeam Job bereits in einer Variablen vorhanden (in dem Beispiel $Job) ist, ist die Methode wesentlich schneller als das Cmdlet.
Referenz: Get-VBRJobObject

# Cmdlet
Get-VBRJobObject -Job "Backup PhotonOS" | Format-Table -AutoSize
# Methode
$Job = Get-VBRJob -Name "Backup PhotonOS"
$Job.GetObjectsInJob() | Format-Table -AutoSize

Letzte Session anzeigen
An dieser Stelle ist es denke ich wichtig den Unterschied zwischen Job und Session klar zu stellen. Ein Job ist meinen Augen die Definition und die Session die einzelne Ausführung eines Jobs. Das PowerShell Objekt einer Session beinhaltet auch das Log.
Referenz: Get-VBRSession
Get-VBRSession -Job $Job -Last
(Get-VBRSession -Job $Job -Last).Log.Title

Backup Repositories anzeigen
Die Veeam Backup Repositories lassen sich eigentlich sehr einfach mit einem eigenen Cmdlet anzeigen. Etwas komplexer wird es jedoch wenn man mit Scale Out Repositories in seiner Umgebung arbeitet (Was dringend zu empfehlen ist!).
Referenz: Get-VBRBackupRepository, Get-VBRRepositoryExtent
Get-VBRBackupRepository | Select-Object Name, Path, Type | Format-Table -AutoSize
## Backup Repositories Advanced
[Array]$RepoList = Get-VBRBackupRepository | Where-Object {$_.Type -ne "SanSnapshotOnly"}
[Array]$ScaleOuts = Get-VBRBackupRepository -ScaleOut
if ($ScaleOuts) {
foreach ($ScaleOut in $ScaleOuts) {
$Extents = Get-VBRRepositoryExtent -Repository $ScaleOut
foreach ($Extent in $Extents) {
$RepoList = $RepoList + $Extent.repository
}
}
}
$RepoList | Select-Object Name, Path, `
@{Name="CachedTotalSpaceGB"; Expression= {[Math]::Round([Decimal]$_.info.CachedTotalSpace/1GB,2)}}, `
@{Name="CachedFreeSpaceGB"; Expression= {[Math]::Round([Decimal]$_.info.CachedFreeSpace/1GB,2)}} | Format-Table -AutoSize


Veeam PowerShell Deep Dive – Tags
In dem Webinar war das Thema vSphere Tags ursprünglich in eine kleine Story eingebettet:
Nutzung von vSphere-Tags: Auslesen der VMware vSphere-Tags für die Zuweisung von VMs nach Standort oder OS-Kriterien – damit lassen sich VMs automatisiert einem Backup-Job zuweisen.
https://www.veeam.com/de/videos/webinar-powershell-deep-dive-14574.html
Für diesen Artikel werde ich das Thema jedoch etwas anders angehen.
vSphere Tag und Veeam Inventory
In meinem Lab habe ich ein paar vSphere Tags unterschiedlicher Kategorisieren vorbereitet. Um diese anzuzeigen, muss aber zuerst das (oder die) vCenter noch zusätzlich in meiner PowerShell Session verbunden werden.
Alle vCenter im Veeam Backup & Replication Inventory lassen sich sehr einfach so verbinden:
# Get All vCenters in VBR Inventory
[Array]$VCs = (Get-VBRServer).where{($_.Type -eq "VC")}
# Load and Configure PowerCLI
Get-Module -ListAvailable -Name VMware* | Import-Module
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -InvalidCertificateAction Ignore -Scope Session -Confirm:$false
# Connect vCenters
foreach ($VC in $VCs){
$vCenterCred = Get-Credential -Message "Credential for '$($VC.Name)'"
Connect-VIServer -Server $($VC.Name) -Credential $vCenterCred
}
Nun können wir und die Tag kategirien und tags im vCenter Bestand ansehen.

Diese vSphere Tags lassen sich auch im Veeam Inventory finden und über die Id zu Reference Beziehung auch eindeutig zuweisen.

$vSphereTag = Get-TagCategory -Name "OS-Type" | Get-Tag -Name "Windows"
(Find-VBRViEntity -Tags).where({$_.Type -eq "Tag" -and $_.Reference -eq $vSphereTag.Id})

Tags und Backup Jobs
Den erfolgreich identifizierten vSphere Tag können wir nun einem Backup Job zuordnen beziehungsweise auch wieder entfernen.
$vSphereTag = Get-TagCategory -Name "OS-Type" | Get-Tag -Name "Windows"
$ExampleTag = (Find-VBRViEntity -Tags).where({$_.Type -eq "Tag" -and $_.Reference -eq $vSphereTag.Id})
# Get Job
$VBRJobToLocationA = Get-VBRJob -Name "Backup to LocationA"
$VBRJobToLocationA | Get-VBRJobObject | select Type, Location, Name
# Add tag to Job
Add-VBRViJobObject -Job $VBRJobToLocationA -Entities $ExampleTag | Out-Null
$VBRJobToLocationA | Get-VBRJobObject | select Type, Location, Name
# Remove tag from Job
$VBRJobToLocationA | Get-VBRJobObject | Where-Object {$_.Location -eq $ExampleTag.Path} | Remove-VBRJobObject -Completely:$true | Out-Null
$VBRJobToLocationA | Get-VBRJobObject | select Type, Location, Name

Praktisches Beispiel
Um das etwas greifbarer zu machen, habe ich ein praktisches Beispiel für den Veeam PowerShell Deep Dive vorbereitet.
- Veeam Backup Job für Windows VMs
- vSphere Tag für Windows VMs
- Zuordnung von VM zu Backup Job per vSphere Tag
Mit einem kleinen PowerCLI Skript lassen sich alle Windows VMs mit dem entsprechenden Tag versehen.
# Get Tag Category
$OsTagCategory = Get-TagCategory -Name "OS-Type"
# Get Windows Tag
Get-Tag -Category $OsTagCategory -Name "Windows"
# Assign Tag to VM
foreach ($VM in Get-VM){
if ($VM.GuestId -match "Windows"){
$VM | New-TagAssignment -Tag $(Get-Tag -Category $OsTagCategory -Name "Windows") | out-null
Write-Host "'$($VM.Name)': Windows identified - Configured OS: '$($VM.GuestID) / Detected OS: '$($VM.ExtensionData.Guest.GuestId)'." -ForegroundColor Green
}
elseif ($VM.ExtensionData.Guest.GuestId -match "Windows") {
$VM | New-TagAssignment -Tag $(Get-Tag -Category $OsTagCategory -Name "Windows") | out-null
Write-Host "'$($VM.Name)': Windows identified -Configured OS: '$($VM.GuestID) / Detected OS: '$($VM.ExtensionData.Guest.GuestId)'." -ForegroundColor Green
}
else {
Write-Host "'$($VM.Name)': No Windows identified." -ForegroundColor Yellow
}
}



Veeam PowerShell Deep Dive – Job Optionen
Das Bearbeiten von Job Optionen per PowerShell kann sehr schnell interessant werden, wenn man für eine große Anzahl von Jobs einzelne Optionen verändern möchte.
Job Optionen anzeigen
Die Job Optionen lassen sich sehr schnell mit der Job Methode GetOptions() aufrufen.
$ExampleJob = Get-VBRJob -Name "Backup Job 1"
$ExampleJobOptions = $ExampleJob.GetOptions()
# Show all Job Options
$ExampleJobOptions
# Show single Backup Storage Options
$ExampleJobOptions.BackupStorageOptions

Job Optionen exportieren
Zur Dokumentationszwecken oder auch zur weiteren Verarbeitung, kann es sehr nützlich sein die gesamten Job Optionen zu exportieren. Hierzu habe ich mir einen kleinen Trick ausgedacht.
$ExampleJob = Get-VBRJob -Name "Backup Job 1"
$ExampleJobOptions = $ExampleJob.GetOptions()
# Convert to JSON
$JsonObject = $ExampleJobOptions | ConvertTo-Json
$Object = $JsonObject | ConvertFrom-Json
# Remove "non-readable" Options Object
$Object.PSObject.Properties.Remove('Options')
# Export to JSON
$Object | ConvertTo-Json | Out-File "C:\temp\ExampleJobOptions.json"
Start-Process "C:\temp\ExampleJobOptions.json"

Job Optionen verändern
Grundlegend kann mit dem Veeam PowerShell SnapIn entweder eine einzelne Option verändert werden oder alle Optionen vom einem anderen Job übernommen werden.
$ExampleJob = Get-VBRJob -Name "Backup Job 1"
$ExampleJobOptions = $ExampleJob.GetOptions()
$BackupJob = Get-VBRJob -Name "Backup Job 2"
# Modify Options
$BackupJobOptions = $BackupJob.GetOptions()
$BackupJobOptions.BackupStorageOptions.EnableDeletedVmDataRetention = $True
Set-VBRJobOptions -Job $BackupJob -Options $BackupJobOptions
# Set all Options from other Job
Set-VBRJobOptions -Job $BackupJob -Options $ExampleJobOptions


Natürlich lassen sich auch nicht nur die Optionen eines einzelnen Jobs verändern, auch die Massen-Konfiguration anhand eines Referenz Jobs ist möglich.
$TemplateBackupJob = Get-VBRJob -Name "Template Job 1"
# Show Template Options
($TemplateBackupJob.GetOptions()).BackupStorageOptions | ft -AutoSize
# Show Job Options
(Get-VBRJob -Name "Backup Job*" | Get-VBRJobOptions).BackupStorageOptions | ft -AutoSize
# Update multiple Jobs
Get-VBRJob -Name "Backup Job*" | Set-VBRJobOptions -Options ($TemplateBackupJob.GetOptions()) | Out-Null

Weitere Projekte
Für alle, die sich noch weiter mit dem Thema Veeam PowerShell beschäftigen möchten habe ich hier eine Sammlung weiterer spannender Projekte zusammengestellt:
- Veeam Plugin for PoshBot chat bot
- Veeam Integration with vRealize Operations Manager
- Veeam vSphere Interactions with PowerShell
- Veeam Automation and Orchestration for vSphere project by Anthony Spiteri and Michael Cade
- PowerShell script that creates a new Self Service Tenant and Default Policy Jobs in the Veeam vCD Self Service Portal by Anthony Spiteri
- Veeam PowerShell GitHub Repository
No Responses