起動不能なPCからインポートずみ証明書を救出せよ!
1. ことの始まり
先日、遠くの知人から「手元の PC で Windows XP を起動できなくなった」と連絡がありました。 最初のロゴ表示が終わったところでフリーズする状態で、セーフモードでの起動もできないそうです。
彼は言います。
「HDD を取り出し別の PC につないで最新版のデータファイルを全部拾い上げたので、普段使ってるソフトの数を考えればもとの環境の復旧に時間をかけるよりも新しい環境へデータを移行する方が早そうだ」
幸い HDD に物理的損傷はなかったようです。
よかったね今後は HDD のまるごとバックアップもこまめにやるべし、と答えると、「実はひとつだけ問題が残っている」とのことでした。
話はここから始まります。
2. インポートずみの証明書を取り出したい!
問題というのは「Windows 証明書ストアへインポートずみの SSL クライアント証明書」でした。 この証明書は某社のオンラインサービスへアクセスするためのもので、インポート時に使った元の証明書ファイルはすでに破棄しています。彼は日常のバックアップをユーザファイル単位で実施していたためインポートずみ証明書の存在が盲点となっていたようです。
ユーザがインポートした証明書データの実体は Windows のレジストリ上に格納されます。 そして、正しくこれにアクセスするには当該ユーザのアカウントで Windows 環境にログオンする必要があります。 問題の証明書はインポート時に「エクスポート可能」に設定していたそうなので旧環境へログオンさえできればストアからエクスポートして再び使用することができるでしょう。しかし、その環境では肝心の Windows XP が正しく起動しないためログオンすることはできません。さて?
3. 彼の事情
それならやっぱり元の環境を修復したら?まず旧い環境のレジストリを修復して、それでも駄目なら Windows のシステムファイルの破損の有無を調べて云々・・・と伝えると彼はこう言います。
「いや、元の環境の Windows が起動するように復旧できればたしかにベストだけど、いま必要なのはこの証明書を拾い上げることだけなんだよね。あれこれ試行錯誤を重ねながらうまくいくかどうかわからない復旧作業に時間をかけるよりも気の利いた方法はないかと思って」
「証明書を再発行してもらうこともできるがそれには日数がかかる。 でも今ちょっと急いでるのでなんとか元の環境から証明書をサルベージできないものか?」
聞けば、すでに元の PC には別の HDD を装着しリカバリーディスクを使ってクリーンな環境を用意しているそうです。 彼は PC の扱いには長けており、情報を探りながら時間をかければ旧環境を修復できる可能性があることも理解しています。多少複雑な手順でも必要とあれば操作することができるでしょう。今回の相談はその上でのことでした。
4. アイディア
しばらく考えてふと思いついたことがありました。
彼の手元には同じ PC の上で今ちゃんと動いている Windows 環境を収めた HDD と、動かなくなった環境の HDD のふたつがあります。別途インストールしたソフトウェアやそれを使って作成したユーザファイルの有無はひとまず置いておくとして、このふたつの環境でもっとも本質的な違いはなにか?
ずばり、「レジストリの内容」ですね。
旧い HDD 上の Windows 環境のレジストリには、所定のアカウントでインポートを行った証明書の実体も、そのアカウントそのものの情報も含まれています。 したがって、今正しく起動している新しい HDD に、旧い HDD 上のレジストリデータをまるごとを移植すれば、新しい Windows 環境の上に旧いアカウントのログオン環境を再現できるのではないか?と考えました。 これがうまくいけば旧環境でのアカウントで新環境へログオン可能となり、例の証明書にもアクセスできるはずです。
もちろん、旧環境のレジストリには旧環境にのみインストールずみのソフトウェアに関する情報等も含まれています。 そのため新しい環境に完全に整合するわけではありませんが、そうした差違の中には Windows へのログオンという太い文脈を妨げるほどの大きな要素は滅多に含まれないはずです。 たとえば、ログオンをトリガーに起動するようレジストリ上に設定のあるソフトウェアが実在しなければエラーにはなるでしょう。しかし、多くの場合ログオン処理自体がそこで停止することはありません。
Windows には闇の部分が多いためこのアイディアが有効なのかどうか確信はないものの、全体としては筋が通っているように思います。 強引な方法ではありますが駄目でもともと、失敗しても元に戻せばすむことです。また、こういう実験はこういう状況だからこそ試せることでもあります。たとえあれこれエラーが出たとしても、たった一度だけでも旧アカウントでシステムへログオンさえできれば成功です。
5. レジストリの実体は?
では、レジストリを構成するファイルの実体はどこにあるのでしょう。
Microsoft 社が以下の記事に説明を掲載しています。
http://support.microsoft.com/kb/256986/ja
要するに Windows XP の場合はこういうことです。
A. Windows\system32\config\ 下の Sam, Security, Software, System, Default の5つのファイル
B. Documents and Settings\*\ 下 の Ntuser.dat
レジストリは A と B により構成されています。 そのため、旧い HDD からこれらのファイルを新しい HDD にコピーしてやれば良さそうです。
6. 「C:\System Volume Information」?
ただ、今回の場合、旧い HDD では Windows の起動に失敗するという事情があるため、そもそもレジストリの内容が破損している疑いもあります。 そのため異常が発生する前のレジストリデータを使用したいところです。
実は、Windows XP はレジストリデータのバックアップを「\System Volume Information」フォルダの下の _restore{*}\RP*\snapshot\ 下に自動的に作成しています。
※「System Volume Information\」フォルダには Hidden 属性が付与されています。さらにデフォルトでは SYSTEM アカウントのみがアクセスできるように設定されています。管理者権限があれば権限を追加・変更することも可能です。
_restore{*}\RP*\ は通常複数存在しますが、snapshot\ フォルダ下の次の5つのファイルのタイムスタンプによりどの時期のものかを判断することができます。
- _REGISTRY_MACHINE_SAM
- _REGISTRY_MACHINE_SECURITY
- _REGISTRY_MACHINE_SOFTWARE
- _REGISTRY_MACHINE_SYSTEM
- _REGISTRY_USER_.DEFAULT
- SAM
- SECURITY
- software
- system
- default
※このあたりの事情については(株)アクセンス・テクノロジー様が大変有用な情報を掲載されています
http://omake.accense.com/wiki/レジストリ修復
7. 具体的な手順
以上の内容をベースに、ある一台の PC において「起動不可となった Windows 環境の HDD」から「正常に起動する Windows 環境の HDD」へユーザ環境を含むレジストリ情報をコピーする手順をまとめてみました。
- PC 上の新 HDD 上の Windows の SP レベルを旧 HDD 上のそれに合わせておく
(Windows バージョンの差に起因する不整合を最小限に留めるため) - 旧 HDD を USB I/F 等で PC に接続する
- KNOPPIX や Ubuntu など NTFS に対応した OS の Live CD で PC を起動する
(新旧両方の HDD に Windows OS による権限管理の影響を排してアクセスできるようにするため) - 新 HDD の Windows\system32\config\ 下の SAM, SECURITY, software, system, default の 5 つのファイルをリネームしておく
(後続のコピーで上書きせず後から元に戻せるようにするため) - 新 HDD の Documents and Settings\ フォルダをリネームしておく (後続のコピーで上書きせず後から元に戻せるようにするため)
- 旧 HDD 上の \System Volume Information\ 下から前述の方法で選んだ 5 つのレジストリファイルを適当な作業場所へコピーし、 それぞれ SAM, SECURITY, software, system, default の名前にリネームする
- 上記の 5 ファイルを新 HDD のWindows\system32\config\ 下へコピーする
- 旧 HDD 上の Documents and Settings\ フォルダを丸ごと新 HDD へコピーする
- 以上を終えた状態で、新 HDD から Windows XP を起動してみる
- 期待通りに起動できなければ Live CD から再起動し、変更内容を切り戻す・・・この場合はここで終了
- 期待通りに起動できれば旧環境時代に証明書をインポートしたアカウントでログオンし、インポート済みの証明書をエクスポートし適当なメディア等へコピーしておく
- PC を Live CD から再起動し、上の手順での変更部分を元の状態にもどす
- PC を新 HDD から再起動し、先ほどエクスポートした証明書をインポートして終了
8. 結果
しばらくして彼から「成功した!」と連絡がありました。オンラインサービスにも無事にアクセスできたそうです。 いささか荒っぽいやり方でしたが、こういう経験はいざという時に役に立つかもしれません。
なお、今回の成功の背景にはここに書いた内容のほかに筆者を含め当事者の意図しない好条件が重なっていた可能性も考えられます。 あくまでもあるひとつのケースにおいて有効となった方法であることをご了承下さい。野心的実験を試みてお手元の愛機が残念な状態になったとしても、筆者も KLab も一切責任をもてませんので念のため ;-)
(tanabe)