Windows 10 / 11 USBドライブを使用したWindowsイメージ展開方法

# はじめに
キッティング自動化関連の記事は数多く出ておりますが
事細か、且つひとまとめに情報が載っている記事があまりない印象でしたので
調べてみたうえで参考にした内容や自力で検証してみた内容も含め
記事にしてみました。

※今回Windows11環境で実施しますが、10も基本的にやっている内容は同じです。
<br>
**<大変参考になった資料(ディレクトリ構成はこちらの内容に倣って作成します)>**

https://www.rough-and-cheap.jp/windows/create-win10-deployment-image-1/

# 対応内容の流れ
簡易的にまとめると以下のような流れとなります。
```
1.diskpartを使用したUSBメモリのセッティング
↓
2.WinPEイメージング作成(WinPEを起動可能状態にする)
↓
3.Windowsイメージを参照可能状態にする。更新プログラムを追加する
↓
4.応答ファイルの作成
↓
5.マスターイメージの作成
↓
6.(他のPCへ)イメージを展開する
```

# 用意するもの・事前に対応すること
**1.PC(作業用、マスターイメージ作成用[参照用])**
今回は作業用、参照用ともに以下のスペック内容のPCを使用しました。

<スペック>
・OS：Windows11 Pro x64
・CPU：Core i5-1235U 12th Gen
・メモリ：DDR4 16GB
・ストレージ：256GB(SSD)
<br>

**2.USBメモリ(容量：最低32GB～)**
今回は1つのUSBメモリを2つのパーティション分けて使用します。
<br>
**3.事前対応**
あらかじめ下記の通りにディレクトリを作成しておいてください。

```batch
REM 今回はCドライブのボリュームを縮小して、Dドライブを作業用ディレクトリとして用意してます。
D:​
└─deployment_work​
    └─22H2​
        ├─AnswerFiles：応答ファイル保管先(Audit, OOBE)​
        ├─images：WinPE/Win10Pro/イメージのエクスポート先​
        └─mount​
            ├─windows：更新プログラム追加先​
            └─winpe：WinPEのイメージングファイル作成先
```
ここまで準備ができたらイメージング作業に取り組みます。
# 手順
もろもろの手順を記載していきます。
## 1.　各ツール・ファイル類のインストール

・**Windows ADK**
・**Windows PEアドオン**
→[こちら](https://learn.microsoft.com/ja-jp/windows-hardware/get-started/adk-install)からインストールできるため、OSバージョンに合致するものをDLする。

#### WindowsADK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/1b9dc5b7-0312-aa32-7ba3-8ecbe391088e.png)
<br>
インストールを行う機能の選択画面では
こだわりがなければデフォルトのままインストールに進んでください。
→ **Deployment Toolsは必要です。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/454aa0ec-b6ab-b10a-f148-4d68bf600af1.png)

#### Windows PEアドオン

→ インストール対象は1つのみなので、このままインストールへ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/cd8a6447-aebb-9386-e910-98de27a37bdc.png)

<br>

#### イメージ展開用のサンプルスクリプト

→ [こちら](https://learn.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/oem-deployment-of-windows-desktop-editions-sample-scripts?view=windows-11) からインストールできる。
「サンプル スクリプトの ZIP 形式」とリンクが張られている。
(おそらくWin10と11共通かと思います。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/a40c845b-14f6-5765-2d13-a663dc7a9406.png)

<br>

#### Windows10/11のisoファイル

→やり方はWeb検索すればゴロゴロ転がってるので割愛。

## 2.　USBメモリのセッティング
#### セッティング前の確認
diskpartを起動し、[list disk]を実行しディスク内容を確認。

![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/38982194-9937-4818-4ce4-b27b419a8cc1.png)

32GBのメモリを使用することから、今回だと「ディスク1」がUSBメモリであるとわかる。

判別が難しい場合は、GUI上(ディスクの管理)でディスクNo.を確認することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/1365fb1b-fcdc-5409-6186-c395f007d7c5.png)

