Windows PEによるDISMの単純利用法

Windows PE(Preinstallation Environment:プレインストール環境)はごく限られたサービス・機能だけを提供する最小限のOSです。
Windows PEを用意しておくと動作しなくなったOSのトラブルシュートや修復などもできるようになりますが一番大きな機能はDISM(Deployment Image Servicing and Management tool)かと思います。
DISMを使うと稼働中のWindowsのイメージファイル(wim)を作成して別のPCにそのイメージを展開して使用することができるようになります。
Windowsのイメージファイルをカスタマイズしないでそのまま使用するのであればディスクのコピーツールの方が同じことを簡単にできるかも知れません。

ここではWindows PEの作成とDISMのWindowsイメージの作成と展開の最も単純な利用方法を紹介します。
[参考サイト]
(1)Windows PE をインストールし、ドライブから実行する (フラット起動または非 RAM)
(2)WinPE: パッケージの追加 (オプション コンポーネント リファレンス)
(3)DISM を使ったハード ディスク パーティションのイメージのキャプチャ
(4)DISM を使ったイメージの適用


■ USBメモリへのWindows PEのインストール(その1:基本構成編)

  1. 準備するもの
    (1)16GBのUSBメモリ(Windows PEのインストールメディア)
    (2)Windows 8.1 Update対応のWindows ADKをインストールしたWindows 8.1 Enterprise (64ビット) ※評価版で構いません

  2. 64ビット版のWindows PEファイルセットの作成
    (1)スタートボタンの右クリックメニューの[検索]を起動して「展開」入力検索
    (2)ヒットした[展開およびイメージングツール構築]を右クリックして[管理者として実行]をクリック
    これによって「C:\Program Files (x86)\WindowsKits\8.1\Assessment and Deployment Kit\Deployment Tools>」というディレクトリをカレントにしたコマンドプロンプトが表示されます。
    (3)以下のコマンドを実行します。
    copype amd64 C:\WinPE_amd64



  3. USBメモリ側のセッティング
    16GBのUSBメモリをPCに接続して以下のコマンドを実行します。
    diskpart
    list disk
    select disk 16GBのUSBメモリのディスク番号
    create partition primary
    format quick fs=fat32 label="Windows PE"
    assign letter="P"
    active
    exit

  4. USBメモリへのWindows PEのインストール(Windows PEイメージのUSBメモリへの適用)
    以下のコマンドを実行します。
    dism /Apply-Image /ImageFile:"C:\WinPE_amd64\media\sources\boot.wim" /Index:1 /ApplyDir:P:\
    bcdboot P:\Windows /s P: /f ALL ※USBメモリ直下にBoot, EFIフォルダが作成されます

  5. Windows PEのブートテスト
    (1)Windows PEをインストールしたUSBメモリをUEFIモード対応のPCに接続
    (2)PCの電源オン
    (3)PC仕様に応じた操作でブートデバイスの選択画面を表示
    (4)起動デバイス一覧からUSBメモリをUEFIモードで起動する項目を選択してEnterキー押下
    (5)以下のようなコマンドプロンプト画面が表示されます。
    X:\Windows\system32>wpeinit ※「X」はWindows PEのパーティションのドライブ文字で「X」固定です
    (wpeinitはWindows PEセッションの開始コマンドで自動起動されます)
    X:\Windows\system32>
    (6)コマンドプロンプトでnotepadを起動して操作記録をテキストファイルとしてXドライブ中に残すことができます。
    (7)Windows PEセッションのシャットダウンは「wpeutil shutdown」で行ないます。

  6. Windows PEの壁紙変更
    Windows PEの壁紙画像はWindows\System32\winpe.jpgで青単色の壁紙になっています。
    それを通常のWindowsの壁紙(img0.jpg等)に置き換えるとWindows PEの壁紙を変更できます。



  7. 基本構成のWindows PEの問題点
    (1)表示はすべて英語となります。
    (2)キーボードは英語キーボードレイアウトになっています。
    (3)PowerShellが使用できません。



