セーフモードでも起動できないという悪夢からの脱出[その2]山市良のうぃんどうず日記(10)

「セーフモード」でも起動できず、「システムの復元」も利用できないWindows PCは、「システム回復オプション」の「コマンドプロンプト」で何とかしましょう。

» 2014年07月18日 18時00分 公開
[山市良テクニカルライター]
「山市良のうぃんどうず日記」のインデックス

連載目次

原因を特定できたら、その原因を取り除く

 前回は、Windows PCのローカルディスクにインストールされている「システム回復環境」(Windows Recovery Environment:WinRE)、あるいはWindowsのインストールDVDメディアから起動するWinREや「Windowsプレインストール環境」(Windows Preinstallation Environment:WinPE)の「コマンドプロンプト」を使用して、正常に起動できなくなったWindows PCのレジストリをオフラインで編集してシステムエラー発生時の既定の動作を変更したり、オフラインでイベントログを参照したりする方法を紹介しました。

 トラブルが発生する直前に行った作業や、Windows Updateによる自動更新のタイミング(毎月第2火曜日の翌水曜日)に、調査で得られたシステムエラーのエラー番号やエラーメッセージ、イベントログに記録されたエラーや警告イベントを付き合わせれば、問題を引き起こした更新プログラムやデバイスドライバー、アプリケーションを特定できることがあります。

 「システムの復元」で簡単に回復することもできますが、原因を特定しなければ、問題が再発してしまうかもしれません。例えば、特定の更新プログラムに原因がある場合、その更新プログラムを自動インストールしないようにWindows Updateを構成しておかなければ、すぐにまた自動インストールされて問題が再発するでしょう。

オフラインのWindowsから更新パッチを削除する

 問題の原因がWindows Updateまたは手動でインストールされたマイクロソフトの更新プログラムであると分かった場合は、WinREやWinPEで起動したPCの「コマンドプロンプト」から問題を引き起こしている更新プログラムを次の方法でアンインストールすることができます。

 まず、WinREやWinPEにマウントされた、起動しなくなったWindowsのインストールを含むボリュームのドライブ文字を特定します。正常起動時のCドライブであった、「Windows」「Program Files」「Users」フォルダーが存在するボリュームです。WinREやWinPEで起動した場合、通常CドライブまたはDドライブにマウントされます。XドライブはWinREやWinPEが使用しているRAMディスク上のボリュームなのでこちらは違います。

 オフラインのWindowsイメージを含むドライブ文字を指定して、次のコマンドラインを実行し、更新プログラムの「パッケージID」を取得します。

DISM /Image:<ドライブ文字:\> /Get-Packages


 更新プログラムのナレッジベース(KB)番号が分かっている場合は、FINDコマンドで検索すると素早く見つけることができます。

DISM /Image:<ドライブ文字:\> /Get-Packages | FIND "<KB番号>"


 更新プログラムの「パッケージID」が分かったら、次のコマンドラインを実行してアンインストールします(画面1)。パッケージIDは「コマンドプロンプト」ウィンドウのタイトルバーを右クリックすると表示されるメニューから「編集」→「範囲指定」「コピー」「貼り付け」コマンドを使用して、コピー&ペーストすると入力が簡単です。

DISM /Image:<ドライブ文字:\> /Remove-Package /PackageName:<パッケージID>


画面1 画面1 DISMコマンドを使用して、オフラインのWindowsから更新プログラムをアンインストールする

 次のコマンドラインを実行してPCを再起動すると、更新プログラムの構成が始まります。

Wpeutil Reboot


 その後、正常に起動できれば問題は解決です。Windows Updateを実行して問題の更新プログラムがインストール対象として検出されたら、その更新プログラムが今後、自動インストールされないように非表示にしておきましょう。

オフラインのWindowsからドライバーを削除する

 問題の原因が最近更新した、あるいはインストールしたサードパーティ製のデバイスドライバーであると分かった場合は、WinREやWinPEで起動したPCの「コマンドプロンプト」から次の方法で問題のドライバーを削除することが可能です。

 更新プログラムの場合と同様、起動しなくなったWindowsのインストールを含むボリュームのドライブ文字を特定したら、次のコマンドラインを実行して、問題のドライバーの「公開名」を取得します。問題のドライバーを識別するのは難しいかもしれませんが、「元のファイル名」「クラス」「プロバイダー名」が参考になるでしょう。

DISM /Image:<ドライブ文字:\> /Get-Drivers


 ドライバーの「公開名」が分かったら、次のコマンドラインを実行してドライバーを削除します(画面2)。

DISM /Image:<ドライブ文字:\> /Remove-Driver /Driver:<公開名(.inf)>


