Di solito, dopo che un utente installa un driver, un aggiornamento (software o sistema) o un software o apporta alcune modifiche alla configurazione su un computer client o server Windows, all’utente verrà richiesto di riavviare il sistema. In questo post, ti guideremo attraverso i passaggi su come verificare il riavvio in sospeso su un computer Windows.

Come verificare il riavvio in sospeso su un computer Windows

Al completamento di molte attività del sistema operativo Windows, a volte il computer è costretto a richiedere un riavvio. Dopo aver effettuato l’accesso e in una sessione attiva, verrai avvisato che un riavvio è in sospeso o richiesto da una finestra popup o notifica, che puoi ignorare o accettare per riavviare Windows. Tuttavia, in alcune situazioni in cui non si desidera o non è possibile riavviare immediatamente la macchina, ad esempio, è necessario completare del lavoro incompiuto prima del riavvio oppure si sono appena installati gli aggiornamenti su un server di produzione e tale server può essere riavviato immediatamente.

In scenari come questo, soprattutto per quanto riguarda quest’ultimo, potresti dimenticare il riavvio e in un secondo momento ti rendi conto che alcuni server o macchine client devono essere riavviati ma ora non sei in grado di identificare quale delle macchine: in questa situazione, puoi essere in grado di verificare il riavvio in sospeso sul computer Windows utilizzando uno script PowerShell.

Ora, quando un riavvio è in sospeso, Windows aggiungerà alcuni valori o flag di registro per indicarlo nella seguente posizione del registro con i valori e le condizioni associati, come mostrato nella tabella seguente.

KeyValueConditionHKLM:\SOFTWARE\Microsoft\UpdatesUpdateExeVolatileValue è diverso da 0HKLM:\SYSTEM\CurrentControlSet\Control\Session ManagerPendingFileRenameOperationsvalue existsHKLM:\SYSTEM\CurrentControlSet\Control\Session ManagerPendingFileRenameOperations2value existsHKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update \RebootRequiredNAkey existsHKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\PendingNAAny GUID sottochiavi existHKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReportingNAkey existsHKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceDVDRebootSignalvalue existsHKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPendingNAkey existsHKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootInProgressNAkey existsHKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\PackagesPendingNAkey existsHKLM:\ SOFTWARE\Microsoft\ ServerManager\CurrentRebootAttemptsNAkey existsHKLM:\SYSTEM\CurrentControlSet\Services\NetlogonJoinDomainvalue existsHKLM:\SYSTEM\CurrentControlSet\Services\NetlogonAvoidSpnSetvalue existsHKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerNameComputerNameValue ComputerName in HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName is different

Poiché abbiamo identificato i percorsi di registro pertinenti, invece di scorrere manualmente il registro perché potresti dimenticare di controllare un percorso di registro o semplicemente dimenticare quali controllare, puoi creare ed eseguire un Check-PendingReboot.ps1 utilizzando il codice seguente per automatizzare l’attività di controllo di tutte le chiavi di registro nella tabella sopra.

