Test-PendingReboot.ps1


<#PSScriptInfo
 
.VERSION 1.1
 
.GUID fe3d3698-52fc-40e8-a95c-bbc67a507ed1
 
.AUTHOR Adam Bertram
 
.COMPANYNAME Adam the Automator, LLC
 
.COPYRIGHT
 
.DESCRIPTION This function tests various registry values to see if the local computer is pending a reboot.
 
.TAGS
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
.SYNOPSIS
    This function tests various registry values to see if the local computer is pending a reboot
.NOTES
    Inspiration from: https://gallery.technet.microsoft.com/scriptcenter/Get-PendingReboot-Query-bdb79542
.EXAMPLE
    PS> Test-PendingReboot
     
    This example checks various registry values to see if the local computer is pending a reboot.
#>

[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    [string]$ComputerName,
    
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [pscredential]$Credential
)
process {
    $ErrorActionPreference = 'Stop'
    try
    {
        $connParams = @{
            'ComputerName' = $ComputerName
        }
        if ($PSBoundParameters.ContainsKey('Credential')) {
            $connParams.Credential = $Credential
        }

        $cimSession = New-CimSession @connParams
        $OperatingSystem = Get-CimInstance -CimSession $cimSession -ClassName Win32_OperatingSystem -Property BuildNumber, CSName
        
        # If Vista/2008 & Above query the CBS Reg Key
        If ($OperatingSystem.BuildNumber -ge 6001)
        {
            $PendingReboot = Invoke-Command @connParams -ScriptBlock { Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing' -Name 'RebootPending' -ErrorAction SilentlyContinue }
            if ($PendingReboot)
            {
                Write-Verbose -Message 'Reboot pending detected in the Component Based Servicing registry key'
                return $true
            }
        }
        
        # Query WUAU from the registry
        $PendingReboot = Invoke-Command @connParams -ScriptBlock { Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update' -Name 'RebootRequired' -ErrorAction SilentlyContinue }
        if ($PendingReboot)
        {
            Write-Verbose -Message 'WUAU has a reboot pending'
            return $true
        }
        
        # Query PendingFileRenameOperations from the registry
        $PendingReboot = Invoke-Command @connParams -ScriptBlock { Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name 'PendingFileRenameOperations' -ErrorAction SilentlyContinue }
        if ($PendingReboot -and $PendingReboot.PendingFileRenameOperations)
        {
            Write-Verbose -Message 'Reboot pending in the PendingFileRenameOperations registry value'
            return $true
        }
        $false
    }
    catch
    {
        Write-Error -Message $_.Exception.Message
    }
}