Obvykle poté, co uživatel nainstaluje ovladač, aktualizaci (software nebo systém) nebo software nebo provede nějaké změny konfigurace na počítači klienta nebo serveru Windows, bude uživatel vyzván k restartování systému. V tomto příspěvku vás provedeme kroky, jak na to zkontrolujte, zda v počítači se systémem Windows není čekáno na restartování .
Jak zkontrolovat čekající restart na počítači se systémem Windows
Po dokončení mnoha úloh operačního systému Windows je někdy počítač nucen vyžadovat restartování. Když jste přihlášeni a jste v aktivní relaci, budete upozorněni, že čeká na restartování nebo že je vyžadováno nějaké vyskakovací okno nebo upozornění – které můžete buď odmítnout, nebo přijmout a restartovat Windows. Ale v některých situacích, kdy nechcete nebo nemůžete okamžitě restartovat počítač – například máte nějakou nedokončenou práci, kterou musíte dokončit před restartováním, nebo jste právě nainstalovali aktualizace na produkční server a tento server může nebýt hned restartován.
V situacích, jako je tento, zejména pokud jde o druhý jmenovaný, můžete na restart zapomenout a později si uvědomíte, že některé servery nebo klientské počítače je třeba restartovat, ale nyní nejste schopni určit, který z počítačů — v této situaci, můžete zkontrolovat nevyřízený restart na počítači se systémem Windows pomocí a PowerShell skript.
Nyní, když čeká na restart, systém Windows přidá některé hodnoty registru nebo příznaky, které to označí v následujícím umístění registru s přidruženými hodnotami a podmínkami, jak je uvedeno v tabulce níže. Klíč Hodnota Stav HKLM:\SOFTWARE\Microsoft\Updates UpdateExeVolatile Hodnota je jiná než 0 HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations hodnota existuje HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations2 hodnota existuje HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Automatická aktualizace\RestartRequired ŽE klíč existuje HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\Pending ŽE Existují všechny podklíče GUID HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting ŽE klíč existuje HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce DVDRebootSignal hodnota existuje HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Service\RebootPending ŽE klíč existuje HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootInProgress ŽE klíč existuje HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Service\PackagesPending ŽE klíč existuje HKLM:\SOFTWARE\Microsoft\ServerManager\CurrentRebootAttempts ŽE klíč existuje HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon JoinDomain hodnota existuje HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon Vyhněte seSpnSet hodnota existuje HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName Název počítače Hodnota ComputerName v HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName je jiná
Protože jsme identifikovali příslušné cesty registru, místo ručního procházení registrem, protože můžete zapomenout zkontrolovat jednu cestu registru nebo prostě zapomenout, kterou chcete zkontrolovat, můžete vytvořit a spustit skript Check-PendingReboot.ps1 pomocí níže uvedeného kódu k automatizaci úlohy kontroly všech klíčů registru ve výše uvedené tabulce.
[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 } } }
Prostřednictvím rozhraní můžete poskytnout tolik serverů, kolik chcete Název počítače parametr ve skriptu, který se vrátí Skutečný nebo Nepravdivé spolu s názvem serveru. Můžete spustit skript podobný následujícímu a ujistěte se PowerShell Remoting je nastaven a dostupný na vašich serverech.
PS51> .\Test-PendingReboot.ps1 -Server SRV1,SRV2,SRV3,etc
Číst : Jak naplánovat skript PowerShell v Plánovači úloh
Pomocí skriptu PowerShell můžete dotazovat jeden nebo všechny počítače v doméně nebo ručně zadat názvy serverů, abyste určili počítače čekající na restartování. Jakmile je identifikován, můžete počítač ihned restartovat nebo vytvořit seznam, který chcete restartovat později.
Nyní čtěte : Jak vzdáleně restartovat počítač se systémem Windows pomocí PowerShellu
Co to znamená, že čeká na restart systému Windows?
Obecně platí, že k nevyřízenému požadavku na restartování dochází, když program nebo instalace provede změnu souborů, klíčů registru, služeb nebo nastavení operačního systému, která potenciálně ponechá systém v přechodném stavu. V případě, že získáte Byl detekován čekající restart upozornění, jednoduše to znamená, že na počítači čekají aktualizace a před instalací dalších aktualizací je nutné provést restart.
Číst :
- Jak zakázat nebo povolit upozornění na restartování aktualizace
- Windows Update Čeká na instalaci nebo stažení, inicializaci atd
Jak zkontrolovat čekající restarty v registru?
Můžete to udělat pomocí vyhledávání v registru Windows pro Je vyžadován restart klíč. V tabulce výše v tomto příspěvku jsme identifikovali příslušné umístění registru pro čekající klíče registru pro restartování. Pokud chcete zobrazit upozornění, když váš počítač vyžaduje restartování k dokončení instalace aktualizace Windows, klepněte na Start > Nastavení > Aktualizace a zabezpečení > Aktualizace systému Windows > Pokročilé možnosti . Zapněte nebo vypněte tlačítko pro Zobrazit upozornění, když váš počítač vyžaduje restartování k dokončení aktualizace volba.
Přečtěte si také : Čeká se na opravu systému, která vyžaduje restart .