デスクトップ ファイルWindows PE を拡張する

Wes Miller

5 年以上も前に私たちが Windows PE をリリースしたときよりも前に、熱心なユーザーは、より多くの機能を求めていました。残念ながら、Windows PE は、オペレーティング システムの追加層を追加することによって拡張できる Windows XP Embedded と同じように簡単に拡張できるようには設計されていませんでした。もちろん、Windows PE には、基本的な

Win32® サポート (ほとんどの Windows® アプリケーションが機能することを可能にするため)、およびネットワークと大容量記憶域サポート (ネットワークを介して通信し、Windows をインストールすることを可能にするため) を実装する必要がありました。しかし、私たちは、当初からシェルを抑制することを考えていました。私たちは、従来の Windows エクスプローラ シェルではなく cmd.exe を使用することにより、Windows PE 環境が実行できることを制限しました。さらに重要なことですが、その結果、既定の環境では、すべての自動化タスクのスクリプトを簡単に記述することが可能になりました。

それでも、Windows PE を拡張することは可能です。ただ、制限があるので注意してください。図 1 に示すテクノロジが必要な場合は、アプリケーションが機能しない場合や正常に機能しない場合があります (これは包括的な一覧ではありません)。

Figure 1 不足している Windows API

.NET Framework (任意のバージョン)
Active Directory® サービス インターフェイス (ADSI)
DirectX®
Microsoft Data Access Components (MDAC)
Jet (Access)
Visual Basic® (.NET 以前のバージョンを含む)
Windows と共にネイティブにインストールされないフレームワークを必要とする実行タイプ
エクスプローラまたは Internet Explorer
Windows Media® Player
SAPI、MAPI、TAPI (それぞれ Windows Speech、メール、テレフォニー API)

アプリケーションが何に依存するかがわからない場合は確認する必要があります。その方法を考えてみましょう。私たちも、ADO、HTML アプリケーション (HTA)、および Windows スクリプト ホスト (WSH) コンポーネントを Windows PE で動作させようとしたときに同じ問題に直面しました。この記事では、これらの依存関係を追跡する方法を説明しますが、MKIMG コマンドが含む以上の Windows バイナリを Windows PE イメージに追加することは、使用許諾契約書の条項に違反することに注意してください。そのような変更を環境に実装するには、マイクロソフトから追加ライセンスを取得する必要があります。

依存関係を理解する

アプリケーションの .inf ファイルをメモ帳で開いて注意深く検証すると、多くのことがわかります。事実、多くの場合、これはアプリケーションの意味を理解して、その依存関係を確認する最も簡単な方法です。Windows PE に関して理解しておくべき重要なことは、信頼できるレベルでアプリケーションを実行するには、依存関係を複数のレベル (アプリケーション自身の直接的な依存関係および直接的な依存関係が呼び込む依存関係の両方) でデバッグする必要があるということです。注意を怠ると依存関係が複雑になることがあります。いくつかの偶発的な (または意図的な) コンポーネント追加があると、イメージは複雑になりサイズも大きくなります。

アプリケーションを説明する .inf ファイルがない場合は、.ini がシステムに追加するレジストリおよびファイルを見つけることによって、依存関係に関するヒントを得ることができます。CopyFiles および AddReg セクションを探します。これらのエントリは、アプリケーションが依存するその他のアプリケーション、DLL、およびその他のファイルを参照します。Windows PE の 3 つのアドイン (ADO、HTA、および WSH) のうち、作成が最も簡単だったのは WSH です。再配布可能なバージョンの WSH は古いバージョンの Windows でも使用可能で、今日の Windows には WSH のファイル関連付けを実行する .inf が組み込まれているので、WSH を Windows PE にインストールすることは比較的簡単でした (%windir%\inf\wsh.inf)。

Orca およびスナップショット