:::note warn
注意
USBメモリのテーブル形式(GPT欄)は「MBR」にしてください。
もしUSBメモリのディスクの**GPT欄**にアスタリスクがついていた場合
```
convert mbr
```
を実行し、MBRフォーマットに変換してください。
→古いPCなどマザーボードのブート規格や、
パーティションを4つ以上作成したりすることもないのでMBRにしています。
[参考サイト：MBR と GPTの違い、相互変換及び初期化方法‐どっちがよい](https://jp.minitool.com/partition-disk/mbr-vs-gpt-guide.html)
:::

#### WindowsPE Partitionの作成
diskpartを起動し、以下のコマンドを実行します。
```bat
REM USBメモリを選択する。
select disk 1
REM 2GBの領域を確保します。
create partition primary size=2000
REM ファイルシステムとラベルを設定。WinPEはFAT32形式
format quick fs=fat32 label="WinPE"
REM ドライブレターを指定する。(なんでもいいですが今回はP)
assign letter=P
REM パーティションを起動可能な状態にする
active

```

#### USB-B Partitionの作成
以下のコマンドを実行します。
```bat
REM 残りの領域すべてを確保する
create partition primary
REM イメージング用はNTFS形式にする
format quick fs=ntfs label="USB-B"
REM ドライブレターを指定する。(こちらはOにします)
assign letter=O
REM パーティショニングが終わったらexitする
exit
```
<br>

正常に処理が終了すると、以下のような構成になっているはずです。
diskpartで「list vol」を実行して確かめます。
赤枠の通り、サイズ・ラベル・レター・Fs・Infoが問題ないことを確認してください。
![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/15b99eea-ee39-c826-4961-3f0f09d769a5.png)

#### USB-Bにサンプルファイルをコピーする
各ツール・ファイル類のインストール > ③イメージ展開用のサンプルスクリプトにて
DLしたzipファイルを解凍し、USB-B(O:)にすべてコピーします。

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/a464eb29-f206-a44b-0d22-d288a5940a95.png)

USBの準備としてはこれで以上となります。

## 3.　WinPEの起動準備
#### WinPEのイメージングファイルを作成する


**「展開およびイメージングツール環境」** というアプリケーションがインストールされているため
「管理者権限」で実行します。(Windows ADKインストール時に導入済)
→以降、アプリケーションはすべて **「管理者権限」** で実行する必要があります。

:::note warn
注意
管理者権限で開かないと、権限不足によるエラーが発生しますのでご注意ください。
:::
<br>

以下のコマンドを実行します。
→ ディレクトリ名：winpe_amd64は自動生成されます。
(ディレクトリが生成前に存在しているとエラーが出ます。)
```batch 
copype amd64 D:\deployment_work\22H2\winpe_amd64
```

<br>

Successと表示されると、無事処理が完了しております。

![sample3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/3abb5eeb-9308-26f1-0c7c-09339cb1b33c.png)

#### WinPEをマウントして、使用できる状態にする

以下のコマンドを実行します。
```batch
Dism /mount-image /imagefile:D:\deployment_work\22H2\winpe_amd64\media\sources\boot.wim /index:1 /mountdir:D:\deployment_work\22H2\mount\winpe
```
「操作は正常に完了しました」と出たらマウント成功​です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/d22557ea-515c-49fb-6ab3-df93ec555556.png)


#### WinPEに各種コンポーネントを追加
キーボードの規格がUS一択だったり、言語packをUS縛りにしている場合を除き
各種コンポーネントを追加する必要があります。

以下のコマンドを実行します。
(今回はすべて日本語に変換します)
```batch
REM 日本語ランゲージパックの追加
Dism /image:D:\deployment_work\22H2\mount\winpe /add-package /packagepath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\ja-jp\lp.cab"

REM フォントパックも追加
Dism /image:D:\deployment_work\22H2\mount\winpe /add-package /packagepath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-FontSupport-JA-JP.cab"

REM インプットロケール・キーボードレイアウト変更
Dism /image:D:\deployment_work\22H2\mount\winpe /Set-Inputlocale:"0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}"

REM UI言語のデフォルトを変更
Dism /image:D:\deployment_work\22H2\mount\winpe /Set-UILang:"ja-jp"

REM タイムゾーンを東京にします
Dism /image:D:\deployment_work\22H2\mount\winpe /Set-Timezone:"Tokyo Standard Time"

REM キーボードドライバを106/109に変更。
Dism /image:D:\deployment_work\22H2\mount\winpe /Set-Layereddriver:6
```

#### WinPE起動時に実行されるコマンド内容を変更
USBブートでWinPEを起動させると
内部でstartnet.cmdというファイルを実行させる処理が走ります。
この部分を変更させます。

「展開およびイメージングツール環境」から以下のコマンドを実行します。
```batch
notepad D:\deployment_work\22H2\mount\winpe\Windows\System32\startnet.cmd
```
startnet.cmdが開きますので、もろもろ処理をここで書き込みます。
他の記事を見ると電源設定を高パフォーマンスに変更し、処理を高速化させていますので
「wpeinit」の前に下記のコードを追加して上書き保存します。
```batch 
powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
```
<br>

こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/3ab81e1e-ec2d-f955-f7d7-b1145c8133e5.png)

#### WinPEイメージ最適化～マウント解除
イメージ内の不要なコンポーネントやファイル類を削除し
イメージファイルのサイズを縮小して処理を円滑にさせるおまじないをしていきます。
(**イメージの最適化** といいます。)

以下のコマンドを実行していきます。
```batch 
dism /image:D:\deployment_work\22H2\mount\winpe /cleanup-image /startcomponentcleanup
```