■ USBメモリへのWindows PEのインストール(その2:日本語化とPowerShellの組み込み構成編)

基本構成の問題点を解決したWindows PEは以下の手順で作成できます。
  1. 準備するもの
    (1)16GB/32GBのUSBメモリまたはCD-ROM/DVD(Windows PEのインストールメディア)
    ※64GBのUSBメモリはWindows PEのMakeWinPEMedia /UFDによる書き出しメディアとしては使用できません(MakeWinPEMedia /UFDで書き出しを行う場合内部的にDISKPART内でFAT32でフォーマットしようとして「ERROR: Failed to format E:; DiskPart errorlevel -2147212243.」エラーとなります)。
    (2)Windows 8.1 Update対応のWindows ADKをインストールしたWindows 8.1 Enterprise (64ビット) ※評価版で構いません

  2. 64ビット版のWindows PEファイルセットの作成
    (1)スタートボタンの右クリックメニューの[検索]を起動して「展開」入力検索
    (2)ヒットした[展開およびイメージングツール構築]を右クリックして[管理者として実行]をクリック
    これによって「C:\Program Files (x86)\WindowsKits\8.1\Assessment and Deployment Kit\Deployment Tools>」というディレクトリをカレントにしたコマンドプロンプトが表示されます。
    (3)以下のコマンドを実行します。
    copype amd64 C:\WinPE_amd64



  3. 64ビット版のWindows PEファイルセットの日本語化とPowerShell機能の追加
    上記の「copype amd64 C:\WinPE_amd64」の実行に続けて以下のコマンドを追加実行します。
    rem Windows PEイメージのマウント
    dism /Mount-Image /ImageFile:"C:\WinPE_amd64\media\sources\boot.wim" /index:1 /MountDir:"C:\WinPE_amd64\mount"
    rem dism /Mount-Image実行前のC:\WinPE_amd64\mountは空です
    rem dism /Mount-Image実行後はboot.wimがC:\WinPE_amd64\mountに展開されます

    rem 環境変数の設定(dism /Add-Packageコマンドを短く記述できるようにするためのものです)
    set mywinpeocs="C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs"

    rem 日本語対応化の前半(日本語ロケールパッケージと日本語フォントの導入)
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\ja-jp\lp.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\WinPE-FontSupport-JA-JP.cab

    rem PowerShellパッケージの追加(パッケージ間に依存関係があるため以下の順に実行)
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\WinPE-WMI.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\ja-jp\WinPE-WMI_ja-jp.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\WinPE-NetFX.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\ja-jp\WinPE-NetFx_ja-jp.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\WinPE-Scripting.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\ja-jp\WinPE-Scripting_ja-jp.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\WinPE-PowerShell.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\ja-jp\WinPE-PowerShell_ja-jp.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\WinPE-DismCmdlets.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\ja-jp\WinPE-DismCmdlets_ja-jp.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\WinPE-SecureBootCmdlets.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\WinPE-StorageWMI.cab
    dism /Add-Package /Image:"C:\WinPE_amd64\mount" /PackagePath:%mywinpeocs%\ja-jp\WinPE-StorageWMI_ja-jp.cab

    rem 日本語対応化の後半(日本語版Windows PEにするための設定変更)
    dism /Image:"C:\WinPE_amd64\mount" /Set-Allintl:ja-jp
    dism /Image:"C:\WinPE_amd64\mount" /Set-InputLocale:0411:00000411
    dism /Image:"C:\WinPE_amd64\mount" /Set-LayeredDriver:6
    dism /Image:"C:\WinPE_amd64\mount" /set-TimeZone:"Tokyo Standard Time"

    rem イメージのアンマウントと上記変更内容のコミット(保存)
    dism /Unmount-Image /Mountdir:"C:\WinPE_amd64\mount" /commit

  4. メディアへの日本語版Windows PEのインストール
  5. Windows PEのブートテスト
    (1)日本語版Windows PEをインストールしたメディア(USBメモリまたはCD-ROM/DVD)をPCに接続
    (2)PCの電源オン
    (3)ブートデバイスの選択
    (4)以下のようなコマンドプロンプト画面が表示されます。
    X:\Windows\system32>wpeinit ※wpeinitはWindows PEセッションの開始コマンドで自動起動されます
    ※「X」はWindows PE本体(メモリ中に展開されたProgram FilesフォルダやWindowsフォルダ等)の仮想パーティションのドライブ文字で「X」固定です
    X:\Windows\system32>
    (6)コマンドプロンプトでnotepadを起動すると日本語メニューが表示されます(但し、Windows PEの現仕様では日本語入力は不可)。
    (7)Windows PEセッションのシャットダウンは「wpeutil shutdown」で行ないます。

  6. ユーザプログラムやユーザデータの組み込みについて
    (1)インストーラが必要となるユーザプログラムはWindows PEに組み込むことはできません。
    (2)圧縮ファイルを展開するだけのアプリケーションについてはエクスプローラでC:\WinPE_amd64\media\myappのようなフォルダをエクスプローラで作成してそこへ展開されたフォルダをコピーします。
    または「xcopy /s /e」コマンドでファイルをコピーします。
    (3)32GBのUSBメモリでは容量不足になりそうなユーザデータやユーザプログラムを組み込む場合は「dism /Mount-Image」を実行してからC:\WinPE_amd64\mount\Windowsフォルダにそれらのデータ・プログラムのフォルダ/ファイルを格納し、「dism /Unmount-Image /Mountdir:"C:\WinPE_amd64\mount" /commit」を実行してから64GBのUSBメモリに「dism /Apply-Image」で書き込めばOKです。
    (4)アプリケーションのEXEファイルをWindows PEセッションで起動すると「この種類のイメージのサポートに必要なサブシステムがありません(英語版ではThe subsystem needed to support the image type is not present.)。」(多くの場合は32ビットサブシテムの意)等のエラーとなる可能性が高いです。
    日本語版Windows PEをインストールしたメディアのmyappフォルダにアプリケーションフォルダをコピーしてWindows PEセッションで動作するかどうかを逐次確認するしか手はないようです。
    (5)ユーザデータについてはエクスプローラでC:\WinPE_amd64\media\mydataのようなフォルダをエクスプローラで作成してそこへユーザファイルを格納すればWindows PEセッションからアクセスできます(但し、X:\mydataフォルダではなく、例えばD:\mydataフォルダのような扱いとなります)。
    (6)ftpでファイル送受信する場合は事前に「wpeutil DisableFirewall」でファイアウォールを無効にしておきます(ファイアウォールの有効化は「wpeutil EnableFirewall」)。
    (7)インストールメディアがCD-ROM/DVDである場合のWindows PEセッションではいろいろな制限が付きます。
    ・C:\WinPE_amd64\mediaは実際のCD-ROM/DVDのドライブとして扱われるためWindows PEセッションではそのドライブへのファイルの書き込みはできません。
    ・インストールメディアがCD-ROM/DVDである場合のファイルの書き込みはProgram FilesフォルダやWindowsフォルダ等のあるXドライブにしかできません。
    ・CD-ROM/DVDの書き込み禁止や容量等の制限からWindows PEセッションでISOファイルをPowerShellのMount-DiskImageでマウントする場合、ISOファイルの展開サイズが大きくなるようなISOファイルをマウントしようとすると「ファイルシステム制限のため、要求された操作を完了できませんでした」エラーとなります(マウント可能なISOファイルの上限はおよそ450MB位と考えておくといいかと思います)。

  7. ISOファイルのマウント例
  8. USBメモリのVHD化とHyper-V 仮想マシンでの利用
    USBメモリからHyper-V仮想マシン用の仮想ディスクファイル(VHDファイル)を作成して仮想マシンで実行してみました。
    (1)USBメモリから仮想ディスクファイル(VHDファイル:winpe_jp.vhd)を作成するためにUbuntu上のqemu-imgを利用しました。
    以下のコマンドを実行しました。
    sudo qemu-img convert -f raw -O vpc /dev/sdb xxxxx/winpe_jp.vhd ※/dev/sdbはUSBメモリのマウントデバイスで、xxxxxは出力先

    (2)HVSWinPE_JPという仮想マシン(第1世代)を定義します。
    仮想ハードディスクとしてwinpe_jp.vhdを割り当てます。
    (3)仮想マシンの起動



    ・実寸画像はこちらです。

  9. telnet/ssh接続
    Windows PEにはtelnetコマンドが付属していません。
    しかし64ビット版のWindows PEの場合は64ビット用のPuTTYが使用できます。
    64ビット用のPuTTYの解凍フォルダをWindows PEのmyappフォルダ(手動作成)にコピーするだけで使用可能となります。
    下記はPuTTYによるssh接続の使用例です。



    こちらは32ビット版のWindows PE上で動作している32ビット用のPuTTY実行例です。
    ※実行中のWindows PEが64ビットか32ビットかは「echo %PROCESSOR_ARCHITECTURE%」で確認できます(64ビットなら「AMD64」, 32ビットなら「x86」という表示になります)。

  10. Webサイトの閲覧
  11. コマンドプロンプトの複数起動
    Windows PEのコマンドプロンプトは場合によってはフリーズする場合があります。
    通常のWindowsならCtrl+Shift+EscでWindowsタスクマネジャを起動して[新しいタスク]でcmdを指定すれば別のコマンドプロンプトを表示できますがWindows PEではCtrl+Shift+EscでWindowsタスクマネジャを起動することはできません。
    またどのパーティションにどのドライブ文字が割り当てられているかを確認するためのDISKPARTのlist volコマンドの表示内容を見ながら別のコマンドプロンプトで作業をすることもあるかと思います。
    そこで最初のコマンドプロンプトが表示された時点でtaskmgrと打ってWindowsタスクマネジャを起動しておくことをお勧めします。
    Windows PEを日本語化してもWindowsタスクマネジャは英語モードのままです([New Task]をクリックしてcmdコマンドを入力すれば新しいコマンドプロンプトが起動されます)。



    蛇足ですがWindows PEで起動できるWindowsの付属GUIアプリはnotepad, taskmgr, regedit程度しかなさそうです。
    Hyper-V Serverならcontrolコマンドが使用できるので「control intl.cpl」で「地域」画面を表示したり、更には「control timedate.cpl」で「日付と時刻」画面を表示したりできます。

  12. GIMPの導入
    64ビット版Windows PEに64ビット版GIMPを導入してみました。
    64ビット版GIMPの導入手順は以下の通りです。