アプリケーションが Microsoft® インストーラ (MSI) ファイルとして配布される場合、依存関係を検索するには 2 つの方法があります。MSI に精通しているユーザーは、Orca (Windows Server® 2003 R2 プラットフォーム SDK の一部として go.microsoft.com/fwlink/?LinkId=77941 (英語) で配布されている Windows インストーラ ファイル編集用ツール) を使用して MSI を表示できます。特定のコンポーネントの MSI をインストールして、ファイルおよびレジストリ キーの変更を行う前後の比較分析を実行することもできます。レジストリのダンプ、アプリケーションのインストール、レジストリ キーの再エクスポートを行った後に WinDiff を実行できます ("WinDiff を使用する" サイドバーを参照してください)。その結果は、レジストリに行う必要のある変更のテンプレートとして使用できます。問題は、変更の数が非常に多くなる可能性があることです。それでも、この方法は .inf を参照できない場合 (またはアプリケーションの作成者に確認できない場合) に最適なオプションです。

もう 1 つのオプションは、アプリケーション スナップショットです。本質的に、これはアプリケーションが実行できるようにすることを目的とした変更前後の比較分析と同じです。以前、マイクロソフトは、この比較分析を目的とした (Windows 2000 用) ツールを配布していましたが、そのツールは新しいバージョンの Windows では機能しません。この処理は、多くの商用アプリケーション (インストール リパッケージャ) だけでなく、一部のフリー ユーティリティでも行うことができます。ソリューションごとにプラットフォーム SDK をインストールします (前の段落内のリンクを参照してください)。プラットフォーム SDK には WinDiff が含まれています。WinDiff の比較分析を実行するには、実際に使用する Windows PE のバージョン (Windows PE 1.6) である Windows Server 2003 Service Pack 1 (SP1) にアプリケーションをインストールすることをお勧めします。Windows PE 1.6 は、Standard Edition または Enterprise Edition (SP1) からビルドされています。このタスクを Windows Server 2003 上で実行することによって、Windows PE での環境に最も近い環境をシミュレーションできます (Windows PE では MSI を実行できません)。詳細な手順については、"WinDiff を使用する" サイドバーを参照してください。

この方法では、十分な量の変更された情報が表示されます。残念ながら、変更された情報をレジストリまたはファイル キャプチャからエクスポートして、アプリケーションをインストールするマニフェストを作成するための簡単な方法はありません。変更は手動で組み込む必要があります。これが最初のバージョンの Windows PE における最も困難な問題でした。マイクロソフト内に HTA コンポーネントの定義がなかったので (Internet Explorer® の外部)、HTA コンポーネントを機能させることは複雑な作業でした。私たちは、差分を使用することによって、機能するために十分な HTA を手動で処理できました。これらのキーを手動で Windows PE レジストリに追加することは可能ですが、キーは Windows PE が起動した後に追加することをお勧めします。Windows PE ビルド ツールに含まれている buildoptionalcomponents.vbs スクリプトを使用して、HTA、WSH、または ADO サポートを Windows PE にインストールするために使用した OC.bat および OC2.bat ファイルを表示できます。

便利なツール

直接的な依存関係を分離した後でも、アプリケーションが依存する個々のバイナリを見つけることができない場合があります。たとえば、同じタスクを実行するために別の DLL または OCX が必要かどうかがわからない場合があります。どうやって判断すればよいでしょうか。Sysinternals の Mark Russinovich (現在はマイクロソフトのテクニカル フェロー) が、この処理を行う listdlls という便利なユーティリティを記述しています。Listdlls は、microsoft.com/technet/sysinternals/utilities/ListDlls.mspx(英語) からダウンロードできます。このユーティリティを使用するには、コマンド listdlls.exe > dlls.txt を実行して出力を確認します。図 2 は、listdlls 自身に対して実行した listdlls の出力を示します。このリストを Windows PE に含まれている DLL および OCX ファイルと比較して、アプリケーションのすべての依存関係が存在するかどうかを確認できます (listdlls の場合、すべての依存関係が存在します)。Windows PE の HTA サポートに関しては、その他の方法で識別できなかった依存関係を識別するために listdlls が不可欠でした。

図 2 自身に対して実行された Lisdlls の出力

図 2** 自身に対して実行された Lisdlls の出力 **(画像を拡大するには、ここをクリックします)

しかし、DLL がリストに含まれていても、アプリケーションが機能するためにその DLL が必ずしも必要なわけではありません。たとえば、メモ帳を起動すると、uxtheme.dll が読み込まれます。Windows PE では、この DLL は使用できません。実際のところ、Windows テーマは使われないので、この DLL が読み込まれることはありません。listdlls によって出力されるどの DLL が実際に必要で、どの DLL が Windows によってオンデマンドで読み込まれるかを理解するには、多くの試行錯誤を行うか、Windows の非常に低レベルの側面を理解する必要があります (後者については、2004 年に Microsoft Press® から刊行された Mark Russinovich、David Solomon 共著『Microsoft Windows Internals, Fourth Edition』を参照することをお勧めします)。