「操作は正常に完了しました」とコンソール上に出力されたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/ba9904e4-87e0-546b-31a8-79ef55fa4edd.png)


WinPE内の設定はこれで以上となるので
書き換えられないようにマウントを解除していきます。
以下のコマンドを実行していきます。

```batch
dism /unmount-image /mountdir:D:\deployment_work\22H2\mount\winpe /commit
```
:::note warn
注意
マウント解除(アンマウント)をする際、アンマウント対象のディレクトリが
・エクスプローラーで開かれている
・メモ帳など他アプリで開かれている
・cmd, “展開およびイメージングツール環境”にて、カレントディレクトリが
 アンマウント対象になっている
etc...

上記の状態でマウント解除するとエラーが出ます。

もしエラーが出たら **/commit**を **/discard**に変えて再度実行してください。
:::

「操作は正常に完了しました」とコンソール上に出力されたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/8ed9bb37-ba6e-ec6b-bb6c-32beaf0fc52d.png)


#### WinPEドライブの作成
USBメモリ内で作成したWinPE起動用パーティションに
WinPEイメージをインストールしていきます。

diskpartを起動し「list vol」でWinPEのドライブレターを確認していきましょう。
(レターは「P」になっています。)

確認後はexitでdiskpartを抜けます。

![sample5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/978571be-509f-6ee2-b515-f73d94c7ee10.png)

「展開およびイメージングツール」を**管理者権限**で開き、
以下のコマンドを実行していきます。
```batch 
makewinpemedia /UFD D:\deployment_work\22H2\winpe_amd64 <WinPEドライブレター>
```
「WARNING, ALL DATA ON DISK DRIVE P: WILL BE LOST!」と出ますが
[Y]で操作を続行させます。
「Success」とコンソールに表示されたら完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/1d952a3c-8644-4745-91ea-8d4969cee1fa.png)

作成後、USBメモリを参照用PCに挿して、USBブートを行い
WinPEの実行画面が表示されるかを確認します。
→startnet.cmdにて編集したコマンドが実行されていれば、OKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/ce8073fc-7650-789f-8713-7f1e0ff63628.png)

無事、WinPEが起動できましたらイメージをエクスポートして
デフォルトのイメージを書き換えます。

以下のコマンドを実行し、イメージをエクスポートします。
```batch 
dism /export-image /sourceimagefile:D:\deployment_work\22H2\winpe_amd64\media\sources\boot.wim /sourceindex:1 /DestinationImageFile:D:\deployment_work\22H2\images\boot2.wim
```

オリジナルのWinPEイメージを削除し、エクスポートしたイメージを置き換えます。
```batch 
Del D:\deployment_work\22H2\winpe_amd64\media\sources\boot.wim
```
```batch 
copy D:\deployment_work\22H2\images\boot2.wim D:\deployment_work\22H2\winpe_amd64\media\sources\boot.wim
```

## 4. Windowsイメージのカスタマイズ
WinPEと同様にWindowsイメージをisoファイルを使用してカスタマイズしていきます。

#### Windowsイメージのマウント
あらかじめDLしたWindowsファイル(isoファイル)を作業用PC上でマウントします。
「Win11_22H2_Japanese_x64v2.iso」というファイルを今回DLしていますので
ファイルを右クリック→「マウント」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/0edbb60c-9b2c-fc7e-9296-edf08ded0bdf.png)

マウントが実行されると自動的にレターが割り振られます。
(DVDドライブとして認識。本環境ではレターは「K」で割り振られています。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/c8cfee72-76aa-7360-65f8-71bf24e556cb.png)

マウント後、「展開とイメージングツール環境」を**管理者権限**として開き
下記のコマンドを実行し、「install.wim」という名称としてコピーしていきます。
```batch 
copy K:\sources\install.wim D:\deployment_work\22H2\images\install.wim
```

コピーしたinstall.wimには複数のエディションが含まれています。


→手動でwindowsをインストールしていればご存じかと思いますが、
手動キッティングでwindowsをインストールする際、
複数のエディションの選択画面が表示されるかと思います。

参考↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/3f2a1063-805a-3c41-e1dc-749b32060d94.png)

これらはDismコマンドでも確認することができ、下記のコマンドを実行することで
エディションとインデックスを確認することができます。