[CmdletBinding()] param( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string[]]$ComputerName, [Parameter()] [V alidateNotNullOrEmpty()] [pscredential]$Credential )$ErrorActionPreference=’Stop’$scriptBlock={$VerbosePreference=$using:VerbosePreference function Test-RegistryKey { [OutputType(‘bool’)] [CmdletBinding()] param ( [Parameter( Obbligatorio)] [ValidateNotNullOrEmpty()] [stringa]$Key ) $ErrorActionPreference=’Stop’if (Get-Item-Path $Key-ErrorAction Ignore) { $true } }function Test-RegistryValue { [OutputType(‘bool’) ] [CmdletBinding()] param ( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [stringa]$Key,[Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [stringa]$Value ) $ErrorActionPreference=’Stop’if ( Get-ItemProperty-Path $Key-Name $Value-ErrorAction Ignore) { $true } }function Test-RegistryValueNotNull { [OutputType(‘bool’)] [CmdletBinding()] param ( [Parameter(Mandatory)] [ValidateNotNullOrEmpty() ] [stringa]$Key,[Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [stringa]$Value ) $ErrorActionPreference=’Stop’if (($regVal=Get-ItemProperty-Path $Key-Name $Value-ErrorAction Ignore)-and $regVal.($Value)) { $true } }# Aggiunto”test-path”a ogni test che non utilizzava una funzione personalizzata dall’alto poiché # viene generata un’eccezione quando Get-ItemProperty o Get-ChildItem viene passato un percorso chiave inesistente $test=@( { Test-RegistryKey-Key’HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending’} { Test-RegistryKey-Key’HKLM:\Software\Microsoft\ Windows\CurrentVersion\Component Based Servicing\RebootInProgress’} { Test-RegistryKey-Key’HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired’} { Test-RegistryKey-Key’HKLM:\Software\Microsoft \Windows\CurrentVersion\Component Based Servicing\PackagesPending’} { Test-RegistryKey-Key’HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Aggiornamento automatico\PostRebootReporting’} { Test-RegistryValueNotNull-Key’HKLM:\SYSTEM\ CurrentControlSet\Control\Session Manager’-Value’PendingFileRenameOperations’} { Test-RegistryValueNotNull-Key’HK LM:\SYSTEM\CurrentControlSet\Control\Session Manager’-Value’PendingFileRenameOperations2′} { # Aggiunto il test per verificare prima se la chiave esiste, l’utilizzo di”ErrorAction ignore”restituirà erroneamente $true’HKLM:\SOFTWARE\Microsoft\Updates’| Where-Object { test-path $_-PathType Container } | ForEach-Object { (Get-ItemProperty-Path $_-Name’UpdateExeVolatile’| Select-Object-ExpandProperty UpdateExeVolatile)-ne 0 } } { Test-RegistryValue-Key’HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce’-Value’DVDRebootSignal’} { Test-RegistryKey-Key’HKLM:\SOFTWARE\Microsoft\ServerManager\CurrentRebootAttemps’} { Test-RegistryValue-Key’HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon’-Value’JoinDomain’} { Test-RegistryValue-Key’HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon’-Value’AvoidSpnSet’} { # Aggiunto test per controllare prima se le chiavi esistono, altrimenti ogni gruppo restituirà $Null # Potrebbe essere necessario valutare cosa significa se una o entrambe queste chiavi non esistono (‘HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName’| Where-Object { test-path $_ } | %{ (Get-ItemProperty-Path $_ ).ComputerName } )-ne (‘HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName’| Where-Object { Test-Path $_ } | %{ (Get-ItemProperty-Path $_ ).ComputerName } ) } { # Aggiunto test per verificare prima se la chiave esiste’HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\Pending’| Where-Object { (Test-Path $_)-and (Get-ChildItem-Path $_) } | ForEach-Object { $true } } )foreach ($test in $test) { Write-Verbose”Esecuzione scriptblock: [$($test.ToString())]”if (& $test) { $true break } } } foreach ($computer in $ComputerName) { try { $connParams=@{‘ComputerName’=$computer } if ($PSBoundParameters.ContainsKey(‘Credential’)) { $connParams.Credential=$Credential }$output=@{ ComputerName=$computer IsPendingReboot=$false }$psRemotingSession=New-PSSession @connParams if (-not ($output.IsPendingReboot=Invoke-Command-Session $psRemotingSession-ScriptBlock $scriptBlock)) { $output.IsPendingReboot=$false } [pscustomobject ]$output } catch { Write-Error-Message $_.Exception.Message } finally { if (Get-Variable-Name’psRemotingSession’-ErrorAction Ignore) { $psRemotingSession | Remove-PSSession } } }

Puoi fornire tutti i server che desideri tramite il parametro ComputerName nello script che restituirà True o False insieme al nome del server. È possibile eseguire lo script simile al seguente e assicurarsi che PowerShell Remoting è configurato e disponibile sui tuoi server.

PS51>.\Test-PendingReboot.ps1-Server SRV1,SRV2,SRV3,etc

Leggi: Come pianificare lo script PowerShell nell’Utilità di pianificazione

Utilizzando lo script PowerShell, puoi interrogare uno o tutti i computer nel dominio o fornire manualmente i nomi dei server per determinare le macchine in attesa di riavvio. Una volta identificato, puoi riavviare subito le macchine o creare un elenco per riavviare in seguito.

Ora leggi: Come riavviare in remoto un computer Windows utilizzando PowerShell

Cosa significa che un riavvio di Windows è in sospeso?

In genere, una richiesta di riavvio in sospeso si verifica quando un programma o un’installazione modifica file, chiavi di registro, servizi o impostazioni del sistema operativo lasciando potenzialmente il sistema in uno stato transitorio. Nel caso in cui ricevi la notifica È stato rilevato un riavvio in sospeso, indica semplicemente che gli aggiornamenti sono in sospeso sulla macchina e che è necessario eseguire un riavvio prima di poter installare eventuali aggiornamenti aggiuntivi.

Leggi:

Come controllare i riavvii in sospeso nel registro?

Puoi farlo cercando nel registro di Windows la chiave RebootRequired. Nella tabella sopra in questo post, abbiamo identificato la posizione del registro pertinente per le chiavi di registro di riavvio in attesa. Se desideri mostrare una notifica quando il tuo PC richiede un riavvio per completare l’installazione di un aggiornamento di Windows, fai clic su Start > Impostazioni > Aggiornamento e sicurezza > Aggiornamenti di Windows > Opzioni avanzate. Attiva o disattiva il pulsante per l’opzione Mostra una notifica quando il PC richiede un riavvio per completare l’aggiornamento.

Leggi anche: C’è una riparazione del sistema in sospeso che richiede un riavvio da completare.

Categories: IT Info