シャットダウンのたびに
Task Host Window が出る
(RegisterUserDevice)

関連記事

1. Task Host Window と表示名の意味

「毎回、Windowsをシャットダウンしようとすると、「Task Host Window」という画面が現れて止まる」、という相談がありました。

1. Task Host Window と表示名の意味

このときには、まずは再起動」をしておきましょう。
ただし、「強制的にシャットダウン」したときには、一度 起動し直したあと、「再起動」を実行します。
「再起動」は、「シャットダウン」と「起動」と違って、高速スタートアップ用に保存されたカーネル状態は使われないからです。

1.1. Task Host Window の正体

このTask Host Windowって何なの?

Task Host Window は、ウイルスでも故障でも特定アプリの名前でもありません。
シャットダウン時に「まだ終わっていない処理がある」とWindowsが出す通知画面です。

1.1. Task Host Window の正体

実体は taskhostw.exe というWindows標準プロセスで、スケジュールされたタスクや内部サービスを実行するための入れ物として動いています。
シャットダウン信号を受けたとき、抱えている処理が終わるまで待ち、処理が長引くと何を待っているかをこの画面に表示します。

Task Host Window そのものに問題があるわけではなく、Windowsが「今ここで詰まっています」と教えてくれている状態です。

1.2. RegisterUserDevice とは何か

Task Host Window の画面には、タイトルの下に具体的な処理名が表示されます。
今回は、次のような文字列でした。

\Microsoft\Windows\DeviceDirectoryClient\RegisterUserDevice

これがWindowsのタスク スケジューラに登録されているタスクのパスと名前です。

\Microsoft\Windows\DeviceDirectoryClient\RegisterUserDevice を分解すると、構造が見えます。

1.2. RegisterUserDevice とは何か
  • DeviceDirectoryClient(デバイス ディレクトリ クライアント) 」は、PCとユーザーのアカウント情報を結びつける処理を担う領域です。
    Microsoftアカウント、職場または学校アカウント、Microsoft Entra ID(旧称 Azure AD) といったアカウント基盤と、PCのデバイス登録情報を照合・更新します。
  • RegisterUserDevice 」はその中の一つのタスクで、名前の通りユーザーのデバイス登録を行います。
    通常はサインイン後や定期的なタイミングで裏側で動くので、ユーザーが意識することはありません。
    ただし、シャットダウン時にこのタスクがまだ動いていると、Windowsは完了を待ってから電源を落とそうとします。

2. 高速スタートアップの問題?

一度だけ出た場合は、たまたまシャットダウン直前にタスクが動いていた可能性があります。
しかし、毎回同じタスク名で出るなら、その状態がどこかに固定されて呼び出されていることになります。

2. 高速スタートアップの問題?

2.1. 再起動して、その後シャットダウンを確認する

まず再起動を1回行い、その後に通常のシャットダウンで再発するかを確認するのが最初の切り分けです。

Windowsのスタートボタンから「再起動」を実行してみます。
再起動」は、高速スタートアップの状態を使わずにWindowsを完全に終了して起動し直します。
「再起動したら出なかった」「再起動後のシャットダウンでは出なかった」という場合は、高速スタートアップが絡んでいると判断できます。

「高速スタートアップ」は、シャットダウン時にカーネルの状態を休止ファイルに保存して次回起動を速くするWindowsの機能です。
完全な電源切断ではなく一部の状態が持ち越されるため、内部タスクや周辺機器との状態が崩れたまま次回も引き継がれ、毎回同じ問題が出ることがあります。

あるいは、Shiftキーを押しながら「シャットダウン」を選んでも、設定を変えずに一時的に完全シャットダウンできます。
再現確認に使えます。
これで、再発しなければ高速スタートアップが原因の可能性が高いです。

2.2. 高速スタートアップを無効化する