```batch 
dism /get-imageinfo /imagefile:D:\deployment_work\22H2\images\install.wim
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/7d2a6123-6545-e71d-f0ff-a42c8868a4e3.png)

→Windows Proの場合、インデックス番号は3になっているかと思います。


確認したインデックス番号を使用して、Windowsのイメージを取り出していきます。
下記のコマンドを実行していきます。(今回はPro Editionを適用します。)
```batch
dism /Export-Image /SourceimageFile:D:\deployment_work\22H2\images\install.wim /SourceIndex:3 /DestinationImageFile:D:\deployment_work\22H2\images\basicimage.wim
```

取り出したイメージ(basicimage.wim)を作業用ディレクトリにマウントしていきます。

:::note warn
注意
※マウント先のディレクトリは必ず空であることを確認すること
:::
```batch
Dism /Mount-Wim /WimFile:D:\deployment_work\22H2\images\basicimage.wim /index:1 /MountDir:D:\deployment_work\22H2\mount\windows
```

#### Windowsイメージに更新プログラムを追加
デフォルトではイメージ展開後にWindowsUpdateを実行すると
大幅な時間を要することもあるので
容量に余裕があればあらかじめ更新プログラムをイメージに追加していきます。

:::note warn
注意
更新プログラムの内容によっては不具合が生じることもあります。
事前に調査し、不具合の恐れがないかを確認してください。
:::
<br>


Windows Updateの更新履歴を確認し、最新バージョンを確認していきます。
OSビルド番号ではなく、パッチの番号(KBxxxxxxx)を確認してください。
・[Windows10の更新履歴はこちら](https://support.microsoft.com/ja-jp/topic/windows-10-%E3%81%AE%E6%9B%B4%E6%96%B0%E5%B1%A5%E6%AD%B4-8127c2c6-6edf-4fdf-8b9f-0f7be1ef3562)
・[Windows11の更新履歴はこちら](https://support.microsoft.com/ja-jp/topic/windows-11-%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3-23h2-%E3%81%AE%E6%9B%B4%E6%96%B0%E5%B1%A5%E6%AD%B4-59875222-b990-4bd9-932f-91a5954de434)

<br>

番号を確認したら、下記のサイトから更新プログラムをDLしていきます。
保存先は特に指定ないので、Cドライブでもよいです。
https://www.catalog.update.microsoft.com/home.aspx

<br>

今回は一例としてWindows11の「KB5031455」をDLしていきます。
上記のリンクをクリックすると下記のような画面が表示されるので、
赤枠内のテキストボックスに番号を入力し、「検索」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/aab2fe6c-a5cd-0e80-88bd-327959d23d3f.png)

OSのベースシステムバージョンごとにDL先が異なるため、
展開先の環境と同一のものをDLしていきます。
右側にある「ダウンロード」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/51bf2997-77d4-8fd8-aa56-a6ea35e28504.png)

すると別ウィンドウでダウンロードを行う画面が出てくるので、
「.msu」と記載されているリンクを押下します。
ダウンロード先については指定ありませんので、適当なところに設置してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/9c1b69f5-b694-a224-7c80-a3d7748f3fb3.png)


DLが完了したら、Windowsイメージにパッケージを追加していきます。
以下のコマンドを実行します。
```batch
dism /add-package /image:D:\deployment_work\22H2\mount\windows /packagepath: <.msuファイルのファイルパス>
```


#### Windowsイメージ最適化
WinPE同様、イメージファイルを縮小していきます。

アップデートファイルを展開するために使う一時ファイル(Tempファイル)を作成します。
すでにTempファイルが存在している可能性もあるため、その際はTempファイルを空にしてください。
```batch
REM Tempファイルがなければ実行してください。
md C:\Temp
```

「展開とイメージングツール」を**管理者権限**で開き、以下のコマンドを実行していきます。
```batch
dism /cleanup-image /image=D:\deployment_work\22H2\mount\windows /startcomponentcleanup /scratchdir:C:\Temp
```
:::note info
完了後、
以下のコマンドを実行することで更新プログラムがイメージに含まれているか確認できます。
```batch
dism /image:D:\deployment_work\22H2\mount\windows /Get-Packages
```
以下のように表示されていれば問題ないかと思います。(下記は一例)
```
...
パッケージ ID : Package_for_ServicingStack_2495~31bf3856ad364e35~amd64~~22621.2495.1.0
状態 : インストール済み
リリースの種類 : Update
インストール時刻 : 2023/11/06 3:34
...
```
:::


:::note info
この時点で作業中断する際は、アンマウントしていただければと思います。(任意)
```batch
dism /unmount-image /mountdir:D:\deployment_work\22H2\mount\windows /commit
```
:::

## 5.応答ファイルの作成

#### 応答ファイルってなに？？？
Microsoft公式には以下のように記載されております。
> 応答ファイルとは、Windows セットアップ中に使用する設定の定義と値を格納する XML ベースのファイルのことです。 応答ファイルでは、さまざまなセットアップ オプションを指定します。 
> [応答ファイルの概要 - Microsoft](https://learn.microsoft.com/ja-jp/windows-hardware/customize/desktop/wsim/answer-files-overview)

簡単に言うと

・Windowsセットアップ時に聞かれたアカウント作成や諸々の同意ページを
　応答ファイル上で定義する
・定義の内容によるけど、クリックやキー入力を省くことができる

などが応答ファイル作成・展開時にできるということです。

#### 構成ファイル作成

使用するツールは
**「Windows システムイメージマネージャー(Windows SIM)」** となります。

これを**管理者権限**で起動します。
<br>

ファイル → [Windowsイメージの選択」から、
作業用ディレクトリの「images」内にある「install.wim」を開き、
エディションを選択していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/f1b2d166-091d-3619-9bb8-a9e77e2c30f8.png)

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/59172ec0-e59c-01cd-d2c0-b38ad42c9b07.png)

install.wimを開くとイメージファイル内のイメージの選択画面が表示されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/dfef1137-1eea-6d36-2f70-c93e35db8e34.png)

「カタログファイルが見つからないので新規で作成する？」
的なダイアログが出現します。
<br>

カタログファイル(.clg)はWindows SIM内で使用される構成ファイルであり
この後設定するコンポーネントの値変更などの情報が
バイナリファイルとして保持されるファイルです。

[Windows イメージ ファイルとカタログ ファイルの概要 - Microsoft](https://learn.microsoft.com/ja-jp/windows-hardware/customize/desktop/wsim/windows-image-files-and-catalog-files-overview#catalog-files)

作成しないと前に進めないので、おとなしく「はい」を選択しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/75328e8a-f9cd-2cbc-b9a7-e00122c6bf3c.png)

「はい」を選択するとカタログファイルが新規作成され、
Windowsイメージのマウントを自動で行ってくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/675eba00-0eea-48eb-7e8d-eec4480345ad.png)

次に応答ファイルを新規作成します。
ファイル → 「新しい応答ファイル」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/93f4e675-13ca-c624-d18a-41a0fb3b40f9.png)

応答ファイル内は以下のような構成となっております。
```
Untitled：応答ファイルの名称(デフォではUntitled)
    ├ Components：ここで諸々構成して、Windows無人セットアップを実行します。
    │   └ 1 windows PE
    │   └ 2 offlineServicing
    │   └ 3 generalize
    │   └ 4 specialize
    │   └ 5 auditSystem
    │   └ 6 auditUser
    │   └ 7 oobeSystem
    └ Packages