事実、Mark Russinovich は、Windows タスク マネージャの代替として無償で提供されている Process Explorer に同じ機能を組み込んでいます。listdlls は、(個人的な意見では) 簡単にスクリプト化して不足している依存関係の検出および収集に使用できる出力を作成する点が異なります。

一度でもイメージに DLL を追加すると、何らかの作業を行わなければならない可能性があることに注意してください。DLL には、登録が必要なものと必要でないものの 2 種類があります。残念ながら、この 2 つを簡単に区別する方法はないので、1 つずつ登録してみる必要があります。DLL (または OCX) を登録するには、regsvr32 dllname.dll を実行します。これが正常に機能した場合は、DLL が登録されたことを示すダイアログ ボックスが表示されます。正常に機能しなかった場合は、メッセージが表示されないこともありますが、多くの場合、DLL の登録に失敗したこと、または DLL を登録できなかったことを示すダイアログ ボックスが表示されます。Windows PE の HTA および ADO オプション コンポーネントを開発している間、私たちは、DLL の登録を行うとき、インストール用に .inf ファイルを一時的に書き込むため、またはその他の依存関係 (必要な特定のディレクトリなど) を記録するために、書き込み可能なストレージが DLL に必要なことを発見しました。Windows PE では、これは失敗を意味するものでした。幸いなことに、Windows PE 2.0 では、使用可能なスクラッチ領域が既定で存在するので、このようなタスクが機能するようになりました。

Mark Russinovich が作成した 3 つ目のツールは、最近リリースされた Process Monitor というツールです。Process Monitor は、Regmon および Filemon のスーパーセットとして表示でき、Regmon や Filemon よりも高度な詳細を提供し、プロセス間通信の新しい層を追加します。この非常に強力なツールは、Windows でのアプリケーションのトラブルシューティングだけでなく、DLL の相互依存関係がどのようになっているかを確認するためにも役立ちます。Process Monitor は、ダウンロードして入手できます (英語)。

Windows PE ファイルを削除する

Windows PE にコンポーネントを追加する機能と同様に、頻繁に寄せられるもう 1 つのリクエストは、Windows PE のサイズを小さくする方法でした。Windows PE のサイズを小さくするために実行できるいくつかの手順があります。Windows PE のライセンス コピーには、一連のビルド ツールおよびドキュメントが含まれています。ドキュメントには winpe.chm というヘルプ ファイルが含まれています。このファイルを開きます。「Windows Preinstallation Environment User’s Guide」セクションに「Reducing the Size of Windows PE」というタイトルのトピックがあります。このセクションには、不要な場合に安全に削除できるファイルのリストがあります。削除可能なファイルに関するセクションは 3 つあります。

  • フォント ファイルは常に安全に削除できます。
  • ネットワーク関連の .inf ファイルおよびユーティリティは削除できますが、対象のビルドをネットワークで一切使用しない場合にのみ削除してください。
  • コマンドライン ユーティリティを削除することはお勧めしません。その機能が明白で、削除した場合の結果も明白である場合以外は、コマンドライン ユーティリティは削除しないでください。

どのファイルを安全に除外できるかを判断したら、mkimg.cmd によってビルドが完了した後に、バッチ ファイルまたはその他のスクリプトを記述して Windows PE ビルドからファイルを削除できます。

Windows PE のレジストリを変更する

