Windowsパソコンを使用している以上は避けて通れないWindowsUpdate。もういっそのことChromeでGoogleスプレッドシート使ったらいいじゃないか!と幾度となく思うのですが、やはりWindowsとofficeの神話はローカルなお土地柄では崩れないのです。
ということで、今期もコツコツとアップデート作業をしておりますが、台数見てるとやはりこじらせるPCも出てきます。
エラー追うのもめんどくさいからクリーンインストールで!と思っても、そんなPCに限って独自に入れた業務ソフトと設定が入っていたり、その構成が少しでも崩れようものなら問い合わせの嵐が吹き荒れる、そんな御仁が使っていたりすると、まっさらにする方がリスクが高いこともあるでしょう。今回はそんなPCを相手にこじらせたアップデートを成功まで導きます。
今度は69%の壁
以前、バージョン1909から20H2にバージョンアップしたときに「66%の壁」というものにブチ当たりました。
今回は"69%"で「インストールに失敗しました」というエラーが発生しました。毎度ながらエラーコードは吐きやがりません。もちろん69%で調べたところで有益な情報はヒットしません。
今回はPowerShellを使ったWindows Updateのエラーログを取る方法がありますので、こちらをご紹介します。
Windowsの標準で入っているコマンドプロンプトに換わるCUI"PowerShell"では、Windowsに関わるアレやコレが従来のコマンドプロンプトより充実しています。
個人的にはまだ命令文が長くて種類が多いことからコマンドプロンプトから抜け出せずにいるのですが、「動詞-名詞」で統一された文法は覚えればとっつきやすい、とユーザーからは好評のようです。
で、今回のログを取るコマンドレットはこちら。
アップデートログを取るPowerShellコマンドレット
”Get-WindowsUpdateLog" (直訳:ウィンドウズアップデートログを取れ)
ストレートすぎて逆に思い出しづらいと思ったのは私だけでしょうか。まぁ、慣れだと思いますが。
手順は以下の通りです。
アップデートログの取り方
- スタート→WindowsPowerShellを起動
- Get-WindowsUpdateLog と入力
- デスクトップに”WindowsUpdate.log”というファイルが作成される
- 中身をメモ帳やお好みのテキストエディタで開いて"FATAL" "WARNING"で検索する。
- 4で怪しいログが見つからなかったら"0x8"でエラーを検索する。
「FATAL(重大)」とか「WARNING(警告)」なんて分かりやすいエラーが出てればすぐ探せるのですが、見当たらない場合、Windowsのエラーや警告は"0x8????????"という形で残っているので、これを片っ端から当たっていくという地味な作業となります。
今回は手順5まで掛かりました。で、見つかった項目は以下の通り。内容をググってみた結果も載せておきます。
0x80244022
WSUSサーバーへアクセスできない、という内容。SFC /SCANNOW で解決できる、という記事多数
0x8024500C
一番出ていた内容。
0x8024500c のエラー内容としては、"WU_E_REDIRECTOR_CONNECT_POLICY Connections to the redirector server are disallowed by managed policy" ですので、設定されているポリシーにより接続が許可されていないと言うエラーです。SFC /SCANNOW で解決できる、という記事多数
SFC /SCANNOWを実施したところ、破損ファイルが発見されリペアされました。SFC /SCANNOWについては上記で紹介している「66%の壁」記事を参照してください。
しかし直らず。
システムファイルが SFC /SCANNOW で修復されたのならアップデートは成功するだろうと思い再度トライするも69%で止まってしまいました。
更にエラー原因を探る為、以前紹介した 「SetupDiag.exe 」を使ってログを取って、そこからエラーコードを探し出します。
SetupDiag.exeの使いかた
標準装備されていないので、Microsoftからダウンロードして使用することになります。
念のため、動作環境として.NET FrameWork4.6以降が必要です。
一番簡単な使い方は、上記サイトからダウンロードしてダブルクリック。これだけ。圧縮無しのexe状態でダウンロードされるのでそのまま使えます。
使い方はこちらの記事を参考にしてください。
エラーコード:0x80070057
調べてみると、0x80070057のエラーコードはファイルに対するアクセスや操作が何らかの原因で失敗すると吐き出すエラーのようです。
インストール中にファイルアクセスエラーと言われても、内部で何万のファイルがあるか計り知れません。いろんなサイトの情報をかき集めて自分なりに整理してみると大枠で怪しいと思われる箇所は以下の通り。
ここが怪しい?
- Windowsアップデート前に実施される更新プログラム適用で、インストーラーとPCの間で不都合が起きる
- インストール時に作られた復元ポイントが悪さをしている
- サーバーから持ってきた更新プログラムファイルを書こうとしたらアクセス権で弾かれた
- インストーラーを展開したときにうまく展開できていない。一部破損している
- 書かれる側、つまりはSSD側に異常がある
この中より、対処のウェイトが軽いものから試してみます。
SSDの異常→chkdsk /fの実施
不良セクタなんかがあれば修復させる「スキャンディスク」というやつです。コマンド一発で出来るのでお手軽です。
スキャンディスクの掛け方
- スタートボタン
- 「CMD」と入力
- 管理者として実行
- "chkdsk /f"とタイプしてエンター
- 再起動後にスキャンディスクが走るようにスケジュールされる。
- PCを再起動すれば自動的にスキャンディスクが掛かる。
スキャンディスクと言えば、記憶領域全てをスキャンするので、SSDの寿命を縮めるとかおススメされないことが多いのですが、それはSSDが出始めた頃の一部ロットでの話です。現在はCD-R、DVD-RにバックアップするよりSSDに入れておいた方が断然安全と言われるほどです。スキャンディスクでSSDがヘタるなんてことはほとんどありません。
ということで張り切って実施しましたが状況は変わらず。ひとまずSSDには異常はありません。
インストーラーが破損している→オンラインインストールに切り替え
オンラインならその都度最新のインストーラーが降りてくるので時間は掛かるものの確実ではないか、ということでトライ。
こちらからWindowsのアップデートを選択すると更新アシスタントがダウンロードされるので、それを起動してインストールします。
しかし結果は同じく69%でインストール失敗。
オンラインでインストール失敗するとエラーコードがウィンドウに表示されます。エラーコードは同じでした。
アップデート前の更新プログラム適用で不都合が起きる→更新プログラムのキャッシュ削除
更新プログラムのキャッシュを保存している"SoftwareDistribution"というフォルダには、以前の更新プログラムのインストール履歴やキャッシュなどが保存されていますが、ここに不整合やエラーがあるとアップデートが滞るという事例もあります。削除してもアップデートの時に新たに作り直されるので問題ありません。
通常はアップデートのプロセスが常駐しているので削除できませんから、コマンドプロンプトでそのプロセスを狙い撃ちで停止してから削除するというのが主流のやり方です。
net stop usosvc
net stop dosvc
net stop wuauserv
net stop bits
echo ***c:\windows\SoftwareDistributionの中身を全部消してください。***
explorer.exe c:\windows\SoftwareDistribution
上のコードをコピーしてコマンドプロンプト(管理者権限で起動)に貼り付ければOKです。
けど、これでも解決せず。。。
アップデート前の更新プログラム適用で不都合が起きる→ $WINDOWS~BTを消してみる
0x80070057で調べてみると"$WINDOWS~BT"フォルダが影響している、という記事を複数見かけました。
"$WINDOWS~BT"フォルダとは?
Windows7、8、8.1からWindows10にアップグレードする時に使われていた隠しフォルダのようです。Cドライブの直下にありますが、普段は表示されていません。
Windows10になってからは、アップデートインストール後のバックアップファイルとして使われているようです。要するに"windows.old"と用途は同じです。
エクスプローラーの「表示」タブにある「隠しファイル」にチェックを入れると出てきます。
これを消せばOKなわけですが、そのまま消すのに抵抗がある場合は「ディスククリーンアップ」でも消すことができます。
$WINDOWS~BTの安全な削除方法
- スタート→Windows管理ツール→ディスククリーンアップを選択
- 「システムファイルのクリーンアップ」をクリック
- 「一時Windowsインストールファイル」にチェックを入れてOK
"一時Windowsインストールファイル"というのが"$WINDOWS~BT"にあたります。これなら仮に他のフォルダに残滓があっても拾って消してくれますし、もしレジストリの辺りも絡んでいたとしてもうまく処理してくれます。また、何かプロセスが邪魔して消せない場合も良しなにやってくれるでしょう。
これで見事に $WINDOWS~BT フォルダが消えてくれました。
しかし事態の打開にはつながらず。。。
完全オフラインでインストール
思いつく対応策を全てやってみても状況変わらずで万策尽きた。ついに上書きインストールとかの領域に踏み込むか・・・?と思ったのですが、今までの策を再度振り返ってみると、どの策をやった後もインストール中はネットワークがつながった状態でインストールをしていました。
ここで立てた仮説は以下の通り。
69%でつまづく理由(仮説)
- このPCにはログには残ってないが(探せないだけかも)何かしら更新プログラムが異常な状態でインストールされている、若しくはインストールが失敗している。
- キャッシュ(SoftwareDistribution)が無いので「更新プログラムをチェックしています」の時にMSのupdateサーバー若しくはWSUSサーバーを参照してPCの状態を確認しながら更新プログラムのリストが再作成される
- 変な入り方をしている更新プログラムが「正常にインストールされている」とみなされる。正常な更新プログラムは時短の為に上書きしない。
- 大型アップデート作業で上記更新プログラムに関係する部分の作業に差し掛かると、本来の動きと違う挙動になってしまいエラーとなる。今回はそこのポイントが69%?
- これと言ったジャストなエラーコードが無いので「ファイルアクセスに関するエラー」というフワッとした表現にとどまる。
きっと 「SetupDiag.exe 」で生成したログを細かく読んでいって、どのファイルアクセスの時にエラーが発生しているかを突き止めれば、インストールし直す更新プログラムがどれかを突き止めることはできるのかもしれませんし、これが本来の対策法なのでしょうが、これはかなりの労力です。
しかも今回は、持ち主がいない日を狙って作業をしているので持ち時間は少ないのです。
そこで、次なる手段は「完全オフライン」でインストール。LANケーブルを引っこ抜きます。
以下のような挙動を狙います。
LANケーブルを引っこ抜くことで変わる挙動(推定)
- このPCにはログには残ってないが(探せないだけかも)何かしら更新プログラムが異常な状態でインストールされている、若しくはインストールが失敗している。
- 更新プログラムの状況を確認するためインターネット経由でMSのupdateサーバー若しくはWSUSサーバーを参照しようとするがネットワーク接続が検出されない。
- ネットワーク接続が検出されない場合は更新プログラムのチェックは省略される。
- キャッシュ(SoftwareDistribution)も無いので、どの更新プログラムが適用されているか分からない。
- 仕方がないので時間は掛かるがアップデートに影響する全ての更新プログラムを上書きインストールする。
大型アップデートには次期バージョンに影響する累積更新プログラムのFix分もふくまれているので、事前の更新プログラムインストールはパスしても問題ありません。
LANケーブルを引っこ抜き、先ほどのキャッシュを削除する方法を取ってからインストーラーによるインストールを実行してみたところ69%の壁を突破し、インストールが成功しました!
この方法も今までの経験から行くと特効薬とはなりませんが、一般的なエラー対処法をいくらやってもうまくいかないときはこの方法もありだと思います。
そんな苦労を一切にじませない伝言を残して今回のトラブルはフィニッシュです。
今のところ、アップデートのエラーでPCをまっさらにするところまで至った事例はありません。紹介した方法どれかでクリアすることは可能です。地道に頑張ってみてください!