2019年6月の定例更新の際、検証用仮想マシンの1台が更新プログラムのインストールエラーで繰り返し失敗する場面に遭遇しました。筆者がいつもしているように“おまじない”のようなコマンドラインで解決しようとしましたが、問題が発生したのは、そうはさせてくれない「Windows 10 Sモード」だったのです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
複数台、複数バージョンのWindows 10やWindows Serverを管理していると、年に数回は「Windows Update」で原因不明、解決困難なエラーに遭遇することがあります。本連載でも何度か取り上げてきたように、Windows Server 2016の更新で発生することが多く、正常化できることも、できないこともありました。
筆者の環境では、2019年6月12日の定例セキュリティ更新の際、幾つかのバージョンでエラーが目立ちました(ほとんどは再試行で解消しました)。しかし、1台だけ再試行で解消しないエラーに遭遇しました。そのPC(実際には仮想マシン)は「Windows 10 Pro(x64)バージョン1809、Sモード」を実行していました。5月末のオプションの累積更新までは何の問題もなく、更新できていたPCです。
その問題とは、2019年6月のセキュリティ累積更新プログラム「KB4503327(ビルド17763.557)」のインストールが「状態:インストール中 - 100%」の後、最後の最後にエラー「0x80070057」で終了し、何度繰り返しても、再起動しても、「Microsoft Updateカタログ」からダウンロードして手動インストールしても失敗を繰り返すというものでした(画面1)。
筆者はこれまで、Windows Updateの問題に遭遇しても「C:\Windows\SoftwareDistribution」の再作成や、コンポーネントストアである「C:\Windows\WinSxS」の修復、Microsoft Updateカタログからダウンロードした更新プログラム「Microsoft Updateスタンドアロンインストーラー(MSU)」のオンライン/オフラインインストールなどの手段で、ほとんどの場合は正常化してきました。
どうしても問題を解消できずに、再インストールしたこともありますが、それ以上時間をかける価値がなかったからです(評価環境なので)。Windows Updateのエラーを解消できるかもしれないコマンドライン操作については、以下のMicrosoftのサポート情報で説明されています。
今回の問題は、「Windows 10 Sモード」で発生しました。Windows 10 Sモードは、Windows標準のアプリ(「ペイント」や「Internet Explorer」など、組み込み済みのWin32アプリも利用可能)やツールの他は、「Microsoftストア」から取得したアプリだけをインストール、実行できるロックダウンされたモードです。「コマンドプロンプト(cmd.exe)」や「Windows PowerShell」「レジストリエディター(regedit.exe)」の使用は制限されています(画面2)。バッチファイルやPowerShellスクリプトも実行できません。この他、Windows Script Host(WSH)のスクリプトエンジンやWindows Subsystem for Linux(WSL)のシェル環境、「REG」コマンドや「WMIC」コマンドの使用も制限されています。
つまり、Windows Updateのエラー解消のためのコマンドライン操作が一切実行できないのです。Windows 10 Sモードの制限は、「セーフモード」で起動した場合でも解除されることはありません。ちなみに、「セーフモードとコマンドプロンプトを有効にする」で起動した場合でも、「セーフモードを有効にする」と同じ環境が起動し、コマンドプロンプトが起動することはありません。
Windows 10 Sモードの場合、オンライン(通常起動)で実行できる対処としては、「更新とセキュリティ」→「回復」→「トラブルシューティング」から開始する「Windows Update」トラブルシューティングツールくらいになります。しかし、今回のケースでは、トラブルシューティングツールは「問題を特定できませんでした」と表示し、役に立ちませんでした。
Windows 10 Sモードでもコマンドライン環境からシステムを操作する方法が1つだけあります。それは、「Windows回復環境(Windows Recovery Environment:WinRE)」です。WinREは、ローカルディスクの回復パーティションにインストールされている「Windowsプレインストール環境(Windows Pre-install Environment:WinPE)」ベースのコマンドプロントを持つトラブルシューティング環境です。現在のWindowsインストールとは別のWindowsインスタンスとして起動するので、Windows 10 Sモードの制限はかかりません。正常起動しない場合は、複数回起動に失敗した後に、WinREに進むことができます。
WinREを開始するには「設定」アプリの「更新とセキュリティ」→「設定」→「回復」を開き、「PCの起動をカスタマイズする」の下にある「今すぐ再起動」をクリックします。または、[Shift]キーを押しながら、通常の再起動操作を行います。すると、「オプションの選択」画面が表示されるので、「トラブルシューティング」→「詳細オプション」→「コマンドプロンプト」の順番に選択します(画面3)。
これで次回起動時にWinREが起動し、ローカル管理者のパスワードを入力してコマンドプロンプトを開きます(「BitLocker」が有効化されている場合は、起動時にロックの解除操作が要求されます)。
筆者の環境ではWinREが英語環境ですが、通常は日本語環境だと思います。筆者の環境はWindows 10 Sモードの前身である「Sエディション英語版」(Windows 10 S バージョン1703英語版、+日本語言語パック)から、Windows 10 Pro Sモードのバージョン1809(Sモードはバージョン1803から)までアップグレードしてきたものなので、その影響で既定のシステムUI言語が英語になっています。日本語環境と異なり、円マーク(¥)はバックスラッシュ(\)で表示されることだけに留意してください。
最初にすべきなのは、オフラインのWindows OSボリューム(オンライン時のC:ドライブ)のドライブ文字を調べることです。コマンドプロンプトから「DIR」コマンドや「DISKPART」コマンドを使用して、Windowsディレクトリのあるボリュームのドライブ文字を特定します。X:ドライブは、メモリ上にロードされたWinREのディスクイメージなのでX:ドライブではありません。
オフラインのWindowsの場所を特定したら、コマンドラインを駆使してさまざまなトラブルシューティング操作を実施できます。例えば、オンラインのWindowsで「C:\Windows\SoftwareDirtibution」を再作成するには、Windows Update(wuauserv)やBITS(bits)など、複数のサービスを停止する必要があります。WinREであればサービスの動作状態を気にすることなく、直接「SoftwareDirtibution」ディレクトリをリネームしたり、削除したりできます(画面4)。削除した「SoftwareDistribution」ディレクトリは、通常起動後のWindows Update実行時に自動的に再作成されます。
コンポーネントストアを修復するには、一時ディレクトリを準備した上で、次のようなコマンドを実行します(D:ドライブがオフラインのWindows OSボリューム、一時ディレクトリとしてD:\workを使用する場合)。
STARTNET MKDIR D:\work(D:\workが存在しない場合) DISM /Image:D:\ /Cleanup-Image /RestoreHealth /ScratchDir:D:\work
「STARTNET」コマンドは、Windows Updateから修復ソースをダウンロードするために、WinREでネットワークを初期化して利用可能にします(ただし、WinREに組み込まれているドライバで利用可能な有線LANのみ)。ローカルの修復ソースとしてインストールメディアを使用する場合は、「/Source:<パスまたはWIM:install.wimのパス:インデックス番号> /LimitAccess」オプションを使用します。
なお、Windows 10のダウンロードサイトからダウンロードしたISOイメージや、作成ツールで作成したインストールメディアには「Install.wim」ではなく「Install.esd」が含まれますが、「/Source:」オプションはESD(Electronic Software Download)形式には対応していないはずです。ESD形式をWIM(Windows Imaging Format)形式に変換する方法については、説明が長くなってしまうので省略します。
更新プログラムの「Microsoft Updateスタンドアロンパッケージ(.msu)」をダウンロード済みの場合は、以下のコマンドでオフラインのWindowsに対して更新プログラムをインストールすることもできます。
MKDIR D:\work (D:\workが存在しない場合) DISM /Image:D:\ /Add-Package /PackagePath:<スタンドアロンパッケージのパス> /ScratchDir:D:\work
「SFC /SCANNOW」コマンドでシステムファイルの整合性スキャンと修復を行う場合は、次のようにオフラインのWindowsのボリュームをオプションに指定して実行します(D:ドライブがオフラインのWindowsのOSボリューム、E:ドライブがブートボリュームの場合)。
SFC /SCANNOW /OFFBOOTDIR=E:\ /OFFWINDIR=D:\Windows
残念ながら、今回のケースではオフラインでのコンポーネントストアの修復と更新プログラムのインストールはどちらも失敗しました(画面5)。Windows 10 バージョン1809の最新のインストールメディア(Install.wim)を修復ソースとして指定しても、同じ「0x800f081f」で失敗しました。
この状態でWindows 10 Sモードを通常起動しても、問題の更新プログラムのインストールは再びエラー「0x80070057」で失敗しました。状況は全く改善していません。なお、今回のケースでは「SFC」コマンドは実施していません(その前に解決できたため)。
コンポーネントストアの修復ソースとしては、同じバージョンを実行するPCや仮想マシンの「C:\Windows」ディレクトリを使用することもできます。該当するPCが稼働中であれば、そのPCの管理共有(C$)に「NET USE」コマンドで接続し、ドライブ文字を割り当て、「/Source:」オプションに指定します。仮想マシンのVHD(x)イメージがあるのであれば、それをマウントしたものを共有して、WinREから接続すればよいでしょう。
STARTNET NET USE W: \\<コンピュータ名>\C$ /USER:<ユーザー名> MKDIR D:\work(存在しない場合) DISM /Image:D:\ /Cleanup-Image /RestoreHealth /Source:W:\Windows /LimitAccess /ScratchDir:D:\work
今回のケースでは、再びWinREで起動し、Windows 10 バージョン1809(SモードではないProまたはEnterpriseで可)を実行する別のPCの管理共有を利用したところ、修復が100%完了して成功しました(画面6)。
「WPEUTIL REBOOT」コマンドでWinREを終了し、再起動して通常起動したところ、Windows Updateの実行は何の問題もなく完了しました(画面7)。Windows 10 Sモードでの、Windows Updateのエラー解消と正常化は、これで完了です。そして、翌月7月10日の定例のセキュリティ更新でもトラブルは発生していません。
参考情報として、WinRE環境におけるオフラインのWindowsのレジストリ編集について紹介します。Windows Updateの問題を修正するために、回避策として特定のレジストリの修正が示されることがあります。WinREはレジストリエディター(Regedit.exe)を搭載していますが、起動した際に表示されるのは、“現在動作中のWinREのレジストリ”であることに注意してください。
オフラインのWindowsの「<ドライブ名:>\Windows\System32\Config」ディレクトリにあるSYSTEMやSOFTWAREハイブをロードすることで、オフラインのWindowsのレジストリを編集することが可能になります。オフラインのWindowsのSYSTEMハイブをロードした場合、ロード先「\SYSTEM\CurrentControlSet」は存在しないので、ロード先「\SYSTEM\ControlSet001」下を編集する必要があることにも注意してください(画面8)。
WinREを使用したWindows 10 SモードのWindows Updateのトラブル解決は、Windows 10 Sモードでない場合でも利用できますが、あくまでもITプロフェッショナル向けです。
本連載でこれまでに紹介したものを含む、WinREを利用したトラブルシューティングテクニックは、筆者が執筆した書籍『ITプロフェッショナル向け Windowsトラブル解決コマンド&テクニック集』(日経BP社刊)にまとめられています。ぜひ参考にしてください。筆者も自分で書いた本書を読み返しながら、今回のコマンドライン操作を実施しました。
一般ユーザーの方は、今回のようなトラブル解決のために使用した、よく分からないコマンドラインの操作は避けることをお勧めします。Windows 10 Sモードかそうでないかにかかわらず、一般ユーザーの方が原因不明のWindows Updateエラーに遭遇し、コマンドラインを使用しない一般的な対処方法でどうしても解消できないとなったら、次のいずれかの方法で解消できる可能性があります。
(1)次の累積更新プログラムでの解決を期待して待つ。
(2)「設定」アプリの「更新とセキュリティ」→「設定」→「回復」→「このPCを初期状態に戻す」を開始して、PCをリセットする。
(3)Windows 10 バージョン1903の機能更新プログラムをインストールしてアップグレードする。
(1)は今回のケースには適しませんが、Windows Updateのエラーがコンポーネントストアの破損ではなく、更新プログラム自身の問題である場合、次の累積更新プログラムの翌週または翌々週に提供される「オプションの累積更新プログラム」で解決されているかもしれません。解決されている場合、それは翌月の定例の累積更新プログラムにも含まれます。
(2)はコンポーネントストア内にあるパッケージを使って、現在のWindows 10インストールをリセットする方法です。ユーザーデータと設定を維持するオプションと、削除するオプション(新規インストール相当)を選択できますが、どちらもWindows 10に後からインストールしたアプリや「Windows Defender」以外のマルウェア対策ソフトは削除されてしまうことに注意してください(画面9)。
なお、「ディスククリーンアップ」(Cleanmgr.exe)で「Windows Updateのクリーンアップ」を削除した場合は、(2)は失敗して元の状態(現在の問題のある状態)にロールバックする場合があります。
(3)の方法、半年に1回の新バージョンへのアップグレードは、Windows Updateを正常化できる可能性があるチャンスです。今なら、Windows 10 May 2019 Update(バージョン1903)へのアップグレードが可能です。機能更新プログラムの場合は、ユーザーデータや設定、アプリを維持したままアップグレードできます。Windows 10のダウンロードページ(https://www.microsoft.com/ja-jp/software-download/windows10)から「Update Assistant」またはメディアを作成してのアップグレードでは、ユーザーデータや設定、アプリを引き継ぐか、引き継がないか(新規インストール相当)を選択できます。ちなみに、SモードではUpdate Assistantの実行はブロックされます。
(2)と(3)で解決を試みる場合は、ユーザーデータと設定を引き継ぐオプションで試してみて、それが駄目なら引き継がないオプションを試してみましょう。
良い機会なのでいろいろと試してみたくて、時間がかかったということもありますが、今回のトラブル解決には2日間を要しました。Windows 10 Sモードという制約が、余計に時間を要した一因になったことは確かです。
Windows 10 Sモードは、Microsoftストアを使用してHomeやProエディション(またはその他のエディション)に無料で切り替えることで、Sモードの制限を解除できます。ただし、切り替えは一方向であり、再びSモードに戻すことはできません。企業がWindows 10 Sモードを導入している場合は、セキュリティの面などからSモードを選択する理由があるのでしょう。企業の管理者やITプロフェッショナルがSモードの制限を一時的に解除できる方法があると助かるなぁ、と思った2日間でした。
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2019-2020)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.