画面2 画面2 問題の原因となっているドライバーをオフラインのWindowsから削除する

 この方法でPCの起動トラブルを解決できるケースは、実際にはないかもしれません。例えば、ディスプレードライバーの問題でPCが正常に起動しない場合(画面が真っ黒のまま、表示が乱れるなど)はこの方法ではなく、低解像度ビデオモードでPCを起動して、問題のドライバーを削除または入れ替えるのが教科書的なやり方になるでしょう。

 低解像度ビデオモードでPCを起動するには、Windows VistaやWindows 7の場合はPC起動時に[F8]キーを押して表示される「詳細ブートオプション」メニューで「低解像度ビデオ(640×480)を有効にする」を選択します。

 Windows 8やWindows 8.1の場合は「回復」ページから「オプションの選択」ページに入り、「トラブルシューティング」→「詳細オプション」→「スタートアップ設定」と選択して、「スタートアップ設定」ページで「低解像度ビデオモード」を選択します。

オフラインのWindowsから機能を無効化する

 これは最近、筆者が実際に経験したことですが、Windows Serverを管理していて、サーバーに特定の役割または機能を追加して再起動したところ、正常に起動しなくなったということがありました。具体的には、フェールオーバークラスターに参加するサーバーに「マルチパスI/O(MultipathIO)」の機能を追加したところ、1台のサーバーだけシステムエラー「INACCESSIBLE_BOOT_DEVICE(0x0000007B)」が発生して、再起動を繰り返すようになったのです。

 デスクトップ向けのWindowsの場合、追加で機能を有効化することはあまりないかもしれませんが、64bit版のWindows 8 Pro/Enterprise、Windows 8.1 Pro/EnterpriseのHyper-V(クライアントHyper-V)を有効化しようとして問題が発生することがあるかもしれません。

 Windowsの役割や機能も、DISMコマンドでオフラインのWindowsから削除することが可能です。逆に、オフラインのWindowsに、新たに役割や機能を追加することもできます。

 例えば、「Hyper-Vの役割」(管理ツールを除くコア部分、機能名「Microsoft-Hyper-V」)を削除するには、次のコマンドラインを実行します(画面3)。

DISM /Image:<ドライブ文字:\> /Disable-Feature /FeatureName:Microsoft-Hyper-V


画面3 画面3 オフラインのWindowsからHyper-Vの役割を無効化する

 役割や機能のインストール状況や「機能名」を確認するには、次のコマンドラインを実行してください。

DISM /Image:<ドライブ文字:\> /Get-Features


 役割や機能の削除後に再起動が必要なものについては、次回の通常起動時に構成が行われます。その後、正常に起動できれば問題は解決です。あとは、回避策が公開されるまで、問題の機能を有効化しないように注意しましょう。

SysinternalsのAutorunsで起動問題に対処する

 問題の原因が特定のアプリのインストールと分かった場合、WinREやWinPEで起動したPCからそのアプリを削除するのは、アプリの提供元が手順を公開していない限り困難です。

 そんなときに役立つのが、マイクロフトが無償提供している「Windows Sysinternals」の「Autoruns」(Autoruns.exe)です。Autorunsは、Windowsの起動やパフォーマンスの問題、あるいはマルウェアの問題を調査し、対処するのに役立つユーティリティです。これを使えば、アプリのアンインストールは難しくても、アプリに関連するサービスやドライバーが自動開始するのを一時的に無効化したり、削除したりすることができます。

 AutorunsはWindowsの起動時やユーザーのログオン時、スケジュールタスクなど、自動実行の構成が可能な、考えられる既知の場所を全て検索し、結果をレポートすることができます。検出されたエントリのチェックボックスをオフにすることで、一時的に無効化して影響を試すことができますし、チェックボックスを再びオンにすれば元の状態に簡単に戻すことができます(画面4)。問題があるエントリであれば、完全に削除してしまうことも可能です(エントリを右クリックして「Delete」を選択するだけです)。

画面4 画面4 チェックボックスをオフにするとPCを次に通常起動した際に、この項目が読み込まれない

 Autorunsを起動すると、現在実行中のWindowsを対象に自動実行されるエントリを列挙しますが、オフラインのWindowsイメージを対象に実行することも可能です。また、Autorunsは単体で実行できるユーティリティであるため、WinREやWinPEで実行することも可能です。

 マルウェアが問題の原因となっている場合はPCを起動できても、マルウェアの隠蔽(いんぺい)により、Autorunsでは検出できないかもしれません。しかし、WinREやWinPEでPCを起動すれば、マルウェアが動作していない状態で調査できるので有効です。

 WinREやWinPEでPCを起動したら「コマンドプロンプト」を開いてUSBメモリやファイル共有から「Autoruns.exe」を実行し、「File」メニューから「Analyze Offline System」を選択します。「Offline System」ダイアログボックスでオフラインのWindowsの「Windows」フォルダーのパスと、ユーザープロファイルフォルダーを指定すれば、オフラインのWindowsとそのユーザーに設定された自動開始エントリが検索され、列挙されます(画面5)。