■ DISMによるハードディスクパーティションのイメージキャプチャ

ここではWindows 8.1 Enterprise(64ビット)をインストールした内蔵ハードディスクのイメージキャプチャ例を紹介致します。
ディスクの使用量はWindows 8.1 Enterprise(64ビット)をインストールした直後の使用量を想定しています。
テスト的にC:\tempフォルダを作成して数MBのテストファイルを追加格納してあります。
  1. 準備するもの
    (1)Windows PEをインストールしたUSBメモリ(ここでは日本語化する前の基本構成の英語版Windows PEを使用)
    (2)UEFIモード対応のPCとそのLAN接続環境
    (3)そのUEFIモード対応の内蔵ハードディスク(今回は250GBのHDD)にWindows 8.1 Enterprise(64ビット)をインストールした環境

  2. 350MBのシステム予約パーティションへのドライブ文字割り当て
    (1)Windows PEをインストールしたUSBメモリからUEFIモードでPCを起動します。
    (2)以下のコマンドを実行します。
    diskpart
    list disk
    select disk 250GBのHDDの番号
    list partition
    select partition 350MBのシステム予約パーティションの番号(通常0)
    assign letter="S" ※ドライブ文字としてSを割り当てます
    exit

  3. 内蔵HDDのパーティションのイメージキャプチャ
    (1)以下のコマンドを実行します。
    今回の環境ではWindows PEを起動した場合にWindows 8.1 Enterprise(64ビット)のCドライブがWindows PE側からDドライブとして見えましたのでDドライブ扱いとします。
    dism /Capture-Image /ImageFile:d:\my-windows-partition.wim /CaptureDir:D:\ /Name:"My Windows partition"
    ※これは40分程度掛かりました。またmy-windows-partition.wimファイルのサイズは4,031,336,834バイトでした。

    dism /Capture-Image /ImageFile:d:\my-system-partition.wim /CaptureDir:S:\ /Name:"My system partition"
    ※/ImageFile:で「s:\my-system-partition.wim」指定をすると「There is not enough space on the disk.」エラーとなるため「d:\my-system-partition.wim」指定にします。
    ※これは20秒程度掛かりました。またmy-system-partition.wimファイルのサイズは246,443,598バイトでした。

    (2)キャプチャしたイメージのネットワーク保存
    キャプチャしたイメージファイルをどこからでも参照できるようにネットワークに保存します。
    保存先のPC名はServerとし、共有名はShareとします。
    以下のコマンドを実行します。
    net use n: \\Server\Share ※共有フォルダへのドライブ文字「N」の割り当て
    (ここで共有資源への接続のためのユーザ名とパスワードを求められますのでそれぞれを入力します)
    md N:\Images ※共有先にImageフォルダを作成
    copy D:\my-windows-partition.wim N:\Images\ ※10分程度掛かりました
    copy D:\my-system-partition.wim N:\Images\ ※4分程度掛かりました

  4. Windows PEのシャットダウン
    Windows PEセッションのシャットダウンは「wpeutil shutdown」コマンドで行ないます。
    コマンドプロプトでexitを入力するとそれは「wpeutil reboot」と同じでPC再起動となります。



