Windows PEを起動させたら操作なしにwimの適用を行いデスクトップ画面まで表示させる

#はじめに
カスタムしたWindows イメージ ファイル (.wim)をWindows PEを使用して適用した際の知見を投稿します。
ネット上にはいくらでも情報がありますがまとまったものがなかったため、大変参考になったサイトと合わせて紹介します。

# 参考情報

## 教科書 
* [Windows ADK によるイメージの作成手順 - Download Center - Microsoft](http://download.microsoft.com/download/F/8/2/F8297377-16AC-4212-9B6C-4B8F8F57BB92/W10_Migration_WP_ADK.docx)

##Windows PEとは

* [クローニングでWindows10を簡単キッティング！～Windows PEをつくろう](https://a-zs.net/windows10-kitting-2/)
* [Windows 10 で Windows PE のディスクイメージを作成する。](http://rms-099.hatenablog.jp/entry/2015/10/06/000000)
* [WinPE:マウントし、カスタマイズ](https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/winpe-mount-and-customize)(日本語版)(日本語があやしい)
* [WinPE: Mount and Customize](https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-mount-and-customize)(英語版)

##sysprepとは

* [【初心者向け】sysprepの仕組みと使い方/手順〜一般化,コマンドオプション〜](https://milestone-of-se.nesuke.com/sv-basic/windows-basic/sysprep-general/)
* [クローニングでWindows10を簡単キッティング！～一般化ってなに？](https://a-zs.net/windows10-kitting-7/)
* [Windows10のOSイメージ展開の新常識（その2）――Sysprepを成功させるポイント](https://www.atmarkit.co.jp/ait/articles/1810/25/news007.html)

## 応答ファイルについて

* [クローニングでWindows10を簡単キッティング！～応答ファイルをつくろう](https://a-zs.net/windows10-kitting-8/)
* [sysprep の自動応答ファイルの作り方](http://www.vwnet.jp/Windows/WS12R2/2016071301/sysperp_untitled.htm)
* [Windows7 のベースイメージを作成する](https://mctjp.com/2011/08/12/windows7-%e3%81%ae%e3%83%99%e3%83%bc%e3%82%b9%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b/)<br>(Administratorの有効化について)
* [Windows 10（1803）で sysprep 超まとめ](http://harukeee.hatenablog.com/entry/2018/05/31/002525)<br>(監査モードについて)

## diskpartについて

* [Windows10のOSイメージ展開の新常識（その1）――推奨パーティション構成 (1/2)](https://www.atmarkit.co.jp/ait/articles/1810/11/news013.html)

## bcdbootについて

* [Windowsのブート修復に使うコマンド一覧](https://mo.kerosoft.com/0219)
* [Windowsイメージ操作まとめ](https://qiita.com/SkyLaptor/items/05532ed8ac037940b899)

# Windows PEを起動させたら操作なしにwimの適用を行いデスクトップ画面まで表示させる
ここからがネットを探しても見つからなかった部分でした。大した話ではなかったんですけど。

## Windows PEのStartnet.cmdに実施したいコマンドを追記して自動化する

これが全てで、ここに記載したコマンドをWindows PE起動時にやってくれます。

[WinPE:マウントし、カスタマイズ](https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/winpe-mount-and-customize)から引用すると

> スタートアップ スクリプトを追加します。
> カスタム コマンドを含める Startnet.cmd を変更します。 このファイルは、あるマウントされたイメージにあるC:\WinPE_amd64\mount\Windows\System32\Startnet.cmdします。
> このファイルから、その他のバッチ ファイルまたはコマンド ライン スクリプトを呼び出すこともできます。
> プラグ アンド プレイまたはネットワークのサポートへの呼び出しを含めることを確認しますwpeinitカスタム Startnet.cmd スクリプトにします。 詳細については、次を参照してくださいWpeinit および Startnet.cmd:。WinPE のスタートアップ スクリプトを使用してします。



自分が記載した例だと

```text:startnet.cmd
wpeinit
powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
diskpart /s x:\CreatePartitions-UEFI.txt
dism /Apply-Image /ImageFile:e:\install.wim /Index:1 /ApplyDir:c:\
bcdboot C:\Windows /l ja-jp
exit
```

です。一行目から説明します。

### wpeinit
最初から書かれています。

### powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
電源プランを高パフォーマンスにするらしいです。
(参考:[Windowsイメージ操作まとめ](https://qiita.com/SkyLaptor/items/05532ed8ac037940b899))

### diskpart /s x:\CreatePartitions-UEFI.txt
diskpartを指定したテキストファイルの内容に沿って実施してくれます。
xドライブはWindows PEを起動させた際のドライブ文字で常にxです。
Windows PEにファイルを追加する方法は単純で、マウントしたフォルダにファイルを追加してアンマウントするだけです。
マウントしたフォルダ直下に配置すれば、x:\直下に見えます。

[WinPE:マウントし、カスタマイズ](https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/winpe-mount-and-customize)から引用すると
> ファイルとフォルダーを追加します。
> ファイルとフォルダーを c: ドライブにコピー\WinPE_amd64\フォルダーをマウントします。 これらのファイルは、x: に表示されます\WinPE 内のフォルダー。
> WinPE 速度が低下する RAMDisk の既定の環境で使用可能なメモリがいっぱいにこれらと、多くのファイルを追加しないでください。

です。最初はここにwimを置こうと思ったんですけど上述の通りらしいのでやめました。

diskpartに指示する内容は[Windows10のOSイメージ展開の新常識（その1）――推奨パーティション構成 (1/2)](https://www.atmarkit.co.jp/ait/articles/1810/11/news013.html)を参考にさせて頂きました。

```text:CreatePartitions-UEFI.txt
select disk 0
clean
convert gpt
create partition efi size=100
format quick fs=fat32 label="System"
create partition msr size=16
create partition primary size=143139
format quick fs=ntfs 
assign letter=d
create partition primary 
shrink minimum=1024
format quick fs=ntfs label="Windows"
assign letter=c
create partition primary
format quick fs=ntfs label="Recovery tools"
set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
gpt attributes=0x8000000000000001
list volume
exit
```

自分の場合はUEFIだったのでgptのほうをベースにしています。CドライブとDドライブに分けたかったので

```
create partition primary size=143139
format quick fs=ntfs 
assign letter=d
```

を追記しました。
diskpartはcreate partitonなりを実行するとそれが選択状態になるっていうところが分かりにくかったですね。

### dism /Apply-Image /ImageFile:e:\install.wim /Index:1 /ApplyDir:c:\
wimをCドライブに適用しています。
Windows PEはドライブ文字が不定なので([改訂 管理者必携！ 最強のデータ・サルベージ・ツールWindows PE 3.0（前編） (4/4)](https://www.atmarkit.co.jp/ait/articles/1007/28/news101_4.html))必ず成功する、とは断言できないのがつらいところです。

ただリカバリする際に以下の点に気をつけておくとドライブ文字がずれることをかなりの確率で低減させることができるかと。

* 外付けの何かは全て外しておく。<br>余計なものを刺しておくとドライブ文字がずれることになります。ただしwimが入ったusbメモリだけは刺しておきます。
* windows PEはDVDに焼いて起動させる。<br>上記の通り二つのUSBメモリ(Windows PEとwim)を刺すとどっちがどっちになるのかがわかりません。
* diskpartを実施して明示的にドライブ文字を指定する。<br>事前にdiskpartを実施することでwindows PE起動時に不定に付与されるドライブ文字を気にする必要がなくなります。

自分の経験則で言うと内臓HDDやUSBメモリが優先的に配置されてDVDドライブ等が後から設定されるっぽいです。
今回の例で言うと
内臓HDD -> CとDがどちらかに設定される
外付けUSB -> Eが設定される
内臓DVD -> Fが設定される

パーティションが一つであれば外付けUSBはD確定！？

### bcdboot C:\Windows /l ja-jp
このコマンドを忘れてて、起動しないで焦りました。
ここについてはあんまり勉強できていないのですが多分これだけで足りているはず。

### exit
Windows PEを終了します。
やりすぎだとは思いますがエンドユーザーがひとつもコマンドを打ちたくないとのことで記述しています。
これをしてしまうとエラーが起きた際に何もわからないので利便性とのトレードオフかと。

# まとめ
上記Windows PEを使用すれば起動デバイスにDVDを選択するだけでクローニングされたマシンが出来上がります。
大量にクローニングするマシンを用意する際の参考になれば幸いです。

# おまけ
## Windows PEをDVD起動させた際の"Press any key to boot from CD or DVD...."を除去する

### 参考
* [Remove 'Press any key...' from WinPE boot ISO](https://www.marcelvenema.com/blog/remove-press-any-key-from-winpe-boot-iso)
* [Boot-Image Without “Press Any Key To Boot From…” Message](https://www.exitcodezero.ch/2017/12/17/boot-image-without-press-any-key-to-boot-from-message/)

上記に書かれているpowershellを MakeWinPEMedia /ISO したisoに適用してあげれば除去できます。