[Windows] WindowsPEを使ってWindows10をメンテナンス(アプリインストール等)する(その１)

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
Windows PEを使って、Windows10にログインせずに、アプリをインストールしたりアンインストールしたり、その他メンテナンスをしたい。

# 今回やったこと
下記のページを参考にさせていただき、自分のやったこと・試したことをまとめた。
https://qiita.com/SkyLaptor/items/204245cf6bb4fee5b19d

# 概要
## 実験環境
下記のPCを使用。

- Windows10 pro 1903(19H1)
- Windows ADK for Windows 10, version 1903

## 作業の流れ
ざっくり、こういう流れでWindowsPEから起動する準備作業をする。
今回は、WindowsPEで起動するところまでをやる。
**インストールの仕方(dismコマンド等)はまた別途。**

- 必要物のダウンロード・インストール
 - WindowsADK
 - WindowsPEアドオン
- WindowsPEメディアを作成
 - 素のWindowsPEを作成し、マウントする
 - mountフォルダの下に必要なフォルダ/ファイルを置く
 - 起動時に実行されるstartnet.cmdを編集しインストール処理を追加
 - mountフォルダに加えた変更をアンマウントしmediaフォルダに反映させる
 - 起動可能なUSBメモリを作成する
 - USBメモリにmediaフォルダの中身をコピーする
 - USBから起動させる
 - WindowsPE起動～メンテ作業を実施する

## マウント・アンマウント
マウントとかアンマウントとかの言葉が出てくるが、イメージとしてはこんな感じに自分はしている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/399b79df-312b-4563-8659-29a91fc85935.png)
※「mountフォルダ以下がCドライブになる」と図中で書いているが、今回試した限りでは、PE起動時のドライブは「X:」ドライブだった。

# 作業

## 必要物のダウンロード・インストール
ダウンロード、インストールについては、[参考にさせていただいたサイト](https://qiita.com/SkyLaptor/items/204245cf6bb4fee5b19d)をほぼそのまま実施している。(ドライバ入れなかったりするのが自分がやったのと少しだけ違う)
困ったら、そちらを参照させていただくと良いと思うが、ざっくり下記のようにした。


### WindowsADK
下記の「Download the Windows ADK for Windows 10, version 1903」リンクより落とす。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/dca713fa-5e63-1792-0979-b3c38b7bd30f.png)

※ダウンロードしたexeを実行して出てくる画面で「インストールを行う機能を選択してください」画面が出たら、「Deployment Tools」のみチェックを入れる

### WindowsPEアドオン
ADKと同じページの「Download the Windows PE add-on for the ADK」リンクより落とす。  
**※かなり時間かかるので注意。(今回試したときは4時間以上かかった)**

## WindowsPEメディアを作成

### 素のWindowsPEを作成し、マウントする

- まず、スタートメニューの[Windows Kits] > [展開及びイメージングツール環境]を、管理者権限で開く。
- 開いたら、下記のコマンドをすべて実行する。([展開及びイメージングツール環境]の黒窓に、改行も含めて全部コピーして貼り付ければ、実行してくれる)

```新しいPEを作成.cmd
rem 素のWindowsPEを準備する
set WS_DIR=C:\winpe

copype amd64 "%WS_DIR%"

rem マウントする
Dism /Mount-Image /Imagefile:"%WS_DIR%\media\sources\boot.wim" /Index:1 /Mountdir:"%WS_DIR%\mount"

rem --------------

rem 日本語化＋αを組み込む
set ADK_PATH=C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit
set ADK_PACK=%ADK_PATH%\Windows Preinstallation Environment\amd64\WinPE_OCs
rem set WS_DIR=C:\winpe

Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\ja-jp\lp.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\WinPE-FontSupport-JA-JP.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\WinPE-WMI.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\ja-jp\WinPE-WMI_ja-jp.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\WinPE-NetFx.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\ja-jp\WinPE-NetFx_ja-jp.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\WinPE-Scripting.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\ja-jp\WinPE-Scripting_ja-jp.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\WinPE-PowerShell.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\ja-jp\WinPE-PowerShell_ja-jp.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\WinPE-DismCmdlets.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\ja-jp\WinPE-DismCmdlets_ja-jp.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\WinPE-SecureBootCmdlets.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\WinPE-WDS-Tools.cab"
Dism /Image:"%WS_DIR%\mount" /Add-Package /Packagepath:"%ADK_PACK%\ja-jp\WinPE-WDS-Tools_ja-jp.cab"
Dism /Image:"%WS_DIR%\mount" /Enable-Feature /FeatureName:SMB1Protocol

Dism /Image:"%WS_DIR%\mount" /Set-Allintl:ja-jp
Dism /Image:"%WS_DIR%\mount" /Set-Inputlocale:0411:00000411
Dism /Image:"%WS_DIR%\mount" /Set-Layereddriver:6
Dism /Image:"%WS_DIR%\mount" /Set-Timezone:"Tokyo Standard Time"
```