■ DISMによるイメージの展開(イメージの適用)

ここではキャプチャしたハードディスクをクリアして上記でキャプチャしてネットワーク保存したイメージをそのまま展開することにします。
  1. 準備するもの
    上記の「DISMによるハードディスクパーティションのイメージキャプチャ」で記載したものと同じもの。

  2. ハードディスクのクリアとパーティション再設定
    (1)Windows PEをインストールしたUSBメモリからUEFIモードでPCを起動します。
    (2)以下のコマンドを実行します。
    diskpart
    list disk
    select disk 250GBのHDDの番号
    list partition ※ディスク選択に誤りがないことの確認
    clean
    create partition primary size=350 ※350MBのシステム予約パティションの作成
    format quick fs=ntfs label="System"
    assign letter="S"
    create partition primary
    format quick fs=ntfs label="DISMWindows"
    assign letter="C"
    active
    exit

  3. 再設定したパーティションへのイメージの展開(イメージの適用)
    以下のコマンドを実行してネットワーク上に保存したイメージを展開(適用)します。
    net use n: \\Server\Share ※共有フォルダへのドライブ文字「N」の割り当て
    (ここで共有資源への接続のためのユーザ名とパスワードを求められますのでそれぞれを入力します)
    dism /Apply-Image /ImageFile:N:\Images\my-windows-partition.wim /index:1 /ApplyDir:C:\ ※10分程度掛かりました



    dism /Apply-Image /ImageFile:N:\Images\my-system-partition.wim /index:1 /ApplyDir:S:\ ※30秒程度掛かりました

  4. BCD(ブート構成データ)の初期化
    イメージを適用したハードディスクからブートできるように以下のコマンドでBCD(ブート構成データ)の初期化を行ないます。
    C:\Windows\System32\bcdboot C:\Windows /l ja-JP /f ALL

  5. Windows PEのシャットダウン
    コマンドプロプトでexitを入力してWindows PEをシャットダウンします。

  6. イメージ展開されたハードディスクからのWindows 8.1 Enterprise(64ビット)のブートテスト
    (1)Windows PEのシャットダウン後、電源オフ状態でWindows PEのUSBメモリの取り外し
    (2)PCの電源オン
    (3)PC仕様に応じた操作でブートデバイスの選択画面を表示
    (4)起動デバイス一覧から内蔵ハードディスクをUEFIモードで起動する項目を選択してEnterキー押下
    (5)デスクトップ操作が可能となります。
    当然ながらキャプチャ前にテスト的に作成しておいたC:\tempの内容もそのまま展開されています。



    ・実寸イメージはこちらです。