画面5 画面5 WinREやWinPEでAutorunsを実行し、オフラインのWindowsのパスを指定して調査する

 なお、64bit OS環境のPCにプレインストールされるWinREや、64bit OSのインストールメディアから起動するWinPEは、32bitサブシステム(Windows 32bit emulation on Windows 64bit:WOW64)を搭載していません。Autorunsは32bitの実行イメージなので、64bit環境では実行できないことに注意してください。32bit版のWinPE環境(32bit Windowsのインストールメディアなど)を準備できるのであれば、そのWinPEで起動してAutorunsを実行することは可能です。

ネットからツールを直接ダウンロードしたい!

 WinREやWinPEの「コマンドプロンプト」で次のいずれかのコマンドラインを実行すると、有線ネットワークを初期化して、TCP/IPによる通信が可能になります。DHCPによるIPアドレスの自動割り当てが可能なネットワークに接続されていれば、すぐにpingやarpといった基本的なTCP/IPコマンドの実行や、NET USEコマンドやUNC名(\\コンピューター名またはIPアドレス\共有名)によるWindowsファイル共有(SMB共有)への接続が可能です。

startnet

または

wpeutil InitializeNetwork


 問題の調査や対処のために、インターネットで公開されているツールを使いたいという場合があるでしょう。例えば、先ほどのAutorunsのようなツールです。手元に正常起動するWindows PCやMacがあれば、ファイル共有を介してツールをWinREやWinPE環境に取り込むことが可能です。その際、ツールのサイズがよほど大きくない限り、RAMディスクであるXドライブ上のパスに配置することができます。

 手元にあるのが正常に起動しないPCだけの場合は、このような手段はとれません。残念ながら、WinREやWinPEではInternet Explorerは利用できないため、Web上で公開されているツールをWinREやWinPEの環境から直接ダウンロードすることは難しいと思います。できるとすれば、正常に起動しなくなったPCが私物PCであれば友人に頼む、ネットカフェを利用する、職場のPCであれば、職場の他のPCを利用するなどの方法で、USBメモリにツールを格納して取り込むことになるでしょう。

 目的のツールがFTPサイトに公開されているなら、WinREやWinPEに標準搭載されているFTPクライアント(ftp.exe)を使うことができます(画面6)。ただし、WindowsのFTPクライアントはファイアウォールフレンドリな「パッシブ(Passive、PASV)モード」をサポートしていないので、既定でWindowsファイアウォールが有効なWinREやWinPEではデータ転送の着信(lsやget)がブロックされてしまいます。これを許可するには次のコマンドラインを実行して、Windowsファイアウォールを無効化する必要があります。

wpeutil DisableFirewall


画面6 画面6 WinREやWinPEでは、レガシーなFTPクライアントなら利用可能。FTPコマンドの使い方を知っている人って、もう絶滅危惧種?

 なお、同じくパッシブモードに対応していないという理由で、インターネット接続に使用しているルーターのファイアウォール構成によっては、データの転送に失敗することがあります。

 WindowsにもUNIXやLinuxのwgetやcurlのように、コマンドラインから指定したURLのバイナリファイルをダウンロードできるツールがあるとよいのですが、残念ながら標準ではありません。WinPEやWinREはWindows Script Host(WSH)のスクリプトの実行はサポートしているので、VBScriptなどでその場で自作する、あるいは第三者が作成したものを手入力して使うという手はあるかもしれません。しかし、筆者が試した限り、バイナリファイルをダウンロードするよくあるサンプルコードでは、WinREやWindowsインストールメディアのWinPEの制約が影響してうまくいきませんでした。

 しかし、諦めるのはまだ早いです。ファイルのダウンロードに利用できるツールを現地(トラブル中のPC)で調達できるかもしれません。PCのもともとのCドライブの「Program Files」フォルダーや「Program Files(x86)」フォルダーに、Internet Explorer以外のWebブラウザーのフォルダーが存在しないかどうかを探してみてください。

 見つかったWebブラウザーの実行ファイルを起動してみれば、もしかしたらWinREやWinPE環境でも動いて、インターネットからツールをダウンロードするのに利用できるかもしれません(画面7)。筆者が試したところ、Mozilla FirefoxやGoogle Chromeはこの方法で動作しました。この方法で、Internet Explorer(iexplore.exe)を動かすことはできません。

画面7 画面7 32bit版のWinREやWinPEなら、ローカルディスクにあるInternet Explorer以外のWebブラウザー(FirefoxやChrome)を拝借することで、トラブルシューティングツールをネットからダウンロードできるかもしれない

 なお、先ほどAutorunsでも触れましたが、64bit版のWinREやWinPEで起動した場合は32bitアプリケーションを動かすことはできません。実行しようとしても“この種類のイメージのサポートに必要なサブシステムがありません。”と表示されるだけです。同様に、32bit版のWinREやWinPEで起動した場合は64bitアプリケーションを動かすことはできません。この場合は、“実行中のWindowsバージョンと互換性がありません。”と表示されます。

「山市良のうぃんどうず日記」バックナンバー

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2014)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手がける。個人ブログは『山市良のえぬなんとかわーるど』。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。