$reboot = Get-PendingReboot
Write-Log -Message "Checking for pending reboot status..."
if ($reboot.IsSystemRebootPending -or
$reboot.IsCBServicingRebootPending -or
$reboot.IsWindowsUpdateRebootPending -or
$reboot.IsSCCMClientRebootPending) {
# Launch background script to enforce 5 PM restart
$helperScript = Join-Path -Path $PSScriptRoot -ChildPath "ForceRestartAt5PM.ps1"
Start-Process -FilePath "powershell.exe" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -File `"$helperScript`""
Write-Log -Message "Launched background script to enforce 5 PM forced restart."
Write-Log -Message "Pending reboot detected. Starting scheduled prompts..."
$currentTime = Get-Date
$todayDate = [datetime]::Today
$schedule = @(
$todayDate.AddHours(12), # 12:00 PM
$todayDate.AddHours(14), # 2:00 PM
$todayDate.AddHours(16) # 4:00 PM
)
# Add 15-minute intervals from 4:00 PM to 5:00 PM
for ($i = 0; $i -le 4; $i++) {
$schedule += $todayDate.AddHours(16).AddMinutes($i * 15)
}
$deferralCount = 0
foreach ($promptTime in $schedule) {
$now = Get-Date
$waitTime = ($promptTime - $now).TotalSeconds
Write-Log -Message "Next scheduled prompt at $($promptTime.ToString("hh:mm tt")). Current time: $($now.ToString("hh:mm tt"))."
if ($waitTime -gt 0) {
Write-Log -Message "Sleeping for $waitTime seconds until next prompt..."
Start-Sleep -Seconds $waitTime
Write-Log -Message "Woke up from sleep. Proceeding with prompt..."
} else {
Write-Log -Message "Scheduled time $($promptTime.ToString("hh:mm tt")) already passed. Skipping..."
continue
}
if ($promptTime -eq $todayDate.AddHours(17)) {
Write-Log -Message "Final scheduled time reached (5:00 PM). Initiating forced restart."
Restart-Computer -Force
break
}
$deferralCount++
$message = @"
Your machine requires a reboot which will take place at 5PM. You will receive an additional reminder at 4PM and additional reminders every 15-minutes thereafter. Your machine will reboot automatically at 5PM if you do not initiate the reboot prior to that. Please save your work and click 'RestartNow' to reboot immediately or 'RestartLater' to defer.
"@
Write-Log -Message "Displaying prompt #$deferralCount to user."
$proceed = Show-InstallationPrompt -Title 'Scheduled Restart' -Message $message -ButtonRightText 'RestartNow' -ButtonLeftText 'RestartLater'
Write-Log -Message "User selected '$proceed' during deferral attempt #$deferralCount."
if ($proceed -eq 'RestartNow') {
Write-Log -Message "User chose to restart now. Initiating reboot..."
Restart-Computer -Force
break
} else {
Write-Log -Message "User deferred the restart. Continuing to next scheduled prompt..."
}
}
# Final check: If reboot is still pending and current time is past 5 PM
$finalCheckTime = Get-Date
if ($finalCheckTime -gt $todayDate.AddHours(17)) {
Write-Log -Message "Current time is past 5 PM. Checking if reboot is still pending..."
# Re-check reboot status in case it changed during the day
$reboot = Get-PendingReboot
if ($reboot.IsSystemRebootPending -or
$reboot.IsCBServicingRebootPending -or
$reboot.IsWindowsUpdateRebootPending -or
$reboot.IsSCCMClientRebootPending) {
Write-Log -Message "Reboot still pending after 5 PM. Initiating forced restart..."
Restart-Computer -Force
} else {
Write-Log -Message "Reboot no longer pending after 5 PM. No action needed."
}
}
}
else {
Write-Log -Message "No pending reboot was detected on this device; skipping restart process."
}