Veeam Blog Post – Deploying Veeam Backup and Replication 9.5 UR3 with PowerShell
Hey Checkyourlogs fans,
In this blog post I will show you how you can deploy Veeam Backup and Replication 9.5 with Update Rollup 3 to a Hyper-V Virtual Machine. This is a really handy little script because it can help you get Veeam going in your lab in a snap. The basic steps to accomplish this are as follows:
- Create a Hyper-V Virtual Machine running Windows Server 2016. In my case I have created a VM called Management01.
-
Next you will need to download a copy of Veeam Backup and Replication from https://www.veeam.com/downloads.html
-
Next you need to request a trial product key.
-
In our case we have stored both files in F:\Temp1
-
Next grab a copy of the PowerShell script from my GITHub Repository. https://raw.githubusercontent.com/dkawula/Operations/master/Veeam/Install-Veeam-HyperV.ps1 and save it to f:\Temp1
-
Open an Administrative PowerShell Prompt and change the path to f:\temp1. Then type .\Import-Module .\Install-Veeam-HyperV.PS1 -Force -Verbose and press Enter. This will load the Install-Veeam Module which we will use to deploy Veeam to our lab.
-
Next type Install-Veeam -VMName Management01 -GuestOSName -Management01 -VMPath f:\dcbuild_test and press enter.
-
On the Please Select the Veeam 9.5 UR3 ISO window browse to f:\temp1\VeeamBackup&Replication_9.5.0.1535.Update3.Iso
-
On the Please Select the Veeam License File window browse to f:\temp1\Veeam_Backup_nfr_0_12.lic. In my case I used my Veeam Vanguard Veeam NFR License.
-
Next input the credentials for your lab. In my case I will install using my Domain Administrator Account MVPDays\Administrator. We will pipe this into the VM using PowerShell direct with the $DomainCred variable.
-
At this point it is time to sit back and relax as the next steps will happen automatically:
- Adding a New VHDx file from the Host
- Formatting the New VHDx file and giving it a volume label of Veeam
- Mounting the VHDx to the Host
- Copying the Veeam ISO specified earlier
- Copying the Veeam License file specified earlier
- Installs 2012 System CLR Types
- Installs SQL Express
- Installs the Veeam Backup and Replication 9.5 Server
- Installs the Veeam Backup Console
- Installs the Explorer for Active Directory
- Installs the Explorer for Exchange
- Installs the Explorer for SQL
- Installs the Explorer for Oracle
- Installs the Explorer for SharePoint
- Installs the Enterprise Manager web and Cloud Portal
- Finally updates to Rollup 3
- Your finished product will look just like this:
For your reference here is a copy of the script:
<# Created: 2018-02-01 Version: 1.0 Author Dave Kawula MVP Homepage: http://www.checkyourlogs.net Disclaimer: This script is provided "AS IS" with no warranties, confers no rights and is not supported by the authors or CheckyourLogs or MVPDays Publishing Author - Dave Kawula Twitter: @DaveKawula Blog : http://www.checkyourlogs.net .Synopsis Deploys Veeam Backup and Replication 9.5 + UR3 to a Hyper-V Lab VM .DESCRIPTION This Script was part of my BIGDemo series and I have broken it out into a standalone function You will need to have a Veeam Service Account Pre-Created, Veeam B&R ISO and Product Key for this lab to work The Script will prompt for the path of the ISO and .LIC files The Script will prompt for an Admin Account which will be used in $DomainCred If your File names are different than mine adjust accordingly. We will use PowerShell Direct to setup the Veeam Server in Hyper-V The Source Hyper-V Virtual Machine needs to be Windows Server 2016 .EXAMPLE TODO: Dave, add something more meaningful in here .PARAMETER WorkingDir Transactional directory for files to be staged and written .PARAMETER VMname The name of the Virtual Machine .PARAMETER VMPath The Path to the VM Working Folder - We create a new VHDx for the Veeam Install .PARAMETER GuestOSName Name of the Guest Operating System Name Usage: Install-Veeam -Vmname YOURVM -GuestOS VEEAMSERVER -VMpath f:\VMs\Veeam -WorkingDir f:\Temp #> #Installs Veeam 9.5 and UR 3 Function Install-Veeam { param ( [string]$VMName, [string]$GuestOSName, [string]$VMPath, [string]$WorkingDir ) #Ask for Veeam ISO [reflection.assembly]::loadwithpartialname("System.Windows.Forms") $openFile = New-Object System.Windows.Forms.OpenFileDialog -Property @{ Title="Please Select the Veeam 9.5 UR3 ISO" } $openFile.Filter = "iso files (*.iso)|*.iso|All files (*.*)|*.*" If($openFile.ShowDialog() -eq "OK") { Write-Host "File $($openfile.FileName) selected" } if (!$openFile.FileName){ WriteErrorAndExit "Iso was not selected... Exitting" } $VeeamISO = $openfile.FileName #$VeeamISO #Ask for Veeam License [reflection.assembly]::loadwithpartialname("System.Windows.Forms") $openFile = New-Object System.Windows.Forms.OpenFileDialog -Property @{ Title="Please Select the Veeam License File" } $openFile.Filter = "lic files (*.lic)|*.lic|All files (*.*)|*.*" If($openFile.ShowDialog() -eq "OK") { Write-Host "File $($openfile.FileName) selected" } if (!$openFile.FileName){ WriteErrorAndExit "Iso was not selected... Exitting" } $VeeamLic = $openfile.FileName #$VeeamLic $DomainCred = Get-Credential #$VMName = 'Management01' #$GuestOSname = 'Management01' #$VMPath = 'f:\dcbuild_Test\VMs' Write-Output -InputObject "[$($VMName)]:: Adding Drive for Veeam Install" New-VHD -Path "$($VMPath)\$($GuestOSName) - Veeam Data 4.vhdx" -Dynamic -SizeBytes 60GB Mount-VHD -Path "$($VMPath)\$($GuestOSName) - Veeam Data 4.vhdx" $DiskNumber = (Get-Diskimage -ImagePath "$($VMPath)\$($GuestOSName) - Veeam Data 4.vhdx").Number Initialize-Disk -Number $DiskNumber -PartitionStyle GPT Get-Disk -Number $DiskNumber | New-Partition -UseMaximumSize -AssignDriveLetter | Format-Volume -FileSystem NTFS -NewFileSystemLabel "Veeam" -Confirm:$False $Driveletter = get-wmiobject -class "Win32_Volume" -namespace "root\cimv2" | where-object {$_.Label -like "Veeam*"} $VeeamDriveLetter = $DriveLetter.DriveLetter Write-Output -InputObject "[$($VMName)]:: Copying Veeam ISO and Rollups into the new VHDx" Copy-Item -Path $VeeamIso -Destination "$($VeeamDriveLetter)\VeeamBackup&Replication_9.5.0.1536.Update3.iso" -Force Write-Output -InputObject "[$($VMName)]:: Copying Veeam license and Rollups into the new VHDx" Copy-Item -Path $VeeamLic -Destination "$($VeeamDriveLetter)\veeam_backup_nfr_0_12.lic" -Force Dismount-VHD -Path "$($VMPath)\$($GuestOSName) - Veeam Data 3.vhdx" Add-VMHardDiskDrive -VMName $VMName -Path "$($VMPath)\$($GuestOSName) - Veeam Data 4.vhdx" -ControllerType SCSI icm -VMName $VMName -Credential $domainCred { Write-Output -InputObject "[$($VMName)]:: Adding the new VHDx for the Veeam Install" Get-Disk | Where OperationalStatus -EQ "Offline" | Set-Disk -IsOffline $False Get-Disk | Where Number -NE "0" | Set-Disk -IsReadOnly $False $Driveletter = get-wmiobject -class "Win32_Volume" -namespace "root\cimv2" | where-object {$_.Label -like "Veeam*"} $VeeamDrive = $Driveletter.DriveLetter $VeeamDrive Write-Output -InputObject "[$($VMName)]:: Mounting Veeam ISO" $iso = Get-ChildItem -Path "$($VeeamDrive)\VeeamBackup&Replication_9.5.0.1536.Update3.iso" #CHANGE THIS! Mount-DiskImage $iso.FullName Write-Output -InputObject "[$($VMName)]:: Installing Veeam Unattended" $setup = $(Get-DiskImage -ImagePath $iso.FullName | Get-Volume).DriveLetter +':' $setup <#> =========================================================================== Original Source Created by: Markus Kraus Twitter: @VMarkus_K Private Blog: mycloudrevolution.com #Source PowerShell Code from https://gist.githubusercontent.com/mycloudrevolution/b176f5ab987ff787ba4fce5c177780dc/raw/f20a78dc9b7c1085b1fe4d243de3fcb514970d70/VeeamBR95-Silent.ps1 =========================================================================== </#> # Requires PowerShell 5.1 # Requires .Net 4.5.2 and Reboot #region: Variables $source = $setup $licensefile = "$($VeeamDrive)\veeam_backup_nfr_0_12.lic" $username = "svc_veeam" $fulluser = "MVPDays\svc_Veeam" $password = "P@ssw0rd" $CatalogPath = "$($VeeamDrive)\VbrCatalog" $vPowerPath = "$($VeeamDrive)\vPowerNfs" #endregion #region: logdir $logdir = "$($VeeamDrive)\logdir" $trash = New-Item -ItemType Directory -path $logdir -ErrorAction SilentlyContinue #endregion ### Optional .Net 4.5.2 <# Write-Host " Installing .Net 4.5.2 ..." -ForegroundColor Yellow $Arguments = "/quiet /norestart" Start-Process "$source\Redistr\NDP452-KB2901907-x86-x64-AllOS-ENU.exe" -ArgumentList $Arguments -Wait -NoNewWindow Restart-Computer -Confirm:$true #> ### Optional PowerShell 5.1 <# Write-Host " Installing PowerShell 5.1 ..." -ForegroundColor Yellow $Arguments = "C:\_install\Win8.1AndW2K12R2-KB3191564-x64.msu /quiet /norestart" Start-Process "wusa.exe" -ArgumentList $Arguments -Wait -NoNewWindow Restart-Computer -Confirm:$true #> #region: Installation # Info: https://www.veeam.com/unattended_installation_ds.pdf ## Global Prerequirements Write-Host "Installing Global Prerequirements ..." -ForegroundColor Yellow ### 2012 System CLR Types Write-Host " Installing 2012 System CLR Types ..." -ForegroundColor Yellow $MSIArguments = @( "/i" "$source\Redistr\x64\SQLSysClrTypes.msi" "/qn" "/norestart" "/L*v" "$logdir\01_CLR.txt" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\01_CLR.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } ### 2012 Shared management objects Write-Host " Installing 2012 Shared management objects ..." -ForegroundColor Yellow $MSIArguments = @( "/i" "$source\Redistr\x64\SharedManagementObjects.msi" "/qn" "/norestart" "/L*v" "$logdir\02_Shared.txt" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\02_Shared.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } ### SQL Express ### Info: https://msdn.microsoft.com/en-us/library/ms144259.aspx Write-Host " Installing SQL Express ..." -ForegroundColor Yellow $Arguments = "/HIDECONSOLE /Q /IACCEPTSQLSERVERLICENSETERMS /ACTION=install /FEATURES=SQLEngine,SNAC_SDK /INSTANCENAME=VEEAMSQL2012 /SQLSVCACCOUNT=`"NT AUTHORITY\SYSTEM`" /SQLSYSADMINACCOUNTS=`"$fulluser`" `"Builtin\Administrators`" /TCPENABLED=1 /NPENABLED=1 /UpdateEnabled=0" Start-Process "$source\Redistr\x64\SQLEXPR_x64_ENU.exe" -ArgumentList $Arguments -Wait -NoNewWindow ## Veeam Backup & Replication Write-Host "Installing Veeam Backup & Replication ..." -ForegroundColor Yellow ### Backup Catalog Write-Host " Installing Backup Catalog ..." -ForegroundColor Yellow $trash = New-Item -ItemType Directory -path $CatalogPath -ErrorAction SilentlyContinue $MSIArguments = @( "/i" "$source\Catalog\VeeamBackupCatalog64.msi" "/qn" "/L*v" "$logdir\04_Catalog.txt" "VM_CATALOGPATH=$CatalogPath" "VBRC_SERVICE_USER=$fulluser" "VBRC_SERVICE_PASSWORD=$password" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\04_Catalog.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } ### Backup Server Write-Host " Installing Backup Server ..." -ForegroundColor Yellow $trash = New-Item -ItemType Directory -path $vPowerPath -ErrorAction SilentlyContinue $MSIArguments = @( "/i" "$source\Backup\Server.x64.msi" "/qn" "/L*v" "$logdir\05_Backup.txt" "ACCEPTEULA=YES" "VBR_LICENSE_FILE=$licensefile" "VBR_SERVICE_USER=$fulluser" "VBR_SERVICE_PASSWORD=$password" "PF_AD_NFSDATASTORE=$vPowerPath" "VBR_SQLSERVER_SERVER=$env:COMPUTERNAME\VEEAMSQL2012" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\05_Backup.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } ### Backup Console Write-Host " Installing Backup Console ..." -ForegroundColor Yellow $MSIArguments = @( "/i" "$source\Backup\Shell.x64.msi" "/qn" "/L*v" "$logdir\06_Console.txt" "ACCEPTEULA=YES" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\06_Console.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } ### Explorers Write-Host " Installing Explorer For ActiveDirectory ..." -ForegroundColor Yellow $MSIArguments = @( "/i" "$source\Explorers\VeeamExplorerForActiveDirectory.msi" "/qn" "/L*v" "$logdir\07_ExplorerForActiveDirectory.txt" "ACCEPTEULA=YES" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\07_ExplorerForActiveDirectory.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } Write-Host " Installing Explorer For Exchange ..." -ForegroundColor Yellow $MSIArguments = @( "/i" "$source\Explorers\VeeamExplorerForExchange.msi" "/qn" "/L*v" "$logdir\08_VeeamExplorerForExchange.txt" "ACCEPTEULA=YES" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\08_VeeamExplorerForExchange.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } Write-Host " Installing Explorer For SQL ..." -ForegroundColor Yellow $MSIArguments = @( "/i" "$source\Explorers\VeeamExplorerForSQL.msi" "/qn" "/L*v" "$logdir\09_VeeamExplorerForSQL.txt" "ACCEPTEULA=YES" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\09_VeeamExplorerForSQL.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } Write-Host " Installing Explorer For Oracle ..." -ForegroundColor Yellow $MSIArguments = @( "/i" "$source\Explorers\VeeamExplorerForOracle.msi" "/qn" "/L*v" "$logdir\10_VeeamExplorerForOracle.txt" "ACCEPTEULA=YES" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\10_VeeamExplorerForOracle.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } Write-Host " Installing Explorer For SharePoint ..." -ForegroundColor Yellow $MSIArguments = @( "/i" "$source\Explorers\VeeamExplorerForSharePoint.msi" "/qn" "/L*v" "$logdir\11_VeeamExplorerForSharePoint.txt" "ACCEPTEULA=YES" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\11_VeeamExplorerForSharePoint.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } ## Enterprise Manager Write-Host "Installing Enterprise Manager ..." -ForegroundColor Yellow ### Enterprise Manager Prereqirements Write-Host " Installing Enterprise Manager Prereqirements ..." -ForegroundColor Yellow $trash = Install-WindowsFeature Web-Default-Doc,Web-Dir-Browsing,Web-Http-Errors,Web-Static-Content,Web-Windows-Auth -Restart:$false -WarningAction SilentlyContinue $trash = Install-WindowsFeature Web-Http-Logging,Web-Stat-Compression,Web-Filtering,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Mgmt-Console -Restart:$false -WarningAction SilentlyContinue $MSIArguments = @( "/i" "$source\Redistr\x64\rewrite_amd64.msi" "/qn" "/norestart" "/L*v" "$logdir\12_Rewrite.txt" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\12_Rewrite.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } ### Enterprise Manager Web Write-Host " Installing Enterprise Manager Web ..." -ForegroundColor Yellow $MSIArguments = @( "/i" "$source\EnterpriseManager\BackupWeb_x64.msi" "/qn" "/L*v" "$logdir\13_EntWeb.txt" "ACCEPTEULA=YES" "VBREM_LICENSE_FILE=$licensefile" "VBREM_SERVICE_USER=$fulluser" "VBREM_SERVICE_PASSWORD=$password" "VBREM_SQLSERVER_SERVER=$env:COMPUTERNAME\VEEAMSQL2012" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow if (Select-String -path "$logdir\13_EntWeb.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } ### Enterprise Manager Cloud Portal Write-Host " Installing Enterprise Manager Cloud Portal ..." -ForegroundColor Yellow <# $MSIArguments = @( "/i" "$source\Cloud Portal\BackupCloudPortal_x64.msi" "/L*v" "$logdir\14_EntCloudPortal.txt" "/qn" "ACCEPTEULA=YES" ) Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow #> Start-Process "msiexec.exe" -ArgumentList "/i `"$source\Cloud Portal\BackupCloudPortal_x64.msi`" /l*v $logdir\14_EntCloudPortal.txt /qn ACCEPTEULA=`"YES`"" -Wait -NoNewWindow if (Select-String -path "$logdir\14_EntCloudPortal.txt" -pattern "Installation success or error status: 0.") { Write-Host " Setup OK" -ForegroundColor Green } else { throw "Setup Failed" } ### Update 3 Write-Host "Installing Update 3 ..." -ForegroundColor Yellow $Arguments = "/silent /noreboot /log $logdir\15_update.txt VBR_AUTO_UPGRADE=1" Start-Process "$source\Updates\veeam_backup_9.5.0.1536.update3_setup.exe" -ArgumentList $Arguments -Wait -NoNewWindow #endregion } }
I hope you enjoyed this post and please feel free to update my code, use it in your lab, and as always happy learning.
Dave Kawula – Microsoft MVP / Veeam Vanguard
@DaveKawula