```

それぞれの応答ファイルに構成パスを追加していきます。
下記キャプチャの赤枠内にある「Components」を展開すると、各ファイルが出現します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/bccf16b8-f7b8-ab08-b99b-07caf94e2504.png)

追加するコンポーネント一覧と追加先の構成パスは以下の通りです。
各コンポーネントを右クリック→追加先を選択すると、応答ファイルに追加されます。

```
“amd64_Microsoft-Windows-International-Core-WinPE​_neutral”​
→”Windows PE”に追加​

“amd64_Microsoft-Windows-PnpSysprep​_neutral”​
→ ”Generalize”に追加​

“amd64_Microsoft-Windows-Shell-Setup​_neutral”​
→ “Specialize”, “oobeSystem”に追加​

“amd64_Microsoft-Windows-International-Core​_neutral”​
→ “oobeSystem”に追加​

“amd64_Microsoft-Windows-Deployment​_neutral”​
→ “oobeSystem”に追加
```
追加後の応答ファイルは以下の通りになっているかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/35be252d-929a-9363-9200-e2cd18a7c89f.png)

また
・2 offlineServicing
・5 auditSystem
・6 auditUser
これらは設定いたしません。

## 6.各構成パス・コンポーネントの設定
設定内容を各コンポーネントに記載します。
(本設定はあくまで一例であるため、適宜設定内容を変えていただければと思います。)

#### windowsPE - amd64_Microsoft-Windows-International-Core-WinPE​_neutral
・InputLocale：MS-IMEを使用します
```
0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}
```
・LeyeredDriver：106／109キーボードを使用します
```
6
```
・SystemLocale, UILanguage, UserLocale, ​SetupUILanguage - UILanguage​
```
ja-JP
```
・UILanguageFallback
```
en-US
```
#### generalize - amd64_Microsoft-Windows-PnpSysprep​_neutral
・DoNotCleanUpNonPresentDevices
```
true
```
・PersistAllDeviceInstalls
```
true
```
#### Specialize - amd64_Microsoft-Windows-Shell-Setup​_neutral
・CopyProfile
```
true
```
・ComputerName：アスタリスクにするとコンピュータ名を自動生成してくれます。
```
*
```
・TimeZone
```
Tokyo Standard Time
```
・ProductKey
```
<Windowsのボリュームライセンスのプロダクトキーを入力してください>
```
#### oobeSystem - amd64_Microsoft-Windows-International-Core​_neutral
・InputLocale：MS-IMEを使用します。
```
0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}
```
・SystemLocale, UILanguage, UserLocale​
```
ja-JP
```
・UILanguageFallback
```
en-US
```
#### oobeSystem - amd64_Microsoft-Windows-Shell-Setup​_neutral
・TimeZone
```
Tokyo Standard Time
```
 :::note info
 **(オプション)**　
 イメージ展開後にコマンドやスクリプトを実行する際は
 「FirstLogonCommands」を設定します。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/579fbcf2-70bd-b713-6c83-4a18628a9d92.png)

 
1.「FirstLogonCommands」を右クリックし、「新しい SynchronousCommand の挿入」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/40c4a365-7f5b-97a2-4cae-c0503a2b7f10.png)

↓
2.SynchronousCommand - CommandLine：流すコマンドやバッチファイルなどを入力
↓
3.SynchronousCommand - Order：実行する順番を入力します。初期値は「1」です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/2d6bc27c-387c-8b66-939d-d541adfa18e0.png)

:::

#### oobeSystem - amd64_Microsoft-Windows-Shell-Setup​_neutral - OOBE

・HideEULAPage：Microsoft ソフトウェアライセンス条項ページを非表示
```
true
```
・ProtectYourPC：PCの保護は無効にするため、3を入力
```
3
```
・HideOnlineAccountScreen
```
true
```
・HideLocalAccountScreen
```
true
```
・HideWirelessSetupInOOBE
```
true
```
:::note info
・NetworkLocation
・SkipMachineOOBE
・SkipUserOOBE

上記3点についてはWindows10以降では使用されなくなりました。
残っていても削除されていても無視されます。
:::


・UserAccounts - LocalAccounts
「LocalAccounts」を右クリック→「新しいLocalAccountの挿入」を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/62fe0df5-42de-9f60-20d6-a593601868b3.png)

・LocalAccounts - LocalAccount - Group：管理者権限を付与するなら
```
Administrators
```
・LocalAccounts - LocalAccount - Name
```
ローカルアカウント名を入力
```
・LocalAccounts - LocalAccount - Password
```
パスワードを入力(プロパティ欄の「PlainText」がtrueになっているため、平文でOK)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/bd96e356-02d4-3380-9b5f-9e9a2e1a3d9c.png)

