De obicei, după ce un utilizator instalează un driver, o actualizare (software sau sistem) sau software sau face unele modificări de configurare pe un client sau pe un server Windows, utilizatorului i se va solicita să repornească sistemul. În această postare, vă vom ghida prin pașii cum să faceți verificați Pending Reboot pe un computer Windows .
Cum să verificați Pending Reboot pe un computer Windows
La finalizarea multor sarcini ale sistemului de operare Windows, uneori computerul este forțat să necesite o repornire. În timp ce sunteți autentificat și într-o sesiune activă, veți fi notificat că o repornire este în așteptare sau este necesară printr-o casetă pop-up sau o notificare - pe care o puteți închide sau accepta pentru a reporni Windows. Dar, în unele situații în care nu doriți sau nu puteți reporni imediat mașina - de exemplu, aveți o lucrare neterminată pe care trebuie să o finalizați înainte de a reporni sau tocmai ați instalat actualizări pe un server de producție și acel server poate nu fi repornit imediat.
În scenarii ca acesta, mai ales în ceea ce privește cel din urmă, este posibil să uitați de repornire și, mai târziu, să realizați că unele servere sau mașini client trebuie repornite, dar acum nu puteți identifica care dintre mașini - în această situație, puteți să verificați Pending Reboot pe computerul Windows folosind un PowerShell scenariu.
Acum, când o repornire este în așteptare, Windows va adăuga câteva valori de registry sau semnalizatoare pentru a indica acest lucru în următoarea locație de registry cu valorile și condițiile asociate, așa cum se arată în tabelul de mai jos. Cheie Valoare Condiție HKLM:\SOFTWARE\Microsoft\Actualizări UpdateExeVolatil Valoarea este altceva decât 0 HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations valoare există HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations2 valoare există HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired ACEA cheia există HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\Pending ACEA Există orice subcheie GUID HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting ACEA cheia există HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce DVDRebootSignal valoare există HKLM:\Software\Microsoft\Windows\CurrentVersion\Servicii bazate pe componente\RebootPending ACEA cheia există HKLM:\Software\Microsoft\Windows\CurrentVersion\Servicii bazate pe componente\RebootInProgress ACEA cheia există HKLM:\Software\Microsoft\Windows\CurrentVersion\Servicii bazate pe componente\PackagesPending ACEA cheia există HKLM:\SOFTWARE\Microsoft\ServerManager\CurrentRebootAttempts ACEA cheia există HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon JoinDomain valoare există HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon EvitațiSpnSet valoare există HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName Numele calculatorului Valoarea ComputerName în HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName este diferită
Deoarece am identificat căile de registry relevante, în loc să parcurgeți manual registrul, deoarece este posibil să uitați să verificați o cale de registry sau pur și simplu să uitați pe care să le verificați, puteți creați și rulați un script Check-PendingReboot.ps1 folosind codul de mai jos pentru a automatiza sarcina de verificare a tuturor cheilor de registry din tabelul de mai sus.
interfața de rețea akamai
[CmdletBinding()] param( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string[]]$ComputerName, [Parameter()] [ValidateNotNullOrEmpty()] [pscredential]$Credential )
$ErrorActionPreference = 'Stop'
$scriptBlock = {
$VerbosePreference = $using:VerbosePreference function Test-RegistryKey { [OutputType('bool')] [CmdletBinding()] param ( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$Key ) $ErrorActionPreference = 'Stop'
if (Get-Item -Path $Key -ErrorAction Ignore) { $true } }
function Test-RegistryValue { [OutputType('bool')] [CmdletBinding()] param ( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$Key,
[Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$Value ) $ErrorActionPreference = 'Stop'
if (Get-ItemProperty -Path $Key -Name $Value -ErrorAction Ignore) { $true } }
function Test-RegistryValueNotNull { [OutputType('bool')] [CmdletBinding()] param ( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$Key,
[Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$Value ) $ErrorActionPreference = 'Stop'
if (($regVal = Get-ItemProperty -Path $Key -Name $Value -ErrorAction Ignore) -and $regVal.($Value)) { $true } }
# Added "test-path" to each test that did not leverage a custom function from above since # an exception is thrown when Get-ItemProperty or Get-ChildItem are passed a nonexistant key path $tests = @( { 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\Auto Update\PostRebootReporting' } { Test-RegistryValueNotNull -Key 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Value 'PendingFileRenameOperations' } { Test-RegistryValueNotNull -Key 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Value 'PendingFileRenameOperations2' } { # Added test to check first if key exists, using "ErrorAction ignore" will incorrectly return $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' } { # Added test to check first if keys exists, if not each group will return $Null # May need to evaluate what it means if one or both of these keys do not exist ( '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 } ) } { # Added test to check first if key exists 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\Pending' | Where-Object { (Test-Path $_) -and (Get-ChildItem -Path $_) } | ForEach-Object { $true } } )
foreach ($test in $tests) { Write-Verbose "Running 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 } } }
Puteți furniza câte servere doriți prin intermediul Numele calculatorului parametrul din script care va reveni Adevărat sau Fals împreună cu numele serverului. Puteți executa scriptul similar cu următorul și asigurați-vă PowerShell Remoting este configurat și disponibil pe serverele dvs.
PS51> .\Test-PendingReboot.ps1 -Server SRV1,SRV2,SRV3,etc
Citit : Cum să programați scriptul PowerShell în Task Scheduler
Folosind scriptul PowerShell, puteți interoga unul sau toate computerele din domeniu sau puteți furniza manual numele de server pentru a determina mașinile în așteptarea repornirii. Odată identificat, puteți reporni mașinile imediat sau puteți face o listă pentru a reporni mai târziu.
Acum citește : Cum să reporniți de la distanță computerul Windows folosind PowerShell
Ce înseamnă că o repornire Windows este în așteptare?
În general, o solicitare de repornire în așteptare apare atunci când un program sau o instalare face o modificare a fișierelor, cheilor de registry, serviciilor sau setărilor sistemului de operare, lăsând sistemul într-o stare tranzitorie. În cazul în care obțineți A fost detectată o repornire în așteptare notificare, indică pur și simplu că actualizările sunt în așteptare pe mașină și trebuie efectuată o repornire înainte de a putea fi instalate actualizări suplimentare.
Citit :
- Cum să dezactivați sau să activați notificarea de repornire a actualizării
- Windows Update În așteptare instalare sau descărcare, inițializare etc
Cum se verifică repornirile în așteptare în registru?
Puteți face acest lucru prin căutând în Registrul Windows pentru RebootRequired cheie. În tabelul de mai sus din această postare, am identificat locația de registru relevantă pentru cheile de registru de repornire în așteptare. Dacă doriți să afișați o notificare când computerul necesită repornire pentru a finaliza instalarea actualizării Windows, faceți clic pe start > Setări > Actualizare și securitate > Actualizări Windows > Opțiuni avansate . Comutați butonul la pornit sau dezactivat pentru Afișați o notificare când computerul necesită repornire pentru a finaliza actualizarea opțiune.
Citește și : Există o reparație a sistemului în așteptare care necesită o repornire pentru a se finaliza .