■ DISMによるUSBメモリへのイメージの展開(イメージの適用)テスト結果

ダメ元で、ネットワーク保存したイメージをUSBメモリに展開してみました。
結果的には展開自体はエラーもなく完了しましたがそのUSBメモリからのブートができませんでした。
  1. 準備したもの
    (1)Windows PEをインストールしたUSBメモリ
    (2)上記の「DISMによるハードディスクパーティションのイメージキャプチャ」で記載したものと同じPCとそのLAN接続環境
    (3)Windows To Go対応でない普通の64GB USBメモリ
    ※展開後の使用領域サイズは約17GBですが32GBのUSBエモリではイメージの適用で領域不足のエラーとなります。

  2. 64GB USBメモリのクリアとパーティション再設定
    今回使用した64GB USBメモリは工場出荷時はFAT32でフォーマットされていました。
    FAT32のパーティションにはイメージの適用ができないためNTFSでフォーマットし直す必要がありました。
    (1)安全のためにPCの内蔵ハードディスクを取り外しておきます。
    (2)Windows PEをインストールしたUSBメモリとイメージ適用先となる64GB USBメモリの接続
    (3)Windows PEをインストールしたUSBメモリからUEFIモードでPCを起動します。
    (2)以下のコマンドを実行します。
    diskpart
    list disk
    select disk 64GBのUSBメモリの番号
    list partition ※ディスク選択に誤りがないことの確認
    clean
    create partition primary
    format quick fs=ntfs label="System"
    assign letter="S"
    create partition primary
    format quick fs=ntfs label="DISMUMWin81E"
    assign letter="C"
    active
    exit

  3. 再設定したパーティションへのイメージの展開(イメージの適用)
    以下のコマンドを実行してネットワーク上に保存したイメージを展開(適用)します。
    net use n: \\Server\Share ※共有フォルダへのドライブ文字「N」の割り当て
    (ここで共有資源への接続のためのユーザ名とパスワードを求められますのでそれぞれを入力します)
    dism /Apply-Image /ImageFile:N:\Images\my-windows-partition.wim /index:1 /ApplyDir:C:\ ※90分程度掛かりました



  4. BCD(ブート構成データ)の初期化
    イメージを適用したハードディスクからUEFIブートできるように以下のコマンドでBCD(ブート構成データ)の初期化を行なってみました。
    C:\Windows\System32\bcdboot C:\Windows /l ja-JP /f ALL ※C:\EFIフォルダが作成されます(C:\Bootフォルダは作成されません)

  5. Windows PEのシャットダウン
    コマンドプロプトでexitを入力してWindows PEをシャットダウンします。

  6. イメージ展開された64GB USBメモリからのWindows 8.1 Enterprise(64ビット)のブートテスト
    (1)Windows PEのシャットダウン後、電源オフ状態でWindows PEのUSBメモリの取り外し
    (2)PCの電源オン
    (3)PC仕様に応じた操作でブートデバイスの選択画面を表示
    (4)起動デバイス一覧から64GB USBメモリをUEFIモードで起動する項目を選択してEnterキー押下
    (5)「INACCESSIBLE_BOOT_DEVICE」エラーが一瞬表示されて自動再起動されました。



    ちなみにWindows 8.1 EnterpriseインストールDVDからブートしての自動修復はできませんでした。