Quick Download: https://github.com/thekevinholman/MaintenanceModeDSTFixScript
Maintenance Mode Schedules are a new feature since SCOM 2016. However, one of the challenges with these schedules, is that they run one hour off their intended schedule time, after a Daylight Savings Time change.
For instance, if you look at an existing schedule, you can see that the intended run time for Maintenance Mode is 6pm, however, since the DST event, the next run time is calculated at 7pm:
A simple way to fix this, is to update the schedule effective beginning date to a day AFTER the DST time change.
I created a script which will loop through all your schedules, and update the “Effective Beginning” date to “today” when you run the script. As long as you run this after the DST change, it will correct your schedules:
***WARNING:
This automation cannot edit schedules that are currently in a “Running” status. You will need to stop those schedules from running, or manually edit them.
The script *excerpt* sample is below. Please download the full script from my GitHub link above.
# Begin MAIN script section #================================================================================= #Get SCOM Maintenance Schedules $MMschedules = Get-SCOMMaintenanceScheduleList $i=0 FOREACH ($schedule in $MMschedules) { $ScheduleID = $schedule.ScheduleId.Guid $ScheduleObj = Get-SCOMMaintenanceSchedule -ID $ScheduleID $ScheduleName = $ScheduleObj.ScheduleName $ActiveStartTime = $ScheduleObj.ActiveStartTime $ActiveEndDate = $ScheduleObj.ActiveEndDate $ScheduleStatus = $ScheduleObj.Status #Check to see if the Schedule is currently running and skip if it is IF ($ScheduleStatus -ne "Running") { #Check to see if ActiveEndDate is in the past (Expired schedule) and only continue if it is IF ($ActiveEndDate -gt $StartTime) { #Check to see if Active Start time is in the future and skip if it is IF ($ActiveStartTime -lt $StartTime) { $ActiveStartHour = $ActiveStartTime.Hour $ActiveStartMinute = $ActiveStartTime.Minute $NewStartDateTime = Get-Date -Hour $ActiveStartHour -Minute $ActiveStartMinute -Second "00" Write-Host "Modifying ($ScheduleName) with existing start time of ($ActiveStartTime) to NEW start time of ($NewStartDateTime)." Write-Log -Result INFO -Message "Modifying ($ScheduleName) with existing start time of ($ActiveStartTime) to NEW start time of ($NewStartDateTime)." #Edit the schedule. Comment out this line to test the script taking no action Edit-SCOMMaintenanceSchedule -ScheduleId $ScheduleID -ActiveStartTime $NewStartDateTime $i++ } ELSE { Write-Host "Skipping ($ScheduleName) because the schedule start time is in the future. Current schedule start time is: ($ActiveStartTime)." Write-Log -Result INFO -Message "Skipping ($ScheduleName) because the schedule start time is in the future. Current schedule start time is: ($ActiveStartTime)." } } ELSE { Write-Host "Skipping ($ScheduleName) because the schedule end date is already expired. Current schedule end date is: ($ActiveEndDate)." Write-Log -Result INFO -Message "Skipping ($ScheduleName) because the schedule end date is already expired. Current schedule end date is: ($ActiveEndDate)." } } ELSE { Write-Host "WARNING: Skipping ($ScheduleName) because it is currently running. Running schedules cannot be edited." Write-Log -Result WARN -Message "WARNING: Skipping ($ScheduleName) because it is currently running. Running schedules cannot be edited." } } Write-Host "Operation complected. Modified ($i) MM schedules." Write-Log -Result INFO -Message "Operation completed. Modified ($i) MM schedules." #================================================================================= # End MAIN script section
Let me know if you have any questions, comments, or recommendations!
Pingback:Fix SCOM Maintenance Mode Scheduler schedules after a DST time change | SCOM Maintenance Mode Scheduler
Thank you very much!! Really helpful 🙂
Not sure why but it didn’t work for me. I only had one schedule affected and it was skipped.
I updated the script to compare the “Hour” between $schedule.NextScheduledRunTime and $ScheduleObj.ActiveStartTime
It was more accurate for me:
…
$NextScheduledRunTime = $schedule.NextScheduledRunTime
if ($NextScheduledRunTime.Hour -ne $ActiveStartTime.Hour)
{
Write-Host “Modify ($ScheduleName)`nNextScheduledRunTime ‘$NextScheduledRunTime’`nActiveStartTime ‘$ActiveStartTime'”
…
Hello Kevin,
this script is going well.
I added a new function to create the event log because I was missing it at the beginning.
#Function for check log File
Function Check-Logfile {
Param(
[Parameter(Mandatory=$True)]
[string]$FilePath
)
If(Test-Path -Path $FilePath){
Write-Host “Logfile exist on $FilePath” -ForegroundColor Green
} Else {
# Create log File
Write-Host “Logfile $FilePath does not exist. It will be created.” -ForegroundColor Yellow
$Logfile = (New-Item ($FilePath) -ItemType File -Force).FullName
# Write Header
$Line = “{0,-19}{1,-8}{2}” -f “TimeStamp”,”,Typ”,”,Message”
Add-Content $LogFile -Value $Line
}
}
I perform this function once according to your whoami.
…
$whoami = whoami
# Log File
Check-Logfile -FilePath $LogFile
…
Hey Kevin,
Thanks for the heads up! I’ve recently implemented maintenance mode schedules, so it’s good to know about this before it occurs 🙂
Thanks for the fix, but that’s really something that should be handled properly from the beginning… I opened an uservoice suggestion : https://systemcenterom.uservoice.com/forums/293064-general-operations-manager-feedback/suggestions/40185556-make-scheduled-maintenance-mode-follow-dst
Hey Kevin,
can’t believe this is still a thing…
Probably you know someone who knows someone?
Aakash?
Thanks,
Patrick