Windows コンピュータで保留中の再起動を確認する方法

通常、ユーザーがドライバー、アップデート(ソフトウェアまたはシステム)、ソフトウェアをインストールするか、Windows クライアントまたはサーバー マシンで構成を変更すると、ユーザーはシステムを再起動するように求められます。この投稿では、Windows コンピュータで保留中の再起動を確認する方法について手順を説明します。

Windows コンピュータで保留中の再起動を確認する方法

多くの Windows OS タスクが完了すると、コンピュータは強制的に再起動を要求される場合があります。ログインしてアクティブなセッション中に、再起動が保留中であるか、ポップアップ ボックスまたは通知によって再起動が必要であることが通知されます。これらは無視するか、受け入れて Windows を再起動できます。しかし、すぐにマシンを再起動したくない、または再起動できない状況もあります。たとえば、再起動する前に完了する必要がある未完了の作業がある場合や、本番サーバーにアップデートをインストールしたばかりで、そのサーバーをすぐに再起動できない場合などです。

特に後者の場合のようなシナリオでは、再起動を忘れてしまい、後で一部のサーバーまたはクライアント マシンを再起動する必要があることに気付くことがありますが、どのマシンを再起動する必要があるのかを特定できません。この状況では、PowerShell スクリプトを使用して Windows コンピュータで保留中の再起動を確認できます。

再起動が保留されている場合、Windows は次のレジストリ場所にレジストリ値またはフラグを追加して、そのことを示します。関連する値と条件を下の表に示します。

キー条件
HKLM:\SOFTWARE\Microsoft\UpdatesUpdateExeVolatile値は 0 以外
HKLM:\SYSTEM\CurrentControlSet\Control\Session ManagerPendingFileRenameOperations値が存在する
HKLM:\SYSTEM\CurrentControlSet\Control\Session ManagerPendingFileRenameOperations2値が存在する
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequiredN/Aキーが存在する
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\PendingN/AGUID サブキーが存在する
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReportingN/Aキーが存在する
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceDVDRebootSignal値が存在する
HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPendingN/Aキーが存在する
HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootInProgressN/Aキーが存在する
HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\PackagesPendingN/Aキーが存在する
HKLM:\SOFTWARE\Microsoft\ServerManager\CurrentRebootAttemptsN/Aキーが存在する
HKLM:\SYSTEM\CurrentControlSet\Services\NetlogonJoinDomain値が存在する
HKLM:\SYSTEM\CurrentControlSet\Services\NetlogonAvoidSpnSet値が存在する
HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerNameComputerNameHKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName の値が ComputerName と異なる

関連するレジストリ パスを特定したので、レジストリ パスを 1 つでも確認し忘れたり、確認する必要があるレジストリ パスを忘れてしまったりしないように、手動でレジストリをくまなく調べる代わりに、下のコードを使用して 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
}
}
# 各テストにカスタム関数を活用していない場合は「test-path」を追加
# Get-ItemPropertyまたはGet-ChildItemに存在しないキーパスが渡されると例外がスローされるため
$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' }
{ 
# キーが存在するかどうかを最初に確認するテストを追加、「ErrorAction ignore」を使用すると誤って$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' }
{
# キーが存在するかどうかを最初に確認するテストを追加
'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 } )
}
{
# キーが存在するかどうかを最初に確認するテストを追加
'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
}
}
}

ComputerNameパラメータでスクリプトに任意の数のサーバーを指定できます。サーバー名と一緒にTrueまたはFalseが返されます。次の例のようにスクリプトを実行し、PowerShell Remotingがサーバーで設定され、使用可能であることを確認できます。

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

PowerShellスクリプトを使用すると、ドメインの1つまたはすべてのコンピューターを照会したり、再起動を保留しているマシンを判断するためにサーバー名を手動で指定したりできます。特定したら、マシンをすぐに再起動したり、後で再起動するためのリストを作成したりできます。

Windowsの再起動が保留されているとはどういう意味ですか?

一般に、保留中の再起動要求は、プログラムまたはインストールがファイル、レジストリキー、サービス、またはオペレーティングシステムの設定を変更し、システムが不安定な状態になる可能性がある場合に発生します。保留中の再起動が検出されたという通知が表示された場合は、マシンに更新が保留されており、追加の更新をインストールする前に再起動を実行する必要があることを示しています。

レジストリで保留中の再起動を確認するにはどうすればよいですか?

これを行うには、WindowsレジストリでRebootRequiredキーを検索します。この投稿の表の上で、保留中の再起動レジストリキーの関連するレジストリ場所を特定しました。PCがWindowsアップデートのインストールを完了するために再起動が必要な場合に通知を表示するには、スタート>設定>更新とセキュリティ>Windows Update>詳細オプションをクリックします。PCが更新を完了するために再起動が必要な場合に通知を表示するオプションのボタンをオンまたはオフに切り替えます。