#### oobeSystem - amd64_Microsoft-Windows-Deployment​_neutral
・Reseal
```
Audit
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/6a3d0215-c41c-d4bf-71df-2c50524b4a32.png)

<br>

-------------------------------------------設定内容ここまで------------------------------------

<br>

一通り構成が完了したら、ツール → 「応答ファイルの検証」をクリックし、
エラーをチェックする。

```
設定は変更されていません。応答ファイルに保存されません。
Windowsイメージの設定~は使用されません
```
といった文面が出た場合、
該当の箇所(設定していない箇所)はクリック→Delで削除を繰り返し
再度「応答ファイルの検証」を実施する。

エラーがなければ(解消したら)、ファイル名を **「Unattend-Audit」** として​
 **「D:\deployment_work\22H2\AnswerFiles」** に保存する​。

 その後
 oobeSystem - amd64_Microsoft-Windows-Deployment​_neutralの「Reseal」欄を
 ```
OOBE
```
に変更し、新規ファイルの保存を実施しファイル名を **「Unattend-OOBE」** として
 **「D:\deployment_work\22H2\AnswerFiles」** に「名前を付けて保存」する​。

 :::note info
D:\deployment_work\22H2\AnswerFiles内には
```
・Unattend-Audit
・Unattend-OOBE
```
の2種のファイルが存在しているかと思います。
:::

ここまで設定が完了すればWindows SIMの役割は終了です。
展開およびイメージングツールを**管理者権限**で開きます。

 :::note info
応答ファイル作成前にアンマウントしていれば、以下のコマンドを実行します。
```batch
Dism /Mount-Wim /WimFile:D:\deployment_work\22H2\images\basicimage.wim /Index:1 /MountDir:D:\deployment_work\22H2\mount\windows
```
:::

Pantherディレクトリを作成します。
```batch
md D:\deployment_work\22H2\mount\windows\Windows\Panther
```

作成したPantherディレクトリにUnattend-Audit.xmlをコピーします。
これにより、参照用PCをUSBブートで起動した際に「監査モード」で起動することができ
特殊なコマンドなしでマスターイメージを作成することができます。
```batch
REM 名称はUnattend.xml
copy D:\deployment_work\22H2\AnswerFiles\Unattend-Audit.xml D:\deployment_work\22H2\mount\windows\Windows\Panther\Unattend.xml
```

次に以下のコマンドを実行し、ディレクトリを作成します。
そのあとUnattend-OOBE.xmlを作成したディレクトリ上にコピーします。
```batch
md D:\deployment_work\22H2\mount\windows\Windows\Recovery\OEM

