Обикновено, след като потребителят инсталира драйвер, актуализация (софтуер или система) или софтуер, или направи някои промени в конфигурацията на Windows клиент или сървърна машина, потребителят ще бъде подканен да рестартира системата. В тази публикация ще ви преведем през стъпките как да проверете за чакащо рестартиране на компютър с Windows .
Как да проверите за чакащо рестартиране на компютър с Windows
При завършване на много задачи на Windows OS, понякога компютърът трябва да се рестартира. Докато сте влезли и сте в активна сесия, ще бъдете уведомени, че предстои рестартиране или се изисква от някакъв изскачащ прозорец или известие - което можете или да отхвърлите, или да приемете, за да рестартирате Windows. Но в някои ситуации, при които не искате или не можете незабавно да рестартирате машината - например имате някаква незавършена работа, която трябва да завършите, преди да рестартирате, или току-що сте инсталирали актуализации на производствен сървър и този сървър може не се рестартира веднага.
В сценарии като този, особено що се отнася до последното, може да забравите за рестартирането и по-късно да разберете, че някои сървъри или клиентски машини трябва да бъдат рестартирани, но сега не сте в състояние да идентифицирате коя от машините — в тази ситуация, можете да можете да проверите за чакащо рестартиране на компютър с Windows, като използвате a PowerShell сценарий.
Сега, когато предстои рестартиране, Windows ще добави някои стойности или флагове в системния регистър, за да посочи това в следното местоположение на системния регистър със свързаните стойности и условия, както е показано в таблицата по-долу. Ключ Стойност Състояние HKLM:\СОФТУЕР\Microsoft\Updates UpdateExeVolatile Стойността е нещо различно от 0 HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations съществува стойност HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager Чакащи операции за преименуване на файл2 съществува стойност HKLM:\СОФТУЕР\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired ЧЕ ключът съществува HKLM:\СОФТУЕР\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\Pending ЧЕ Съществуват всякакви GUID подключове HKLM:\СОФТУЕР\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting ЧЕ ключът съществува HKLM:\СОФТУЕР\Microsoft\Windows\CurrentVersion\RunOnce DVDRebootSignal съществува стойност HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending ЧЕ ключът съществува HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootInProgress ЧЕ ключът съществува HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\PackagesPending ЧЕ ключът съществува HKLM:\СОФТУЕР\Microsoft\ServerManager\CurrentRebootAttempts ЧЕ ключът съществува HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon Присъединете се към домейн съществува стойност HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon Избягвайте SpnSet съществува стойност HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName име на компютър Стойността ComputerName в HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName е различна
Тъй като идентифицирахме съответните пътища в регистъра, вместо ръчно да преглеждате регистъра, защото може да забравите да проверите един път в регистъра или просто да забравите кои да проверите, можете създайте и стартирайте скрипт Check-PendingReboot.ps1, използващ кода по-долу за автоматизиране на задачата за проверка на всички ключове в системния регистър в таблицата по-горе.
[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 } } }
Можете да предоставите колкото желаете сървъри чрез име на компютър параметър в скрипта, който ще върне Вярно или Невярно заедно с името на сървъра. Можете да изпълните скрипта, подобен на следния, и да се уверите PowerShell Remoting е настроен и достъпен на вашите сървъри.
PS51> .\Test-PendingReboot.ps1 -Server SRV1,SRV2,SRV3,etc
Прочети : Как да планирате скрипт на PowerShell в Task Scheduler
С помощта на скрипта PowerShell можете да направите запитване към един или всички компютри в домейна или ръчно да предоставите имената на сървъра, за да определите машините, чакащи рестартиране. Веднъж идентифицирани, можете да рестартирате машините веднага или да направите списък за рестартиране по-късно.
Сега прочетете : Как да рестартирате отдалечено компютър с Windows с помощта на PowerShell
Какво означава, че предстои рестартиране на Windows?
Обикновено чакаща заявка за рестартиране възниква, когато програма или инсталация направи промяна във файлове, ключове в системния регистър, услуги или настройки на операционната система, потенциално оставяйки системата в преходно състояние. В случай, че получите Открито е чакащо рестартиране известие, то просто показва, че актуализациите чакат на машината и трябва да се извърши рестартиране, преди да могат да бъдат инсталирани допълнителни актуализации.
Прочети :
xbox one kinect продължава да се изключва
- Как да деактивирате или активирате известието за рестартиране на актуализацията
- Актуализация на Windows Очаква инсталиране или изтегляне, инициализиране и т.н
Как да проверя чакащите рестартирания в системния регистър?
Можете да направите това чрез търсене в системния регистър на Windows за Изисква се рестартиране ключ. В таблицата по-горе в тази публикация сме идентифицирали съответното местоположение в системния регистър за чакащи ключове за рестартиране на системния регистър. Ако искате да покажете известие, когато вашият компютър изисква рестартиране, за да завърши инсталирането на актуализация на Windows, щракнете Започнете > Настройки > Актуализация и сигурност > Актуализации на Windows > Разширени опции . Включете или изключете бутона за Показване на известие, когато вашият компютър изисква рестартиране, за да завърши актуализирането опция.
Прочетете също : Предстои ремонт на системата, който изисква рестартиране, за да завърши .