0

Remotely Check Pending Reboot Status Using Powershell

In the world of system administration, you will eventually have a need to check if a server needs a reboot or simply check pending reboot status. After some scouring on the internet I’ve come up with a Powershell script to let me know if a server needs a reboot. The best part about it, is that it can all be done remotely. No need to RDP into multiple servers or computers and do it manually. Also, it will tell you an easy True or False if it needs a reboot. Let’s move on to the script.

Remotely Check Pending Reboot Status Powershell Script

Function Get-PendingRebootStatus {

<#
.Synopsis
    This will check to see if a server or computer has a reboot pending.
    For updated help and examples refer to -Online version.
 

.DESCRIPTION
    This will check to see if a server or computer has a reboot pending.
    For updated help and examples refer to -Online version.


.NOTES   
    Name: Get-PendingRebootStatus
    Author: The Sysadmin Channel
    Version: 1.00
    DateCreated: 2018-Jun-6
    DateUpdated: 2018-Jun-6

.LINK
    https://thesysadminchannel.com/remotely-check-pending-reboot-status-powershell -


.PARAMETER ComputerName
    By default it will check the local computer.

    
    .EXAMPLE
    Get-PendingRebootStatus -ComputerName PAC-DC01, PAC-WIN1001

    Description:
    Check the computers PAC-DC01 and PAC-WIN1001 if there are any pending reboots.

#>

    [CmdletBinding()]
    Param (
        [Parameter(
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            Position=0)]

        [string[]]     $ComputerName = $env:COMPUTERNAME,

        [switch]       $ShowErrors

    )


    BEGIN {
        $ErrorsArray = @()
    }

    PROCESS {
        foreach ($Computer in $ComputerName) {
            try {
                $PendingReboot = $false


                $HKLM = [UInt32] "0x80000002" 
                $WMI_Reg = [WMIClass] "\\$Computer\root\default:StdRegProv"

                if ($WMI_Reg) {
                    if (($WMI_Reg.EnumKey($HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\")).sNames -contains 'RebootPending') {$PendingReboot = $true}
                    if (($WMI_Reg.EnumKey($HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\")).sNames -contains 'RebootRequired') {$PendingReboot = $true}

                    #Checking for SCCM namespace
                    $SCCM_Namespace = Get-WmiObject -Namespace ROOT\CCM\ClientSDK -List -ComputerName $Computer -ErrorAction Ignore
                    if ($SCCM_Namespace) {
                        if (([WmiClass]"\\$Computer\ROOT\CCM\ClientSDK:CCM_ClientUtilities").DetermineIfRebootPending().RebootPending -eq 'True') {$PendingReboot = $true}    
                    }


                    if ($PendingReboot -eq $true) {
                        $Properties = @{ComputerName   = $Computer.ToUpper()
                                        PendingReboot  = 'True'
                                        }
                        $Object = New-Object -TypeName PSObject -Property $Properties | Select ComputerName, PendingReboot
                    } else {
                        $Properties = @{ComputerName   = $Computer.ToUpper()
                                        PendingReboot  = 'False'
                                        }
                        $Object = New-Object -TypeName PSObject -Property $Properties | Select ComputerName, PendingReboot
                    }
                }
                
            } catch {
                $Properties = @{ComputerName   = $Computer.ToUpper()
                                PendingReboot  = 'Error'
                                }
                $Object = New-Object -TypeName PSObject -Property $Properties | Select ComputerName, PendingReboot

                $ErrorMessage = $Computer + " Error: " + $_.Exception.Message
                $ErrorsArray += $ErrorMessage

            } finally {
                Write-Output $Object

                $Object         = $null
                $ErrorMessage   = $null
                $Properties     = $null
                $WMI_Reg        = $null
                $SCCM_Namespace = $null
            }
        }
        if ($ShowErrors) {
            Write-Output "`n"
            Write-Output $ErrorsArray
        }
    }

    END {}
}

Get-PendingRebootStatus

How to run the Get-PendingRebootStatus script

In order to the run the script there are a couple of things you need to do.  First and foremost, you need to set your execution policy to RemoteSigned.  This is a standard with running any Powershell script.

Next you need to dot source the script since it is a function.  To dot source the script do the following:

  • Copy the script above and save it any location. In this example I’ll save it to my C:\_Scripts folder.
  • Within the Powershell Window type: . .\_Scripts\Get-PendingRebootStatus.ps1 – Note the two dots before the backslash.

Dot-Source Get-PendingRebootstatus
 

Hopefully this article has helped you to track down the AD Account Lock Out Source.  Let me know what you think. Also, consider subscribing to our Youtube Channel to get video demos and other related sysadmin content.

Remotely Check Pending Reboot Status Using Powershell
5 (100%) 19 votes

Paul Contreras

Hi, my name is Paul and I am a Sysadmin who enjoys working on various technologies from Microsoft, VMWare, Cisco and many others. Join me as I document my trials and tribulations of the daily grind of System Administration.