copy D:\deployment_work\22H2\AnswerFiles\Unattend-OOBE.xml D:\deployment_work\22H2\mount\windows\Windows\Recovery\OEM
```

 :::note info
\mount\windows\Users配下にはpublicディレクトリがあるので
各ローカルユーザーが使用できるようファイルを設置したい場合は適宜セットアップしてください。
:::

## 7.Windowsイメージのエクスポート
諸々設定を詰め込んだWindowsイメージは容量が膨大になっているので、
これまでと同様にアンマウント前に最適化をしていきます。

以下のコマンドを実行します。
```bat
dism /Image:D:\deployment_work\22H2\mount\windows /Cleanup-Image /StartComponentCleanup
```



イメージをアンマウントします。
**※イメージファイルがあるディレクトリが開かれていないか確認してください**
```batch
REM やらかしたら「/commit」を「/discard」に変更して再度実施してください
dism /unmount-image /mountdir:D:\deployment_work\22H2\mount\windows /commit
```

イメージをエクスポートしていきます。
まず既存のinstall.wimを削除します。
```bat
del D:\deployment_work\22H2\images\install.wim
```
カスタムしたイメージである「basicimage.wim」から
「install.wim」という名称でエクスポートします。

```batch
dism /export-image /sourceimagefile:D:\deployment_work\22H2\images\basicimage.wim /sourceindex:1 /destinationimagefile:D:\deployment_work\22H2\images\install.wim
```

 :::note info
作業ディレクトリのimages内には最低限これらのファイルがあればOKです。
```
・basicimage.wim：カスタマイズしたイメージ
・boot2.wim：WindowsPEのカスタムイメージ
・install.wim：basicimage.wimからエクスポートしたイメージ
```
:::

## 8.マスターイメージの構築
セッティングしたUSBメモリを作業用PCに挿し
「USB-B\Deployment\CreatePartitions-UEFI-FFU.txt」を編集します。

以下の内容に書き換えてください。(note欄を省き、ソースを見やすく修正しました。)
→イメージ展開にてApplyImage.bat実行時に呼び出されるスクリプトがこれになります。
```batch
select disk 0
clean
convert gpt
rem == 1. System partition =========================
create partition efi size=100
format quick fs=fat32 label="System"
assign letter="S"
rem == 2. Microsoft Reserved (MSR) partition =======
create partition msr size=16
rem == 3. Windows partition ========================
rem ==    a. Create the Windows partition ==========
create partition primary 
rem ==    b. Create space for the recovery tools ===
shrink minimum=500
rem ==    c. Prepare the Windows partition ========= 
format quick fs=ntfs label="Windows"
assign letter="W"
rem === 4. Recovery partition ======================
create partition primary
format quick fs=ntfs label="Recovery"
assign letter="R"
set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
gpt attributes=0x8000000000000001
list volume
exit

```

CreatePartitions-UEFI-FFU.txtの中身を修正をしたら
**作業ディレクトリで作成した展開イメージ(Images\install.wim)** を
**USB-B(USB-B\Images)** にコピーします。
→ちょっと時間がかかります。

コピーが完了したら、USBを取り外します。

<br>

### 参照マシンをUSBブートで起動
参照マシンを立ち上げ、BIOSメニュー / ブート順序メニューからUSBブートします。

WinPEを起動したら、「diskpart」を起動し「list vol」で一覧表示します。
→USB-Bのドライブレターを確認してください。
確認ができたら、「exit」でdiskpartを抜けます。

以下のコマンドをWinPE環境で実行します。

```batch
REM ※USB-BのレターがF:と仮定します
cd /d F:\Deployment
ApplyImage.bat F:\Images\install.wim
```

ApplyImage.bat経由で処理が進みます。
途中コマンド入力を聞かれますので、適切な値を入力してください。

処理が正常終了しても、自動で再起動は行われません。
以下のようにコマンドプロンプト上に表示されたら、
「exit」を入力しUSBメモリを外してください。

```bat
REM　* Configure the recovery partition with ApplyRecovery.bat​
REM　* Reboot:​
REM　　　exit
```
再起動後、監査モードで参照マシンが立ち上がり
Administratorユーザーにて自動的にログインされます。

ログイン後、以下のキャプチャのようにSysprepの実行確認のウィンドウが表示されますが
「キャンセル」して次の処理に入ってください。
(再起動をすると毎回聞かれますが、すべて「キャンセル」で統一します。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/618eece1-363e-8ba7-a6a1-edac59a97489.png)


#### USBブート後～マスターイメージ作成前のおまじない
監査モードで起動する際、ネットワークに繋いだままだと
セットアップの段階でWindows UpdateやWindows ストアアプリの更新が自動で入り
最後にsysprepする際にエラーが発生することがあります。
(他記事等にも記されています。)

この場合、ログを確認したうえで
対象のアプリをアンインストールするなど余計な手間が発生するので
**オフライン上で下記の対応を先に実施します。**

<br>

##### タスクスケジューラ - ストアアプリの英語化の回避
→パス：Microsoft\Windows\AppxDeploymentClient\Pre-staged app cleanup​
該当のタスクを右クリック→「無効」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588129/7d6a1764-e345-8e6f-acd8-bea613a3b65f.png)

##### グループポリシーの変更

以下のパスの値をすべて「有効」にする。
```
Path:コンピューターの管理\管理用テンプレート\Windowsコンポーネント\