コントロール パネルから「電源オプション」を開き、「電源ボタンの動作を選択する」に進みます。
「現在利用可能ではない設定を変更します」をクリックし、「高速スタートアップを有効にする」のチェックを外して保存します。
これで毎回の完全シャットダウンになり、状態の持ち越しがなくなります。

3. Windows Update の完了を確認する

「設定」から「Windows Update」を開き、「更新の履歴」で失敗した更新がないか確認します。
更新が中途半端な状態だと、内部タスクが毎回同じ処理を再試行し続けることがあります。

3.1. Microsoftアカウントや職場・学校アカウントの状態を確認する

「設定」から「アカウント」を開き、「職場または学校にアクセスする」に使っていない古いアカウントが残っていないか確認します。
RegisterUserDevice はアカウントとデバイスの紐付けを処理するタスクなので、古い接続情報が残っているとシャットダウンのたびに認証が詰まることがあります。

3.2. SFC と DISM でシステムを修復する

管理者権限のターミナルで次を順に実行します。

sfc /scannow
DISM /Online /Cleanup-Image /RestoreHealth

sfc /scannow はシステム ファイル チェッカーで、Windowsの保護ファイルを検査して破損があれば修復します。
DISM はDeployment Image Servicing and Managementの略で、Windowsイメージ自体を修復するツールです。
SFCでは直せない深い破損を対象にします。

4. 原因を特定するには?

上記の対処で改善しない場合、またはどの原因か特定してから動きたい場合は、ログを直接確認します。

4. 原因を特定するには?

4.1. タスク スケジューラで前回の実行結果を見る

「タスク スケジューラ」を開き、「タスク スケジューラ ライブラリ」から「Microsoft」「Windows」「DeviceDirectoryClient」の順に進みます。
RegisterUserDevice を選び、「前回の実行結果」の列を見てください。
0x0 なら成功で、それ以外のコードが出ていれば失敗しています。

ちなみに、タスク スケジューラで RegisterUserDevice を無効化すると、画面は出なくなりますが問題を隠すだけです。
デバイス登録処理が止まったことによる別の問題が後から出る可能性があるので、原因を特定する前に無効化するのは避けてください。

履歴が空の場合は、右側のウィンドウで「すべてのタスク履歴を有効にする」を押すと次回以降の記録が残ります。

4.2. イベント ビューアーでタイムラインを確認する

イベント ビューアー」を開き、「アプリケーションとサービス ログ」から「Microsoft」「Windows」「TaskScheduler」「Operational」の順に進みます。
右側の「検索」から RegisterUserDevice を検索し、シャットダウン直前の時刻に失敗・タイムアウト・エラーが記録されているか確認します。

あわせて「Windows ログ」の「システム」を開き、シャットダウン直前の時刻で Kernel-PowerService Control ManagerTaskScheduler のエラーや警告を確認します。
同じ時刻に複数のエラーが集まっていれば、そこが原因の発生点です。

4.3. PowerShell でタスクの状態を確認する

管理者権限のターミナルで次を実行します。

Get-ScheduledTask -TaskPath "\Microsoft\Windows\DeviceDirectoryClient\" | Format-Table TaskName, StateCode language: PowerShell (powershell)

タスクの状態が RunningUnknown のまま止まっているようなら、正常に終了できていない状態です。
詳細を見る場合は次を実行します。

Get-ScheduledTaskInfo -TaskPath "\Microsoft\Windows\DeviceDirectoryClient\" -TaskName "RegisterUserDevice"Code language: PowerShell (powershell)

LastRunTimeLastTaskResultNextRunTime を確認します。
LastTaskResult が 0 以外なら失敗コードです。

「毎回同じタスク名で出る」という状況は、Windowsの内部タスクが毎回同じ場所で詰まっている状態です。
Task Host Window の画面に気を取られるより、表示されているタスク名を起点に、ログで「いつ・どこで・どのコードで失敗しているか」を確認するのが、最短で原因に近づく方法です。