โดยปกติแล้ว หลังจากที่ผู้ใช้ติดตั้งไดรเวอร์ อัปเดต (ซอฟต์แวร์หรือระบบ) หรือซอฟต์แวร์ หรือทำการเปลี่ยนแปลงการกำหนดค่าบางอย่างบนไคลเอนต์ Windows หรือเครื่องเซิร์ฟเวอร์ ผู้ใช้จะได้รับแจ้งให้รีบูตระบบ ในโพสต์นี้ เราจะแนะนำคุณเกี่ยวกับขั้นตอนวิธีการ ตรวจสอบการรีบูตที่รอดำเนินการบนคอมพิวเตอร์ที่ใช้ Windows .
วิธีตรวจสอบ Pending Reboot บนคอมพิวเตอร์ Windows
เมื่อทำงานหลายอย่างของระบบปฏิบัติการ Windows เสร็จสิ้น บางครั้งคอมพิวเตอร์จำเป็นต้องรีบูต ขณะที่เข้าสู่ระบบและอยู่ในเซสชันที่ใช้งานอยู่ คุณจะได้รับแจ้งว่าการรีบูตกำลังรอดำเนินการหรือจำเป็นโดยกล่องป๊อปอัปหรือการแจ้งเตือนบางอย่าง ซึ่งคุณสามารถยกเลิกหรือยอมรับเพื่อรีสตาร์ท Windows แต่ในบางสถานการณ์ที่คุณไม่ต้องการหรือไม่สามารถรีบูตเครื่องได้ทันที ตัวอย่างเช่น คุณมีงานที่ต้องทำไม่เสร็จก่อนที่จะรีสตาร์ท หรือคุณเพิ่งติดตั้งการอัปเดตบนเซิร์ฟเวอร์ที่ใช้งานจริงและเซิร์ฟเวอร์นั้นสามารถ 'ไม่ต้องรีบูตทันที
ในสถานการณ์เช่นนี้ โดยเฉพาะอย่างยิ่งเมื่อเกี่ยวข้องกับกรณีหลัง คุณอาจลืมเกี่ยวกับการรีบูตและตระหนักในภายหลังว่าเซิร์ฟเวอร์หรือเครื่องไคลเอนต์บางเครื่องจำเป็นต้องรีบูต แต่ขณะนี้คุณไม่สามารถระบุได้ว่าเครื่องใด — ในสถานการณ์นี้ คุณสามารถตรวจสอบ Pending Reboot บนคอมพิวเตอร์ Windows โดยใช้ a พาวเวอร์เชลล์ สคริปต์
ขณะนี้ เมื่อการรีบูตกำลังรอดำเนินการ Windows จะเพิ่มค่ารีจิสตรีหรือแฟล็กเพื่อระบุที่ตำแหน่งรีจิสตรีต่อไปนี้โดยมีค่าและเงื่อนไขที่เกี่ยวข้องตามที่แสดงในตารางด้านล่าง สำคัญ ค่า เงื่อนไข HKLM:\SOFTWARE\Microsoft\Updates อัปเดต ExeVolatile ค่าคือสิ่งอื่นที่ไม่ใช่ 0 HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations มีค่าอยู่ HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager PendingFileRenameOperations2 มีค่าอยู่ HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired ที่ คีย์มีอยู่ HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\Pending ที่ มีคีย์ย่อยของ GUID อยู่ HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting ที่ คีย์มีอยู่ HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce DVDRebootSignal มีค่าอยู่ HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Service\RebootPending ที่ คีย์มีอยู่ HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Service\RebootInProgress ที่ คีย์มีอยู่ HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Service\PackagesPending ที่ คีย์มีอยู่ HKLM:\SOFTWARE\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 ระยะไกล ได้รับการตั้งค่าและพร้อมใช้งานบนเซิร์ฟเวอร์ของคุณ
PS51> .\Test-PendingReboot.ps1 -Server SRV1,SRV2,SRV3,etc
อ่าน : วิธีกำหนดเวลาสคริปต์ PowerShell ใน Task Scheduler
เมื่อใช้สคริปต์ PowerShell คุณสามารถสอบถามคอมพิวเตอร์หนึ่งเครื่องหรือทุกเครื่องในโดเมน หรือระบุชื่อเซิร์ฟเวอร์ด้วยตนเองเพื่อระบุเครื่องที่รอการรีบูต เมื่อระบุได้แล้ว คุณสามารถรีบูตเครื่องได้ทันทีหรือสร้างรายการเพื่อรีบูตในภายหลัง
ตอนนี้อ่าน : วิธีรีสตาร์ทคอมพิวเตอร์ Windows จากระยะไกลโดยใช้ PowerShell
การรีบูต Windows กำลังรอดำเนินการหมายความว่าอย่างไร
โดยทั่วไป คำขอรีบูตที่รอดำเนินการเกิดขึ้นเมื่อโปรแกรมหรือการติดตั้งทำการเปลี่ยนแปลงไฟล์ รีจิสตรีคีย์ บริการ หรือการตั้งค่าระบบปฏิบัติการ ซึ่งอาจทำให้ระบบอยู่ในสถานะชั่วคราว ในกรณีที่คุณได้รับ ตรวจพบการรีบูตที่รอดำเนินการ แจ้งเตือน เพียงแค่ระบุว่าการอัปเดตกำลังรอดำเนินการในเครื่องและต้องทำการรีบูตก่อนที่จะสามารถติดตั้งการอัปเดตเพิ่มเติมได้
อ่าน :
- วิธีปิดหรือเปิดการแจ้งเตือนการรีสตาร์ทการอัปเดต
- Windows Update ที่รอการติดตั้งหรือดาวน์โหลด กำลังเริ่มต้น ฯลฯ
จะตรวจสอบการรีบูตที่รอดำเนินการในรีจิสทรีได้อย่างไร
คุณสามารถทำได้โดย ค้นหา Windows Registry สำหรับ ต้องรีบูต สำคัญ. ในตารางด้านบนในโพสต์นี้ เราได้ระบุตำแหน่งรีจิสตรีที่เกี่ยวข้องสำหรับรีบูตรีจิสตรีคีย์ที่รอดำเนินการ หากคุณต้องการแสดงการแจ้งเตือนเมื่อพีซีของคุณต้องรีสตาร์ทเพื่อให้การติดตั้งการอัปเดต Windows เสร็จสมบูรณ์ ให้คลิก เริ่ม > การตั้งค่า > อัปเดต & ความปลอดภัย > การปรับปรุง Windows > ตัวเลือกขั้นสูง . สลับปุ่มเป็นเปิดหรือปิดสำหรับ แสดงการแจ้งเตือนเมื่อพีซีของคุณต้องรีสตาร์ทเพื่อให้การอัปเดตเสร็จสิ้น ตัวเลือก.
อ่านด้วย : มีการซ่อมแซมระบบที่รอดำเนินการซึ่งจำเป็นต้องรีบูตเพื่อให้เสร็จสมบูรณ์ .