Want this feature implemented, too? Please upvote by clicking Thumbs up!

(Posts as a reply won't be published in this feature request thread. Read Me!)


User Story

As we feel its a basic thing, and really nice to know information for server administrators if thir server is waiting for a reboot after a Windows Update or Software been installed. Even though this should be done automaticly , its not alwayes working as intended.

Details of User Story

We been using this PS script from Microsoft , but as we bought PTRG we would have hoped for a sensor that could do the same:

>#----------------------------------------------------------------------
>----------- #The sample scripts are not supported under any Microsoft 
>standard support #program or service. The sample scripts are provided 
>AS IS without warranty #of any kind. Microsoft further disclaims all 
>implied warranties including, #without limitation, any implied 
>warranties of merchantability or of fitness for #a particular purpose. 
>The entire risk arising out of the use or performance of #the sample 
>scripts and documentation remains with you. In no event shall 
>#Microsoft, its authors, or anyone else involved in the creation, 
>production, or #delivery of the scripts be liable for any damages 
>whatsoever (including, #without limitation, damages for loss of 
>business profits, business interruption, #loss of business information, 
>or other pecuniary loss) arising out of the use #of or inability to use 
>the sample scripts or documentation, even if Microsoft #has been 
>advised of the possibility of such damages
>#----------------------------------------------------------------------
>-----------
>
>#requires -version 3.0
>
><#
>.SYNOPSIS
>The PowerShell script which can be used to check if the server is pending reboot.
>.DESCRIPTION
>The PowerShell script which can be used to check if the server is pending reboot.
>.PARAMETER  ComputerName
>Gets the server reboot status on the specified computer.
>.EXAMPLE
>C:\PS> C:\Script\FindServerIsPendingReboot.ps1 -ComputerName "WIN-VU0S8","WIN-FJ6FH","WIN-FJDSH","WIN-FG3FH"
>
>ComputerName  RebootIsPending
>------------  ---------------
>WIN-VU0S8  False
>WIN-FJ6FH  True
>WIN-FJDSH  True
>WIN-FG3FH  True
>
>This command will get the reboot status on the specified remote computers.
>#>
>param
>(
>[Parameter(Mandatory=$false,ValueFromPipeline=$true)]
>[String[]]$ComputerName=$env:COMPUTERNAME
>)
>
>Foreach($cn in $ComputerName)
>{
>#Declare the variable
>$PendingFile = $false
>$AutoUpdate = $false
>$CBS = $false
>$SCCMPending = $false
>
>#Determine PendingFileRenameOperations exists of not $PendFileKeyPath = 
>"HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\"
>
>Invoke-Command -ComputerName $cn -ScriptBlock{ Get-ItemProperty -Path 
>$using:PendFileKeyPath -name PendingFileRenameOperations} -ErrorAction 
>SilentlyContinue |` 
>Foreach{If($_.PendingFileRenameOperations){$PendingFile = 
>$true}Else{$PendingFile = $false}}
>
>#Determine RebootRequired subkey exists or not $AutoUpdateKeyPath = 
>"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update"
>Invoke-Command -ComputerName $cn -ScriptBlock {Test-Path -Path 
>"$using:AutoUpdateKeyPath\RebootRequired"} |` Foreach{If($_ -eq 
>$true){$AutoUpdate = $true}Else{$AutoUpdate = $false}}
>
>#Determine SCCM 2012 reboot require
>$SCCMReboot = Invoke-CimMethod -Namespace 'Root\ccm\clientSDK' 
>-ClassName 'CCM_ClientUtilities' -ComputerName $cn ` -Name 
>'DetermineIfRebootPending' -ErrorAction SilentlyContinue
>
>If($SCCMReboot)
>{
>If($SCCMReboot.RebootPending -or $SCCMReboot.IsHardRebootPending) { 
>$SCCMPending = $true } }
>
>#Determine Component-Based Servicing reboot require #The servicing 
>stack is available on all Windows Vista and Windows Server 2008 installations.
>$CBSKeyPath = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\"
>Invoke-Command -ComputerName $cn -ScriptBlock {Test-Path -Path 
>"$using:CBSKeyPath\RebootPending"} |` Foreach{If($_ -eq $true){$CBS = 
>$true}Else{$CBS = $false}}
>
>If($PendingFile -or $AutoUpdate -or $CBS -or $SCCMPending) { 
>[PSCustomObject]@{ComputerName = $cn;RebootIsPending = $true} } Else { 
>[PSCustomObject]@{ComputerName = $cn;RebootIsPending = $false} } }

Acceptance criteria

  • Registery Check is the most used so if this could be working it would solve most cases.

Status

Open


Article Comments

Hi Hillerod Kommune.

I had the same need as you, and I have ended up with this litle PS script, it does the job for me.

param([string]$computername = "")
try{
$baseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine","$computername",[Microsoft.Win32.RegistryView]::Registry64 ) 
$key = $baseKey.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Component Based Servicing") 
$subkeys = $key.GetSubKeyNames() 
$key.Close() 
$baseKey.Close()
}
catch{
Write-Host "Reboot Pending:2"; exit 2 
}

if($subkeys.Contains("RebootPending")) { 
Write-Host "Reboot Pending:1"; exit 1 } 
else { 
Write-Host "Reboot Pending:0"; exit 0 }

Since it is 64 Bit Powershell It should be started by PSX64 Parametere are like this "-f="pendingreboot.ps1" -p="%host""


Oct, 2022 - Permalink