以下省略!

タイダルウ(ry 毎日1記事執筆運動実施中。

バッテリー節約機能がオフなのに「オンになっている」と言われてWindows UpdateができなくなったのでWindows Updateをリセットした

https://rita.xyz/blog/irasutoya/koushin-w200-zf.pngWindows 10の月例パッチが出たので中華タブ、Windows Updateされてるかなぁと様子を見たら「バッテリー節約機能がオンになっているため、ダウンロードを一時停止しました。 バッテリー節約機能がオフになると、ダウンロードが再開されます。*1と表示されてWindows Updateが動かなくなっている不具合に遭遇した。もちろんバッテリー節約機能はオフである。オン→オフしてもダメ。トラブルシューティングツールは役立たず。

というわけでWindows Updateをリセットすることにした。
Windows Updateが使用するデータベースやダウンロードした更新プログラムなどが入っているフォルダをリネームすることでリセットする。これによってバッテリー節約機能ガーとか言われなくなった。長めなので続きを読むから。

目次

注意とか

  • Windows 10であることを前提としている。アップデートは問わないと思う(RS1環境で実施)。
  • 作業にはコマンドプロンプトを使用するが、管理者権限で起動すること。
  • 操作を誤ると最悪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の定義ファイルアップデートだけ降ってきた。

*1:スクショ撮っておくの忘れてた。。

実験中:よい子は次のアドレスにメールを絶対に送らないでください。場合によっては晒しあげされますよ。 ivyrush+htnb.20170313@rita-ch.com viande@rita-ch.com