A couple of months ago I was asked by a client to create a method of patching to automatically snap shot a VM before applying the monthly patches with SCCM.
This as I’m sure your thinking has to be done by Task Sequence with the use of SCCM. If you not then that is how I would suggest you do it. The issue was PowerCLI and how to deploy that silently to all servers to allow for the Task Sequence to harness the PowerShell commands locally on the box without using remote PowerShell. I came across a great blog here discussing the silent install and then decided to write a PowerShell wrapper to deploy the software silently and with the use of SCCM.
The following script can be run as an Application or Package that is purely up to you. There are 2 modes, Install and Uninstall. Add these deployment command lines to your application or program to silently install PowerCLI or just run them locally:
Powershell.exe -Executionpolicy Bypass -File "Deploy_PowerCLI_Silent.ps1 -MODE Install" Powershell.exe -Executionpolicy Bypass -File "Deploy_PowerCLI_Silent.ps1 -MODE Uninstall"
You will probably notice that to uninstall it silently you need to remove “VMware Remote Console Plug-in 5.1” followed by the “VMware vSphere PowerCLI” software.
The script build the arguments to do so, but if you are using a different version you will have to change:
$RemConsole = $InstalledProducts | where { $_.ARPDisplayName -eq "VMware Remote Console Plug-in 5.1" }
name to match
Just change the “VMware Remote Console Plug-in 5.1” portion to the same text as seen in your “Programs and Features” (Appwiz.cpl).
Make sure the VMware-PowerCLI.exe is in the same folder as the script.
The Script:
######################################################################################################### #Script Name: Deploy VMware PowerCLI 6.3 Silently # #Script Author: SCCMOG - Richie Schuster 16/12/2016 WWW.SCCMOG.COM # ######################################################################################################### #Script Usage: "Deploy_PowerCLI_Silent.ps1 -Mode Install" to install and "-Mode Uninstall" to uninstall.# ######################################################################################################### #Install Mode Parameter PARAM ( [string]$MODE ) #If entery is input run script If ($mode -ne $null){ #If Mode input is Install run install. If ($MODE -eq "Install"){ #Install VMware PowerCLI 6.3 Silently and Remote Console silently Start-Process "$PSScriptRoot\VMware-PowerCLI-6.3.0-3737840.exe" -ArgumentList '/b"C:\Windows\Temp" /VADDLOCAL=ALL /S /V"/qn ALLUSERS=1 REBOOT=ReallySuppress' -wait -NoNewWindow } #If Mode input uninstall run uninstall ElseIf ($MODE -eq "Uninstall"){ ##Get all Applications in SMS namespace $InstalledProducts = Get-WmiObject -Namespace 'root\cimv2\sms' -Class SMS_InstalledSoftware #Grab PowerCLI related $RemConsole = $InstalledProducts | where { $_.ARPDisplayName -eq "VMware Remote Console Plug-in 5.1" } $PowerCLI = $InstalledProducts | where { $_.ARPDisplayName -eq "VMware vSphere PowerCLI" } #Get store local msi for uninstall arguements $REMCLP = $RemConsole.LocalPackage $PCLILP = $PowerCLI.LocalPackage #Get process that must be killed to uninstall silently $Running = Get-Process -Name vmware-usbarbitrator64 -ErrorAction SilentlyContinue #Check if process is running If ($Running -ne $null){ #Kill process if it is Stop-Process -Name vmware-usbarbitrator64 -Force #Start Removal of VMware Remote Console Plug-in 5.1 Start-Process "msiexec.exe" -ArgumentList "/x $REMCLP /qn /L*v $env:windir\temp\Uninstall_VMwareREMConsolePlg5.1.log /norestart" -wait -NoNewWindow #Start Removal of VMware vSphere PowerCLI Start-Process "msiexec.exe" -ArgumentList "/x $PCLILP /qn /L*v $env:windir\temp\Uninstall_VMwarevSpherePowerCLI.log /norestart" -wait -NoNewWindow } Else{ #Start Removal of VMware Remote Console Plug-in 5.1 Start-Process "msiexec.exe" -ArgumentList "/x $REMCLP /qn /L*v $env:windir\temp\Uninstall_VMwareREMConsolePlg5.1.log /norestart" -wait -NoNewWindow #Start Removal of VMware vSphere PowerCLI Start-Process "msiexec.exe" -ArgumentList "/x $PCLILP /qn /L*v $env:windir\temp\Uninstall_VMwarevSpherePowerCLI.log /norestart" -wait -NoNewWindow } } #If mode input does not match inform user. Else{ Write-host 'Incorrect Params please format this way: "Deploy_PowerCLI_Silent.ps1 -Mode Install" to install and "-Mode Uninstall" to uninstall.' } } #If params are not specified then inform. Else{ Write-host 'Script Params must be used : "Deploy_PowerCLI_Silent.ps1 -Mode Install" to install and "-Mode Uninstall" to uninstall.' } #########################################################################################################
May I see the script you used in order to backup the vm? I’m assuming you had a device collection with all of the machines. In the task sequence you had the first step create a Snapshot, and then the 2nd step run the updates. Could we see the script you used to create the snapshot?
Hi SCCM Guy,
Yes I had all my device collections for Pilot and Production patching. Also I normally split them out by Manual or ADR. Manual being deployed as Available, which this script was used in harmony with. I will do a guide on how I setup ADR rules which means patching is reduced to “Right click…. Enable”.
Any way here is the snapshot script for you.
Auto Snapshot VM before Patching
Cheers,
SCCMOG
Thanks very much for the scripts – they’ve been useful to get snapshot before SCCM patching working. Additionally the whole process for snapshot before patching with SCCM is now a bit easier?
– PowerCLI install can now be done using PowerShellGet (“Install-module”)
– Your auto snapshot script could simply connect to all available vCenters and find a VM rather than having to know which VM is on which individual vCenter – I amended mine to do this.
Hi Gordon,
Glad it hppled, yes unfortunately I haven’t worked with this script in a while now so if you would like to post you changes that would be great!
Cheers,
Richie