# /=======================================================================
# /=
# /= Patch_Template.ps1
# /=
# /= AUTHOR: Jake Bentz
# /= DATE: 10/11/2016
# /=
# /= REQUIREMENTS: Server 2008/2012 Templates need to be running PowerShell v.3 minimum but v.4 is highly recommended.
# /= The PSWindowsUpdate Module directory needs to exist in the PSModulePath on the template. https://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc
# /= Encrypted password file for local administrator account
# /= Exectuion Policy on template needs to be Remote-Signed
# /=
# /= DESCRIPTION: This script patches the specified templates
# /=
# /= REVISION HISTORY
# /= VER DATE AUTHOR/EDITOR COMMENT
# /= 1.0 10/11/2016 Jake Bentz Created script
# /=
# /=======================================================================#
#
#Create variable for list of templates
$Template = "WindowsTemplate"
#
# Create log folder if it doesn't exist
$Logpath = ".\output"
If ((Test-Path -Path $Logpath) -ne $true) { New-Item -ItemType directory -Path $Logpath}
#
# Create log file
$Logfile = ".\output\Patch_Template"+ (get-date -format '_ddMMMyyyy_hhmm') +".txt"
Write "================================================================" > $Logfile
Write "Patch Template Output File" >> $Logfile
Write "================================================================" >> $Logfile
#
# Convert template to VM
Write "============================" >> $Logfile
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Converting to VM "
$Output = $Output += $Template
Write $Output >> $Logfile
Set-Template -Template $Template -ToVM -Confirm:$false >> $Logfile
Start-sleep -s 60
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Complete"
Write $Output >> $Logfile
Write "============================" >> $Logfile
#
# Start VM
Write "============================" >> $Logfile
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Starting VM "
$Output = $Output += $Template
Write $Output >> $Logfile
Start-VM -VM $Template | Get-VMQuestion | Set-VMQuestion -DefaultOption -Confirm:$false >> $Logfile
Start-sleep -s 120
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Complete"
Write $Output >> $Logfile
Write "============================" >> $Logfile
#
# Create variables for Guest OS credentials - This is needed for the Invoke-VMScript cmdlet to be able to execute actions inside the Guest.
$Username = "administrator"
$OSPwd = cat .\OSPwd.txt | convertto-securestring
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $OSPwd
#
# The following is the cmdlet that will invoke the Get-WUInstall inside the GuestVM to install all available Windows updates; optionally results can be exported to a log file to see the patches installed and related results.
Write "============================" >> $Logfile
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Patching VM "
$Output = $Output += $Template
Write $Output >> $Logfile
Invoke-VMScript -ScriptType PowerShell -ScriptText "ipmo PSWindowsUpdate; Get-WUInstall –WindowsUpdate –AcceptAll –AutoReboot" -VM $Template -GuestCredential $Cred >> $Logfile
Start-sleep -s 3600
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Complete"
Write $Output >> $Logfile
Write "============================" >> $Logfile
#
# Optionally restart VMGuest one more time in case Windows Update requires it and for whatever reason the –AutoReboot switch didn’t complete it.
Write "============================" >> $Logfile
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Restarting VM "
$Output = $Output += $Template
Write $Output >> $Logfile
Restart-VMGuest -VM $Template -Confirm:$false >> $Logfile
Start-sleep -s 120
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Complete"
Write $Output >> $Logfile
Write "============================" >> $Logfile
#
# After a desired wait period, Shutdown the server
Write "============================" >> $Logfile
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Shutdown VM "
$Output = $Output += $Template
Write $Output >> $Logfile
Shutdown-VMGuest –VM $Template -Confirm:$false >> $Logfile
Start-sleep -s 120
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Complete"
Write $Output >> $Logfile
Write "============================" >> $Logfile
#
# Convert VM to Template
Write "============================" >> $Logfile
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Convert VM to Template"
$Output = $Output += $Template
Write $Output >> $Logfile
Set-VM –VM $Template -ToTemplate -Confirm:$false >> $Logfile
$Output = (get-date -format 'dd-MMM-yyyy hh:mm')
$Output = $Output += " Complete"
Write $Output >> $Logfile
Write "============================" >> $Logfile
Comments
0 B
|👍
/👎