Windows 10の月例パッチが出たので中華タブ、Windows Updateされてるかなぁと様子を見たら「バッテリー節約機能がオンになっているため、ダウンロードを一時停止しました。 バッテリー節約機能がオフになると、ダウンロードが再開されます。」*1と表示されてWindows Updateが動かなくなっている不具合に遭遇した。もちろんバッテリー節約機能はオフである。オン→オフしてもダメ。トラブルシューティングツールは役立たず。
というわけでWindows Updateをリセットすることにした。
Windows Updateが使用するデータベースやダウンロードした更新プログラムなどが入っているフォルダをリネームすることでリセットする。これによってバッテリー節約機能ガーとか言われなくなった。長めなので続きを読むから。
目次
注意とか
- Windows 10であることを前提としている。アップデートは問わないと思う(RS1環境で実施)。
- 作業にはコマンドプロンプトを使用するが、管理者権限で起動すること。
- スタートボタン(田)を長押し or 右クリック→コマンドプロンプト(管理者)
- 操作を誤ると最悪Windowsが起動しなくなる恐れがあるので慎重に操作すること。
- リセット操作を行うと更新履歴がリセットされ、非表示にした更新プログラムが再度表示されるようになる。今後の更新プログラムの適用には(多分)問題ない。
- この対処法はバッテリー節約機能云々でアップデートできなくなる現象に対処するため、Windows Updateのデータベース等をリセットすること(+α)のみ行っている。
- 頻繁にリセットすることは逆効果になりうるので今回の不具合が起きた場合のみ実行すること。
- そのほかのエラーで、以下の操作でも改善しない場合はcatroot2のリネームや関連ライブラリの再登録などが必要になるかもしれない。この記事の最下部の参考サイトを参照。
- レジストリがおかしいということもあるので一度トラブルシューティングツールを動かしてからのほうがいいかも。
手順
サービス停止
まずコマンドプロンプト(管理者)を開き、Windows Update関連のサービスを止める。wuauservがエラーでなかなか停止しない時があるのでその場合はコンピューターの管理のサービスからWindows Updateを停止してみるといいかも。
net stop usosvc net stop bits net stop wuauserv net stop appidsvc net stop cryptsvc
(念の為)BITSのキューをクリアする
念の為BITS(バックグラウンド インテリジェント転送サービス)のキューをクリアしておく。
del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr0.dat" del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr1.dat"
ここで「アクセスが拒否されました。」と表示される場合はBITSが止まっていない可能性があるので確認する。
SoftwareDistributionフォルダをリネームする
Windows Update関連のデータが入っているフォルダを一旦リネームする。
ren %systemroot%\SoftwareDistribution SoftwareDistribution.old
ここで「アクセスが拒否されました。」と表示される場合はWindows Updateサービスが止まっていない可能性があるので確認する。
(念の為) WinSock/WinHTTPをリセットする
netsh winsock reset netsh winhttp reset proxy
プロキシ設定がリセットされるっぽい?ので設定している人は注意。
サービス再開
net start bits net start wuauserv net start appidsvc net start cryptsvc net start usosvc
再起動
すべての作業が終わったら再起動しておこう。
再起動したら設定→更新とセキュリティ→Windows Updateを開き更新のチェックを行う。
無事に動く事が確認できたら再度コマンドプロンプト(管理者)を起動してSoftwareDistribution.oldを削除しておく。
rmdir %systemroot%\SoftwareDistribution.old /q /s
以上の手順をバッチファイルにすると…?
以上の手順(再起動後のSoftwareDistribution.old削除を除く)をバッチファイルにするとこうなる。追加で作業終了後shutdownコマンドで5秒間完了メッセージを表示した後再起動を掛けている。
もちろん管理者権限で動かさないとエラー祭りなので注意。
@echo off echo Stopping services net stop usosvc net stop bits net stop wuauserv net stop appidsvc net stop cryptsvc echo Deleting BITS Queue del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr0.dat" del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr1.dat" echo Renaming SoftwareDistribution ren %systemroot%\SoftwareDistribution SoftwareDistribution.old echo Resetting WinSOCK/WinHTTP netsh winsock reset netsh winhttp reset proxy echo Restarting services net start bits net start wuauserv net start appidsvc net start cryptsvc net start usosvc echo Rebooting PC shutdown -r -t 5 -c "Operation Completed" pause
(蛇足)ちなみに
ダウンロードしようとして止まっていた更新(KB3213986など)はリセットする前に手動でダウンロード、適用したのは秘密。
なので自分の場合、リセット後の更新プログラムのチェックではWindows Defenderの定義ファイルアップデートだけ降ってきた。
参考
Windows Update コンポーネントをリセットする方法
Windows Update コンポーネントリセットツールに含まれる内容をすべて(コマンドプロンプトで)実行する方法 - ぼくんちのTV 別館
*1:スクショ撮っておくの忘れてた。。