Reboot Policy using PowerShell and a modified verison of AppdeployToolkit
I needed a way I can reboot a system but give the user 3 prompts before doing so at different time intevals. Also to report those responses to management.
PSAppDeployToolkit (https://psappdeploytoolkit.com/) provided a interesting way of presenting a UI to the user when deployed via SCCM. I modified the UI slightly to achieve a look that was like a notification for the user.
| Parameters | Values | Comments |
|---|---|---|
| AllowRebootPassThru | True/False | Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. |
| EnableScriptTest | True/False | Speeds up the reboot policy to 2 minute intervals between messages. Default is: $false. |
| IgnoreRebootCheck | True/False | Force the system to go through the reboot scenario no matter what. Use in conjunction with EnableScriptTest to allow quicker test of the full check. Default is: $false. |
| ForcePendingReboot | True/False | Force the system reboot if a pending reboot is detected on system no matter the day it rebooted in the past. Ignores the RebootIntervalDays check as well. Default is: $false. |
| ScriptDisabled | True/False | Disables the script from running. Also can be switched by seeting a registry key in HKLM\SOFTWARE\Policies\RebootPolicy with a key of DisableRebootPolicy of 1. Can be controlled by GPO. Default is: $false. |
| RebootIntervalDays | 1,3,5,7,14 | Compares the last reboot date timestamp to number specified; Default is: 7 days |
| MaxReboots | integer | Doesn't allow script to reboot the system more than this number; Safety incase system need multple reboots; Default is: 2 times |
Script logs entries into the registry under HKLM:SOFTWARE\Policies\<Company name>\Logging
| Entry | Values | Comments |
|---|---|---|
| ScriptVersion | Version | |
| ScriptLastRunTime | Date | |
| ScriptLastLogDir | ||
| PolicyRunCount | Counter | Count how many times the script has ran |
| DisableRebootPolicy | 0 or 1 | Exit script if set to be disabled and exit with 0 |
| RebootAttemptCounter | Counter | Check if the reboot counter has hit the max if so kill script |
| ErrorDisabled | 0 or 1 | Triggered set if max reboot is reached |
| RebootCountTotal | Counter | Record total times script has rebooted system |
There is a sub keys to record every instance and acton when ran using julian time format. It is located here: HKLM:SOFTWARE\Policies\<Company name>\Logging\RunLog-<julianDate>
| Entry | Values | Comments |
|---|---|---|
| LastResult | Status are: Running,Disabled,ErrorDisabled,ForcedReboot-Prompt,PendingReboot-Prompt,RequiredReboot-Prompt,NoReboot-Needed,Rebooted-NoUser | |
| PendingRebootWhenRan | 0 or 1 | Logs if Pending Reboot key exists |
| SleepRandomKey | Random 0-300 | logs random number for first use, always use this key for this instance (1 to 5 minutes) |
| LastRebootDate | Date | Logs last time the system rebooted |
| PolicyStartTime | Date | Logs when script started |
| UserLoggedinWhenRan | username | Logs if a user is logged in (actively or inactively) |
| PolicyEndTime | Date | Logs when script ends |
| PromptActionResponse1 | Hide/Reboot | Logs reponse for first prompt |
| PromptActionResponse2 | Hide/Reboot | Logs reponse for second prompt |
Script can also be controlled by a GPO policy. Key will be located here: HKLM:SOFTWARE\Policies\RebootPolicy
| Entry | Values | Comments |
|---|---|---|
| DisableRebootPolicy | 0/1 | Disabled the script entirely if set to 1, no matter what runs it |
Here are meanings of the status messages
| Value | Meaning |
|---|---|
| Running | Script is running |
| Disabled | Script is disabled either by GPO or ScriptDisabled parameter |
| ErrorDisabled | Script Errored because it rebooted system mor than MaxReboots |
| ForcedReboot-Prompt | Script parameter $IgnoreRebootCheck is triggered and prompted user |
| PendingReboot-Prompt | Script detected a pending reboot is required and prompted user |
| RequiredReboot-Prompt | Script detected a reboot is required based last reboot is greater than RebootIntervalDays and prompted user |
| NoReboot-Needed | Script detected no reboot required and notified user |
| Rebooted-NoUser | Script detected no user is logged in and it will reboot the system with no prompt |