・クラウドコンテンツ\Microsoftコンシューマー エクスペリエンスを無効にする​
・ストア\更新プログラムの自動ダウンロードおよび手動インストールをオフにする​
・ストア\最新バージョンのWindowsへの更新プログラム提供をオフにする​
```

これらの設定を反映させるため、コマンドプロンプト上で「gpupdate /force」を実行し
ネットワークに繋いで設定を継続してください。

#### 通常通りの手動キッティングを実施
各々の規格に合わせて、設定を実施してください。
ただし、ユーザープロファイルの一部設定項目は反映されませんので
セッティングするうえで留意いただく必要がございます。
<br>
→例）
　・既定のアプリ
　・(Win11環境であれば)スタートメニュー・タスクバーのピン留め
　・セキュリティとメンテナンスの設定を変更(通知メッセージのオン/オフ設定)
　・ブラウザの一部設定項目(起動時に開くタブページ設定とか)
<br>
 他にもうまく反映されない箇所があるかもしれません。

 なお、初回の起動でグレーアウトになっている設定項目については
 WindowsUpdateを実施することで設定できることもあります。
 
→Windows Update実施時、再起動を求められるケースがあるかと思います。
再起動後はマスターイメージ作成時同様、Sysprepの実行確認のウィンドウが
表示されますが「キャンセル」して次の処理に入ってください。


 ## 9.作成したイメージをキャプチャ
諸々必要な作業を完了したら、
Sysprepコマンドを実行して参照マシンをシャットダウンさせます。

以下のコマンドを実行します。
```bat
C:\Windows\System32\Sysprep\sysprep /oobe /generalize /unattend:c:\windows\Recovery\OEM\Unattend-OOBE.xml /shutdown
```

参照マシンがシャットダウンしたら、USBメモリを刺してUSBブートします。

参照マシンに保存してあるWindowsイメージをキャプチャします。
以下のコマンドを実行します。
```bat
REM /imagefile, /Name, /descriptionはお好きな名前にしてもらってよいです。

DISM.exe /capture-ffu /imagefile="E:\Images\CustomImage.ffu" /Name:"Custom Image" /capturedrive=\\.\PhysicalDrive0 /description:"Windows 10 22H2 Custom"
```

処理が完了したら、Windowsカスタムイメージの作成が完了します。

## 10.イメージングの展開
展開先のPCに作成したUSBメモリを刺して、USBブートさせます。

diskpartを起動し、「USB-B」のレターを確認します。

以下のコマンドを実行し、
カレントディレクトリを変更させてイメージング展開を実行させます。

```bat
REM カレントディレクトリ変更
cd /d "<USB-Bのレター>\deployment"

REM ApplyImage.batを実行
ApplyImage.bat "<USB-Bのレター>\Images\<ffuファイル名.ffu>"
```

その後はリカバリ用パーティションを作成するかなど聞かれるため、
お好きなほうを選択。

:::note
リカバリ用パーティションの作成処理内容についてですが
USB-B(O:)\Deployment\CreateRecoveryPartitions-UEFI.txt
に記載されております。
:::

以上。

## おまけ
WinPE上で動かす.cmdの内容を改変し
イメージ展開、作成、吸い上げ処理をユーザー側に選択して
勝手に処理を流すバッチファイルを作りました。

もしよかったらどうぞ

```bat
@echo off
chcp 65001

powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
wpeinit

cd %~dp0

REM diskpart_script.txt保存先：「D:\deployment_work\22H2\mount\winpe\Windows\System32」
REM diskpart_scriptの中身は[lis vol]しているだけです。

diskpart /s diskpart_script.txt
set /p VolName="USB-Bのボリューム名を入力して下さい(例:E)： "

cd /d %VolName%:\deployment

:INPUT
echo 実行内容に合致するパラメータを入力してください
set /p ExecuteParam="a:イメージ展開 / b:イメージ作成 / c:イメージ吸い上げ："

IF /i "%ExecuteParam%"=="a" (
    ApplyImage.bat %VolName%:\Images\CustomImage.ffu

) ELSE IF /i "%ExecuteParam%"=="b" (
    ApplyImage.bat %VolName%:\Images\install.wim

) ELSE IF /i "%ExecuteParam%"=="c" (
    DISM /capture-ffu /imagefile=%VolName%:\Images\CustomImage.ffu /Name:"Custom Image" /capturedrive=\\.\PhysicalDrive0

) ELSE (
    echo 文字列が不正です。再度ご確認ください。
    goto INPUT

)
```