something exciting

Some information about the exciting thing

Table of contents generated with markdown-toc


Function Get-PendingReboot {
    Gets the pending reboot status on a local or remote computer.

    This function will query the registry on a local or remote computer and determine if the
    system is pending a reboot, from Microsoft updates, Configuration Manager Client SDK, Pending Computer
    Rename, Domain Join or Pending File Rename Operations. For Windows 2008+ the function will query the
    CBS registry key as another factor in determining pending reboot state.  "PendingFileRenameOperations"
    and "Auto Update\RebootRequired" are observed as being consistant across Windows Server 2003 & 2008.

    CBServicing = Component Based Servicing (Windows 2008+)
    WindowsUpdate = Windows Update / Auto Update (Windows 2003+)
    CCMClientSDK = SCCM 2012 Clients only (DetermineIfRebootPending method) otherwise $null value
    PendComputerRename = Detects either a computer rename or domain join operation (Windows 2003+)
    PendFileRename = PendingFileRenameOperations (Windows 2003+)
    PendFileRenVal = PendingFilerenameOperations registry value; used to filter if need be, some Anti-
                     Virus leverage this key for def/dat removal, giving a false positive PendingReboot

.PARAMETER ComputerName
    A single Computer or an array of computer names.  The default is localhost ($env:COMPUTERNAME).

    A single path to send error data to a log file.

    PS C:\> Get-PendingReboot -ComputerName (Get-Content C:\ServerList.txt) | Format-Table -AutoSize

    Computer CBServicing WindowsUpdate CCMClientSDK PendFileRename PendFileRenVal RebootPending
    -------- ----------- ------------- ------------ -------------- -------------- -------------
    DC01           False         False                       False                        False
    DC02           False         False                       False                        False
    FS01           False         False                       False                        False

    This example will capture the contents of C:\ServerList.txt and query the pending reboot
    information from the systems contained in the file and display the output in a table. The
    null values are by design, since these systems do not have the SCCM 2012 client installed,
    nor was the PendingFileRenameOperations value populated.

    PS C:\> Get-PendingReboot

    Computer           : WKS01
    CBServicing        : False
    WindowsUpdate      : True
    CCMClient          : False
    PendComputerRename : False
    PendFileRename     : False
    PendFileRenVal     :
    RebootPending      : True

    This example will query the local machine for pending reboot information.

    PS C:\> $Servers = Get-Content C:\Servers.txt
    PS C:\> Get-PendingReboot -Computer $Servers | Export-Csv C:\PendingRebootReport.csv -NoTypeInformation

    This example will create a report that contains pending reboot information.

    Component-Based Servicing:

    PendingFileRename/Auto Update:

    SCCM 2012/CCM_ClientSDK:

    Author:  Brian Wilhite
    Email:   bcwilhite (at)
    Date:    29AUG2012
    PSVer:   2.0/3.0/4.0/5.0
    Updated: 27JUL2015
    UpdNote: Added Domain Join detection to PendComputerRename, does not detect Workgroup Join/Change
             Fixed Bug where a computer rename was not detected in 2008 R2 and above if a domain join occurred at the same time.
             Fixed Bug where the CBServicing wasn't detected on Windows 10 and/or Windows Server Technical Preview (2016)
             Added CCMClient property - Used with SCCM 2012 Clients only
             Added ValueFromPipelineByPropertyName=$true to the ComputerName Parameter
             Removed $Data variable from the PSObject - it is not needed
             Bug with the way CCMClientSDK returned null value if it was false
             Removed unneeded variables
             Added PendFileRenVal - Contents of the PendingFileRenameOperations Reg Entry
             Removed .Net Registry connection, replaced with WMI StdRegProv
             Added ComputerPendingRename

		[Parameter(Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
		[Alias("CN", "Computer")]
		[String[]]$ComputerName = "$env:COMPUTERNAME",

	Begin {  }## End Begin Script Block
	Process {
  Foreach ($Computer in $ComputerName) {
			Try {
				## Setting pending values to false to cut down on the number of else statements
				$CompPendRen, $PendFileRename, $Pending, $SCCM = $false, $false, $false, $false

				## Setting CBSRebootPend to null since not all versions of Windows has this value
				$CBSRebootPend = $null

				## Querying WMI for build version
				$WMI_OS = Get-WmiObject -Class Win32_OperatingSystem -Property BuildNumber, CSName -ComputerName $Computer -ErrorAction Stop

				## Making registry connection to the local/remote computer
				$HKLM = [UInt32] "0x80000002"
				$WMI_Reg = [WMIClass] "\\$Computer\root\default:StdRegProv"

				## If Vista/2008 & Above query the CBS Reg Key
				If ([Int32]$WMI_OS.BuildNumber -ge 6001) {
					$RegSubKeysCBS = $WMI_Reg.EnumKey($HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\")
					$CBSRebootPend = $RegSubKeysCBS.sNames -contains "RebootPending"

				## Query WUAU from the registry
				$RegWUAURebootReq = $WMI_Reg.EnumKey($HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\")
				$WUAURebootReq = $RegWUAURebootReq.sNames -contains "RebootRequired"

				## Query PendingFileRenameOperations from the registry
				$RegSubKeySM = $WMI_Reg.GetMultiStringValue($HKLM, "SYSTEM\CurrentControlSet\Control\Session Manager\", "PendingFileRenameOperations")
				$RegValuePFRO = $RegSubKeySM.sValue

				## Query JoinDomain key from the registry - These keys are present if pending a reboot from a domain join operation
				$Netlogon = $WMI_Reg.EnumKey($HKLM, "SYSTEM\CurrentControlSet\Services\Netlogon").sNames
				$PendDomJoin = ($Netlogon -contains 'JoinDomain') -or ($Netlogon -contains 'AvoidSpnSet')

				## Query ComputerName and ActiveComputerName from the registry
				$ActCompNm = $WMI_Reg.GetStringValue($HKLM, "SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName\", "ComputerName")
				$CompNm = $WMI_Reg.GetStringValue($HKLM, "SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\", "ComputerName")

				If (($ActCompNm -ne $CompNm) -or $PendDomJoin) {
					$CompPendRen = $true

				## If PendingFileRenameOperations has a value set $RegValuePFRO variable to $true
				If ($RegValuePFRO) {
					$PendFileRename = $true

				## Determine SCCM 2012 Client Reboot Pending Status
				## To avoid nested 'if' statements and unneeded WMI calls to determine if the CCM_ClientUtilities class exist, setting EA = 0
				$CCMClientSDK = $null
				$CCMSplat = @{
					NameSpace    = 'ROOT\ccm\ClientSDK'
					Class        = 'CCM_ClientUtilities'
					Name         = 'DetermineIfRebootPending'
					ComputerName = $Computer
					ErrorAction  = 'Stop'
				## Try CCMClientSDK
				Try {
					$CCMClientSDK = Invoke-WmiMethod @CCMSplat
				Catch [System.UnauthorizedAccessException] {
					$CcmStatus = Get-Service -Name CcmExec -ComputerName $Computer -ErrorAction SilentlyContinue
					If ($CcmStatus.Status -ne 'Running') {
						Write-Warning "$Computer`: Error - CcmExec service is not running."
						$CCMClientSDK = $null
				Catch {
					$CCMClientSDK = $null

				If ($CCMClientSDK) {
					If ($CCMClientSDK.ReturnValue -ne 0) {
						Write-Warning "Error: DetermineIfRebootPending returned error code $($CCMClientSDK.ReturnValue)"
					If ($CCMClientSDK.IsHardRebootPending -or $CCMClientSDK.RebootPending) {
						$SCCM = $true

				Else {
					$SCCM = $null

				## Creating Custom PSObject and Select-Object Splat
				$SelectSplat = @{
					Property = (
				New-Object -TypeName PSObject -Property @{
					Computer           = $WMI_OS.CSName
					CBServicing        = $CBSRebootPend
					WindowsUpdate      = $WUAURebootReq
					CCMClientSDK       = $SCCM
					PendComputerRename = $CompPendRen
					PendFileRename     = $PendFileRename
					PendFileRenVal     = $RegValuePFRO
					RebootPending      = ($CompPendRen -or $CBSRebootPend -or $WUAURebootReq -or $SCCM -or $PendFileRename)
				} | Select-Object @SelectSplat

			Catch {
				Write-Warning "$Computer`: $_"
				## If $ErrorLog, log the file to a user specified location/path
				If ($ErrorLog) {
					Out-File -InputObject "$Computer`,$_" -FilePath $ErrorLog -Append
  }## End Foreach ($Computer in $ComputerName)
	}## End Process

	End {  }## End End

}## End Function Get-PendingReboot

Back to Top


Please feel free to copy parts of the script or if you would like to download the entire script, simple click the download button. You can download the complete repository in a zip file by clicking the Download link in the menu bar on the left hand side of the page.

Report Issues

You can report an issue or contribute to this site on GitHub. Simply click the button below and add any relevant notes. I will attempt to respond to all issues as soon as possible.


Back to Top