Articles in the "Reboot script for Exchange environment" series
- Patch and reboot script for an entire Exchange environment, Part 1
- Patch and reboot script for an entire Exchange environment, Part 2 [This article]
- Patch and reboot script for an entire Exchange environment, Part 3
- Patch and reboot script for an entire Exchange environment, Part 4
- Patch and reboot script updated to version 2.1
- Patch and reboot script updated to v2.4
The first section, or region as used in PowerGUI, is where all the variables are defined. The script will process servers based on their Exchange roles and whether they are in the production or standby (DR) data center. For my environment, this means hub transport and client access are on the same server, while the mailbox and unified messaging roles are dedicated.
#Server groupings [array]$HTCAS = 'prodhc01','prodhc02' #Production HT/CAS [array]$UM = 'produ01','produ02' #Production UM [array]$MB = 'prodm03','prodm04','prodm02','prodm01' #Production MB [array]$DRHTCAS = 'drhc01','drhc02' #DR HT/CAS [array]$DRUM = 'dru01' #DR UM [array]$DRMB = 'drm01','drexm02' #DR MB
Each server grouping is an array that the code body will loop through. To accommodate a grouping that might only have one server, the variables are cast as arrays.
The next part of the variables section is for putting the servers into maintenance mode in SCOM.
#SCOM settings $bUpdateSCOM = $true #Set to false if SCOM is not used or servers should not be put into maintenance mode $rmsName = 'rmsserver' #SCOM RMS to connect to if SCOM update is true $maintModeDuration = 90 #Maximum duration, in minutes, of SCOM maintenance window
All of the variable declarations have trailing comments so you know what they are for, but they are also explained here. Line 2 is for indicating whether you have SCOM in your environment or, even if you do, that you don’t want to execute that portion in the code body. Line 3 is the name of the root management server to connect to with remote PowerShell. Line 4 is for how long the server should be put into maintenance. (When a server has finished rebooting and all is well, the server will be taken out of maintenance mode, so this is in case it can’t be done for some reason.)
Next is where non-mail variables are defined.
$WUCompDelay = 90 #Maximum minutes allowed for Windows Update to complete $rebootMaxWait = 20 #Maximum minutes allowed for server to complete reboot $serviceStartDelay = 3 #Minutes to wait for Exchange services to start after reboot $serviceStartAttempts = 3 #Number of times to check for services started $transcriptLog = 'c:\scripts\RebootScriptLog.txt' #Transcript file to record screen output and send in email
Line 1 specifies how long the script should wait for Windows Update to complete before aborting. Earlier versions had this set to 20 minutes, then 30, then 45, increasing mostly to accommodate roll-up installation since compiling .NET images (aka the Ngen process) can take some time to complete. You can set this to whatever you feel comfortable with, knowing that if you set it too short the script will abort when there may be nothing wrong with the server. Line 2 is how long to wait for a server to reboot before assuming something is wrong and aborting. Line 3 is how long to wait after a server has successfully rebooted before checking for service status. In other words, how much time should be given before checking that all Exchange services have started. This is used along with the value for Line 4 to determine the total time to wait for services to start. If any service isn’t started by the time the value for Line 3 has initially passed, the script will sleep for those number of minutes and then check again, repeating until all services are started or the number of checks in Line 4 have been reached. Line 5 is the path and name of the log file to record the screen output to for later review.
The last part of the variables section is for notification.
#Mail settings $mailSender = 'Server Reboot Script <firstname.lastname@example.org>' $mailServer = 'smtp.company.com' #SMTP FQDN to relay through [array]$mailRecipients = 'email@example.com' #Recipients for notification and log file $bSendStatusUpdates = $true #Set to false to not send status notification when each server is starting/ending [array]$statusRecipients = 'phonenumber@SMSdomain.com' #Mobile recips for in-progress status updates
Lines 2 and 3 are self-explanatory. Line 4 is a comma-separated list of addresses to send the script completion notice and transcript log. It is cast as an array in case you specify only one recipient. Line 5 indicates whether you want status updates to be sent, typically to a mobile device. These updates are formatted with SMS recipients in mind, so they are to the point. An status update is sent when a server is starting to be processed, when it has successfully rebooted and passes health checks, and when the script is complete or has aborted (including why it aborted). This is so the person executing the script doesn’t have to keep an eye on the script to know its progress. Line 6 is a comma-separated list of address to receive the status updates. Again, it is cast as an array if you only have one recipient. While it is geared for consumption by a mobile device via SMS, you can use any address you want.
This completes the variables section. The next post will skip the functions section and delve into the script body, covering the functions as they are called. Download the complete script:
Reboot-ExchangeServers.zip (7.5 KiB)