私たちは、ビルド時にオプション コンポーネントを意図的にインストールしませんでした。実行時に余計な時間がかかりましたが、これらのコンポーネントを Windows PE に組み込むための新しい方法をゼロから作る必要はありませんでした (そのような時間的および労力的な余裕はありませんでした)。しかし、レジストリを変更する場合 (アプリケーションにレジストリ変更のデルタを追加する場合やアプリケーションが機能するために必要な可能性のあるキーを編集する場合) はどうでしょうか。レジストリの変更は図 3 に示すように、regedit を使用して簡単に行うことができます。次の手順に従います。

  1. regedit を実行して、HKEY_LOCAL_MACHINE ハイブを選択します。
  2. [ファイル] メニューの [ハイブの読み込み] を選択して、Windows PE ビルドの位置を参照します。I386\System32\ (ハード ドライブに配置するイメージの場合は MiniNT\System32) にある setupreg.hiv を選択します。
  3. ハイブの一時的な名前 ("WinPE" など) を入力して、HKLM の下にあるそのノードを参照します。
  4. このキーを必要に応じて変更します。効果としては、このノードは Windows の通常のインストールにおけるノード HKLM\System と同じです。
  5. 変更を行った後、手順 3 で HKLM の下に作成したキーを選択します (この手順を正しく実行しないと、システムが壊れることがあります)。
  6. [ファイル] メニューの [ハイブのアンロード] を選択します。確認ダイアログ ボックスで [はい] または [いいえ] を選択します。レジストリをロックしたままにすると Windows PE を正常にビルドできないので、レジストリのマウントは毎回確実に解除してください。

図 3 Windows PE のレジストリを開く

図 3** Windows PE のレジストリを開く **(画像を拡大するには、ここをクリックします)

これらの手順に従って HKLM\System を変更できます。I386\System32 には、レジストリのその他の領域を変更できるその他の 2 つのキーがあります。DEFAULT はユーザー (または Windows PE を使用する際に実行する SYSTEM) の既定のハイブで、SOFTWARE は HKLM\Software と同じです。レジストリは必要な場合にのみ変更し、変更する際は十分注意してください。

トラブルシューティングまたはリカバリ ツールを Windows PE に追加するために役立つ手順が理解できたと思います。来月は、Mark Russinovich が記述した非常に便利なシステム管理ツールのコレクションである PSTools スイートについて説明します。

WinDiff を使用する

WinDiff は、アプリケーションの依存関係の検索に便利です。WinDiff をインストールして実行するには、以下の手順に従います。

  1. 時間を節約し、最初と最後のスナップショットの間でのファイルまたはレジストリの変更を最小限に抑えるために、システムでインストールの準備をします。
  2. コマンド プロンプトを開いて、reg export HKLM C:\HKLM1.reg を実行してHKEY_Local_Machine レジストリ ハイブの完全なエクスポートを実行します。
  3. dir C:\*.* /S > C:\C1.txt を実行して、C: ドライブ上のすべてのファイルの完全なダンプを実行します (C: がシステム ドライブであることを前提とします)。
  4. アプリケーションをインストールして、インストール後の設定を構成します。
  5. reg export HKLM C:\HKLM2.reg を実行します。
  6. dir C:\*.* /S > C:\C2.txt を実行します。
  7. WinDiff を開いて、[File] メニューの [Compare Files] を選択し、[Select First File] ダイアログ ボックスで HKLM1 .reg を選択し、[Select Second File] ダイアログ ボックスで HKLM2.reg を選択します。
  8. 新しいファイルを示すメッセージが赤で表示されます。HKLM エクスポートのサイズは非常に大きい場合があるので、この処理には時間がかかることがあります。
  9. 相違点を展開するには、赤いテキストをダブルクリックします。
  10. 比較の表示内容を構成するには、[Options] メニューの [Show Right-Only Lines] を選択します。2 番目の比較対象ファイルに新しく追加された行だけが表示されます (新しいファイルおよび新しいレジストリ キーだけが表示されます)。

アプリケーションに関連するキーを見つけるには、検索機能を使用しなければならない場合があります。図 A および B では、私が作成した機能的アプリケーションのファイルおよびレジストリの変更が確認できます。WinDiff ではコピーおよび貼り付け機能が使用できます。これらの機能を使用するには、!> 行をクリックして、目的の行を選択します。

図 A WinDiff のエントリ

図 A** WinDiff のエントリ **(画像を拡大するには、ここをクリックします)

図 B WinDiff の特定のキー

図 B** WinDiff の特定のキー **(画像を拡大するには、ここをクリックします)

Wes Millerは、テキサス州オースティンにある Pluck 社 (www.pluck.com)(英語) の開発マネージャです。以前は、オースティンにある Winternals Software に勤務しており、その前はマイクロソフトで Windows のプログラム マネージャとプロダクト マネージャを兼任していました。Wes の連絡先は、technet@getwired.com(英語) です。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.