※[参考にさせていただいたサイト](https://qiita.com/SkyLaptor/items/204245cf6bb4fee5b19d#windowsadk%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)では、「ドライバを入れる」という手順があるが、今回はインストールするためだけのPEなので、入れなかった。

- 作業用PCの`C:\winpe`に、`fwfiles`、`media`、`mount`の3つのフォルダができていることを確認する。
- `mount`フォルダの中に、`Program Files`、`Program Files (x86)`、`ProgramData`、`Windows`、`Users`の5つのフォルダができていることを確認する。

> [展開及びイメージングツール環境]の黒窓は、一度開いたら本手順が終わるまで閉じないこと。閉じると、マウントしたイメージをアンマウントできなくなったりする。閉じてしまった場合は、[こちら](https://qiita.com/SkyLaptor/items/204245cf6bb4fee5b19d#%E5%82%99%E8%80%83)を参照。

### mountフォルダの下に必要なフォルダ/ファイルを置く
'mount'フォルダの下に、実際にWindowsPEが起動したときに使いたいものを入れておく。図では、「myFolder」というフォルダを入れている。
アプリをインストールしたい場合などは、ここに.appxやインストールに必要なバッチファイルを入れておけばよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/ff967cda-8d0b-4d7d-4bec-0f3f3688bd14.png)

### 起動時に実行されるstartnet.cmdを編集しインストール処理を追加
WindowsPEが起動したら、`C:\winpe\mount\Windows\System32`にある`startnet.cmd`が自動的に実行される。必要に応じて、そこに処理を追加する。

※素の'startnet.cmd'は下記のようなもの。ここに、処理を追加するが、**もとからあるwpeinitは消さないこと。**(PEの初期化処理をしているらしい)

```素のstartnet.cmd
wpeinit
```

何かアプリを自動でインストールしたいようなときは、ここにインストール処理を追記するか、インストール用のバッチを呼ぶような記述を追記する。

**今回試した時、なぜか「上書き禁止」になっていたので、別でstartnet.cmdを作成して、上書きして編集した。**

### mountフォルダに加えた変更をアンマウントしmediaフォルダに反映させる
mountフォルダの中に必要物を置いたら、下記のコマンドを[展開及びイメージングツール環境]に入れて、mountに加えた内容を反映させる。(=アンマウント)

```アンマウント.cmd
set WS_DIR=C:\winpe
Dism /Unmount-Image /Mountdir:"%WS_DIR%\mount" /Commit
```

※アンマウントした後は、mountフォルダの中身は空になる。

### USBメモリにmediaフォルダの中身をコピーする
アンマウント＆コミットした内容を、USBメモリにコピーする。
下記のようなコマンドを使用して行う。

```
set WS_DIR=C:\winpe
rem FドライブがUSBメモリの時は、
rem makewinpemedia /ufd "%WS_DIR%" F:
makewinpemedia /ufd "%WS_DIR%" {USBメモリのドライブレター}:
```

### (USBメモリにmediaフォルダの中身をコピーする(別解))
USBメモリを作成する際、上の「USBメモリにmediaフォルダの中身をコピーする」が正しい手順だと思うが、今回こっちの手順で作業していた。これでも動作はしていたので、どちらでも行けるっぽい。(ただ、上の本来のmakewinpemediaを使ったやり方を推奨)

- まず、使用するUSBメモリをfat32でフォーマットする。
- 次に、上でアンマウントして出来上がったメディアフォルダ`C:\winpe\media`の中のものをすべてUSBメモリにコピーする。これで、WindowsPE起動用USBの出来上がり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/2ca47332-cd53-6f90-f4c8-b5a9ce6012b2.png)

### USBから起動させる
USBメモリから起動するようBIOS設定(起動の優先順位設定)をする。(やり方はモノによると思うので、割愛)
その後、再起動。

### WindowsPE起動～メンテ作業を実施する
USBから起動すると、WindowsPEが起動する。

上で変更したstartnet.cmdの内容にもよるが、通常は起動後コマンド入力できるように黒窓が起動しているので、ここでメンテナンスしたいことを実施する。

これで、WindowsPEの準備から起動までは完了。
作ったWindowsPEを直したいときは、下のようにする。

## 作成したWindowsPEを修正したいとき
最新の状態がmediaフォルダの中(=USBメモリの中身)に保存されているので、それをマウントして、編集して戻す、ということをする。具体的には下記を実施する。

- マウント実施(mediaフォルダの中身をmountフォルダに展開していじれるようにする)
- mountフォルダ内を編集(startnet.cmdを編集したり、必要なものを配置したりする)
- アンマウント＆コミット を実施してmediaフォルダを作成しなおす
- できたmediaフォルダの中身をUSBメモリにコピーする

マウント、アンマウントする際には、[展開及びイメージングツール環境]に下記のコマンドを入力する。

```マウント.cmd
set WS_DIR=C:\winpe
Dism /Mount-Image /Imagefile:"%WS_DIR%\media\sources\boot.wim" /Index:1 /Mountdir:"%WS_DIR%\mount"
```

```アンマウント.cmd
set WS_DIR=C:\winpe
Dism /Unmount-Image /Mountdir:"%WS_DIR%\mount" /Commit
```

# 備考
ここでやったのは、WindowsPEが起動するまでの準備なので、やりたかったアプリのインストール等はまだできていない。
インストールなどを実現するには、アプリのappxなどをmountフォルダの中に保存し、インストール用のバッチを書いてインストール処理をPEで行う必要がある。

dismで行うインストールも試したところ、特にPEだからといって特殊なコマンドを使うということはなかったので、また別途まとめる。

# 参考
日本語版WindowsPEメディアを作成する方法
https://qiita.com/SkyLaptor/items/204245cf6bb4fee5b19d