Windows 多言語カスタムイメージ作成手順

この記事は、以下の要件を満たすWindowsのインストーラーを作成する手順のメモです。

* セットアップ中にインストールする言語を選択できる (多言語の Windows イメージ)
* 最新のWindows Updateが適用されている
* そのほか必要なアプリのインストールや設定が済んでいる

PCを使っていると定期的に大掃除(クリーンインストール)をしたくなるものです。
必要なツールとパッチが全部入った最強のインストーラーを作成し、Windowsのインストールを効率化しましょう！！

# はじめに
MicrosoftはPCメーカーや大規模展開するユーザーのために、環境を複製する手順を公開しています。

* [デスクトップの製造 - MSDN](https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn938361(v=vs.85).aspx)

![DISM1.png](https://qiita-image-store.s3.amazonaws.com/0/31974/1fab4c60-14d0-834b-4a8e-0aa55c8555fc.png)

1. マスターインストール  
    Windowsの`(A)オリジナルインストールディスク`を使用して`(B)マスターマシン`をセットアップします。
2. Windows Update・アプリのインストール  
   Windows Update、必要なアプリのインストール、初期設定を行います。
3. Windowsイメージのキャプチャー  
   `(B)マスターマシン`の環境を`(C)マスターWindowsイメージファイル`に保存します。
4. ディスクイメージ作成  
   `(C)マスターWindowsイメージファイル`を含んだ `(D)カスタムインストールディスク`のイメージ(ISOファイル)を作成します。
5. インストールメディア作成  
   `(D)カスタムインストールディスク`の内容をUSBストレージにコピーして`(E)カスタムインストールメディア`を作成します。
6. 展開  
    `(E)カスタムインストールメディア`からWindowsをインストールし、`(B)マスターマシン`のクローンである`(F)複製マシン`を作成します。

展開方法として、このほかにWindowsイメージから直接展開する方法、ネットワークから展開する方法などがありますが、この記事では扱いません。

# 参考リンク

* [Windows セットアップのしくみ](https://technet.microsoft.com/ja-jp/library/dd744366.aspx)
* [多言語の Windows イメージの作成](https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn898592(v=vs.85).aspx)

# 用語

* OOBE(Out-Of-Box-Experience)  
    PCを開封して初めて起動したときに起動するセットアップウィザード。  
    ![oobe.png](https://qiita-image-store.s3.amazonaws.com/0/31974/c55dd44f-e904-f91d-6f32-b0b0dd97665d.png)
* 特殊化 (Specialize)  
    マシン固有の設定を行う段階。  
    ![specialize.png](https://qiita-image-store.s3.amazonaws.com/0/31974/591c9a2e-4069-9e93-4bae-1b45f1e097de.png)
* 一般化 (Generalize)  
    特殊化で行った設定をリセットすること。
* Sysprep (SYStem PREPare)  
    OOBEで行った設定をリセットするツール(一般化もできる)。
* 監査モード (Audit mode)  
    OOBE中にCtrl+Shift+F3を押すか、Sysprepのオプションで入ることができる特殊なモード。監査モード中はAdministratorで自動ログインするので、余計なユーザーを作らなくて済む。
* DISM (Deployment Image Servicing and Management)  
    Windowsイメージを操作するコマンドラインツール
    * [DISM (展開イメージのサービスと管理) の概要 - MSDN](https://msdn.microsoft.com/ja-jp/library/hh825236.aspx)
    * [Dismコマンドレットを使用してWindowsイメージを操作する](http://qiita.com/tetsurom/items/d5a8192c1584feacac82)

# 準備

後で必要となるWindows ADKをインストールしておきます。
ADKはWindowsのバージョンごとに分かれています。インストーラーを作りたいWindows用のADKをすべてインストールする必要があります。

* [Windows ADK のダウンロード](https://developer.microsoft.com/ja-jp/windows/hardware/windows-assessment-deployment-kit)

また、インストーラーを作るWindowsの、元となるインストーラー(DVDまたはisoイメージファイル)が必要です。


# マスターイメージの準備

## マスターマシンのセットアップ

マスターマシンは物理マシンでも仮想マシンでも構いませんが、やり直しになると非常に時間がかかるので、Hyper-V仮想マシンでチェックポイントを付けながら作業するのがおすすめです。

手順

1. Windowsインストール  
    OOBEが始まったらCtrl+Shift+F3で監査モードへ。
    監査モードを使わないなら、ダミーユーザーでセットアップしてからAdministratorを有効にして作業すると良い。
2. .Net Framework 3.5の有効化 (Windows 8 以降) (省略可)  
    (注)言語パックを追加していると失敗することがある
3. 言語パックインストール  
    [コントロール パネル]-[時計、言語、および地域]-[言語]-[言語の追加]  
    追加した言語の[言語のオプション]から[言語パックをダウンロードしてインストールします]をクリック
4. Windows Update  
    (注)言語パックをインストールする前にアップデートしても、一部のパッチはやり直しになる
5. プリインストールするアプリのインストール
6. デスクトップ等の初期設定  

基本的に監査モードで準備すれば問題ないはずですが、Windows 8.1 With Updateで試すとなぜかWindows Updateが終わりませんでした。

### Windows 7の言語パックについて
Windows 7はライセンス上、言語パックをインストールできるのはUltimateとEnterpriseのみです。他のエディションではコントロールパネルから言語を追加できません。

マスターマシンの作成用途では、DISMコマンドを使うことで制約を無視して言語パックを追加できます。詳しくは以下のページを参照してください。

* [多言語展開とは - MSDN](https://technet.microsoft.com/ja-jp/library/dd744336(v=ws.10).aspx)

Windows 7の言語パックはMSDNで配信されています。

## 自動応答ファイルの作成

自動応答ファイルとは、Windowsのセットアップ(主にOOBE)で設定する値を書いたXMLファイルです。Sysprep実行時に渡すことでインストールを自動化できる。

* [sysprep用の応答ファイルを作る（Windows 7／Server 2008 R2編）](http://www.atmarkit.co.jp/ait/articles/1111/11/news139.html)  
    他のOSでも同じ
* [KMS Client Setup Keys](https://technet.microsoft.com/en-us/library/jj612867.aspx)  
    OOBEでの入力をスキップするために使用できるプロダクトキーの一覧
* [boxcutter/windows](https://github.com/boxcutter/windows/tree/master/wsim)  
    Windows各バージョンのカタログファイル(10/Server 2016は入っていない)
* [ロケール ID (LCID) の一覧 - MSDN](https://msdn.microsoft.com/ja-jp/library/cc392381.aspx)  
    ※応答ファイルで使うのは16進数

### ライセンス認証猶予期間

一般化するとライセンス認証猶予期間がリセットされますが、これには回数の上限があります。
`Microsoft-Windows-Security-SPP` の `SkipRearm` を `1` にすることでリセットしないで一般化ができます。
こうして作成したインストーラーを使用すると、インストール直後に「このWindowsのコピーは正規品ではありません」と表示されますが、落ち着いてプロダクトキーを入れ直せば問題ありません。

Windows 7はリセット回数の上限が4なので、イメージを更新していく予定なら設定したほうがいいでしょう。

Windows 8以降は1000回なので設定しなくても問題ありません。

### よく使う設定

| パス |コンポーネント | キー | 値 | 説明 |
|---------------|-----|-----|----|-----|
|generalize|Microsoft-Windows-Security-SPP|SkipRearm|1|ライセンス認証猶予期間をリセットしない|
|specialize|Microsoft-Windows-Shell-Setup|ProductKey|(プロダクトキー)|プロダクトキー|
|specialize|Microsoft-Windows-Shell-Setup|CopyProfile|true|Administratorのユーザー設定をデフォルトの設定とする|
|specialize|Microsoft-Windows-Shell-Setup|TimeZone|Tokyo Standard Time|タイムゾーンを日本にする|
|oobeSystem|Microsoft-Windows-International-Core|InputLocale|0411:E0010411|入力ロケールを日本語/MS-IMEにする|
|oobeSystem|Microsoft-Windows-International-Core|SystemLocale|ja-JP|システムロケールを日本語にする|
|oobeSystem|Microsoft-Windows-International-Core|UILanguage|ja-JP|UI言語を日本語にする|
|oobeSystem|Microsoft-Windows-International-Core|UserLocale|ja-JP|ユーザーロケールを日本語にする|
|oobeSystem|Microsoft-Windows-Shell-Setup|OOBE/HideEULAPage|true|利用規約のページをスキップする|
|oobeSystem|Microsoft-Windows-Shell-Setup|OOBE/HideWirelessSetupInOOBE|true|Wi-fi設定のページをスキップする|
|oobeSystem|Microsoft-Windows-Shell-Setup|OOBE/HideOnlineAccountScreens|true|Microsoft アカウント設定のページをスキップする|
|oobeSystem|Microsoft-Windows-Shell-Setup|OOBE/NetworkLocation|Home/Work/Other|ネットワークロケーションの設定(ホーム/社内/パブリック)|
|oobeSystem|Microsoft-Windows-Shell-Setup|OOBE/ProtectYourPC|1|自動更新を推奨設定にする|

* 多言語インストーラーでは`Microsoft-Windows-International-Core`の設定をしない(言語が選べなくなるので)

## 一般化

Sysprep(`C:\Windows\System32\Sysprep\sysprep.exe`)を実行して一般化します。

![image](https://qiita-image-store.s3.amazonaws.com/0/31974/5a17f517-abad-d802-880e-543ddd01dc31.png)


### Windows 10 の注意点
Windows 10 (version 1511)以降、ストアアプリが原因でSysprepが失敗するようになっています。

> Windows 10 バージョン 1511 から、Microsoft コンシューマー エクスペリエンスという機能が追加されました。
この機能は、ユーザーに Windows ストア経由 (インターネット接続が必要) にて、おすすめのアプリがいくつか自動でインストールされる機能です。
これらアプリが自動インストールされた状態で Sysprep を実行した場合、Sysprep の処理が失敗いたします。
これは Windows 10 の環境において、プロビジョニングされていないアプリがユーザーにインストールされている場合、Sysprep の実施が失敗するという制限事項に起因しています。

* [Windows 10 (バージョン 1511) における Sysprep 実行時の注意点 - Technet](https://blogs.technet.microsoft.com/askcorejp/2015/12/20/windows-10-1511-sysprep/)

上記の回答ではポリシーの設定によりインストール自体を止める方法が紹介されていますが、入ってしまった場合はPowerShellで原因となるアプリを個別に削除するとSysprepできることを確認しています。

```ps1:UWPの削除
Get-AppxPackage | Where PackageFullName -match "MicrosoftSolitaireCollection" | Remove-AppxPackage
```

原因となるアプリはその時々で違うと思われるので、Sysprepのエラーログ(`C:\Windows\System32\Sysprep\Panther\setuperr.log`)を見ながら成功するまで削除を繰り返します。

* [Windows 10 Pro で Sysprep を成功させる方法](http://blog.coderevo.net/?p=231)

### ストアアプリ一般の注意点
上記以外のWindows 8、8.1、10でも、プリインストールされているストアアプリを更新するとWindows 10と同様の問題が起きることを確認しています。
対処方法は同じです。

### テスト
Unattend.xmlに間違いがあるとセットアップできず、初めからやり直しになります。
仮想マシンで作業している場合はテストしましょう。

* sysprep前後にスナップショットを取ります
* sysprep後に起動してOOBEを最後まで実行できるか試します
    * 成功したらsysprep後に戻します
    * 失敗したらsysprep前に戻してUnattend.xmlを修正します

sysprep後に起動すると特殊化されるので起動してはいけません。もし起動してしまったら、セットアップが終わるのを待ってもう一度sysprepを実行します。

## イメージのキャプチャー

DISMを使用してイメージをキャプチャーします。仮想HDDはマウントしておきます。

**チェックポイントを残したままマウントすると仮想HDDが壊れる**ので注意してください。

```ps1
# Mドライブにマウントし、`D:\install.wim`にキャプチャーする場合
New-WindowsImage -CapturePath "M:\" -ImagePath "D:\install.wim" -Name "Windows 8.1 Pro (x64) (ja-JP)" -Description "Windows 8.1 Pro"
```

Descriptionの値は以下のものを使用します。

* デスクトップOS
    * Windows 7 PROFESSIONAL
    * Windows 8.1 Pro
    * Windows 10 Pro
* サーバーOS
    * Windows Longhorn SERVERSTANDARD
    * Windows Server 2008 R2 SERVERSTANDARD
    * Windows Server 2012 SERVERSTANDARD
    * Windows Server 2012 R2 SERVERSTANDARD

# インストーラーの作成

## インストーラーのコピー

元となるWindowsインストーラー(DVD)の中身をすべてコピーします。

以下、コピー先を`D:\dist`とします。

## マスターイメージのコピー

DISMでキャプチャーしたイメージを`D:\dist\sources\install.wim`へ上書きします。

## 32ビット/64ビットの混在
複数のイメージをinstall.wim内に格納すると、その中から1つ選んでインストールすることができます。

* 32ビット/64ビットの混在が可能です(32ビット版のインストーラーを使用する必要があります)。
* インストーラーと異なるバージョンのWindowsは、格納しても選べません。

複数イメージを格納するには、Export-WindowsImageコマンドレットでイメージを追加します。

```ps1
Export-WindowsImage -SourceImagePath Windows8.1_x86.wim -SourceIndex 1 -DestinationImagePath Windows8.1.wim
```

複数イメージが格納されたwimファイルを使用する場合、Descriptionが正しく設定されている必要があります。

## Windows PE言語パックインストール

Windows PE上で動作するインストーラーで言語を選択するには、Windows PEにマスターイメージと同じ言語を追加しておく必要があります。

Windows PEの言語パックはWindows ADKに付属しています。


作成したマスターイメージとWindows PEのイメージ(boot.wimのインデックス2)をそれぞれマウントします。マウント先を`D:\mount\boot`、`D:\mount\windows`とします。

```ps1
Mount-WindowsImage -ImagePath "D:\dist\sources\boot.wim" -Path "D:\mount\boot" -Index 2
Mount-WindowsImage -ImagePath "D:\dist\sources\install.wim" -Path "D:\mount\windows" -Index 1
```

`Add-WindowsPackage`コマンドレットで言語パックを追加します[^adk]。

[^adk]: Windows 8.1以外のイメージを作成しているときは`8.1`を適宜読み替えてください

```ps1
Add-WindowsPackage -Path "D:\mount\boot" -PackagePath "C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\lp.cab"
Add-WindowsPackage -Path "D:\mount\boot" -PackagePath "C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-Setup_en-us.cab"
```

lang.iniを生成し、Windows PE イメージにコピーします。

```ps1
dism /image:"D:\mount\windows" /Gen-Langini /distribution:"D:\dist"
cp "D:\dist\sources\lang.ini" "D:\mount\boot\sources\lang.ini"
```

マウント解除します。

```ps1
Dismount-WindowsImage -Path "D:\mount\boot" -Save
Dismount-WindowsImage -Path "D:\mount\windows" -Discard
```

## ISOイメージ作成

コマンドラインツール`oscdimg.exe`を使います。実行ファイルは `C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg`にあります[^adk] (パスは通っていません)。

```
oscdimg.exe -u1 -m -o -bD:\dist\boot\etfsboot.com -lWIN8MULTI D:\dist D:\iso\win8multi.iso
```

`-l`はボリュームラベルです。

## ブータブルUSBメモリの作成

おそらくDVDには収まらないので、インストールにはUSBメモリを使用します。
作成には何を使っても構いませんが、[Rufus](http://forest.watch.impress.co.jp/library/software/rufus/)が使いやすかったです。

USBメモリの代わりに、[ZALMAN ZM-VE350](http://www.zalman.com/jp/contents/products/view.html?no=20)等の仮想ドライブ機能を持つHDDを使用することもできます。

# イメージの更新

1年ほど経つとWindowsや各種ソフトのアップデートが溜まってメリットが薄れてくるので、イメージを更新します。

1. 作成したインストーラーでインストール
2. Windows Updateを最新になるまで適用
3. Sysprepを実行  
    前回実行時のUnattend.xmlが残っているので、そのまま使います
4. イメージをキャプチャーしてinstall.wimを差し替え
5. ISOイメージ、ブータブルUSBメモリ作成

## Windows 7の注意点
言語を追加できないエディションでは、多言語のインストーラーを使用しても、監査モードにしない限りインストール時に選んだ言語以外は削除されます。

* [言語パック削除タスク - MSDN](https://technet.microsoft.com/ja-jp/library/dd744336(v=ws.10).aspx#LPRemovalTimer)

OOBEを完全に自動化するとOOBEから監査モードに入れません。
その場合はインストール後すぐにSysprepを実行して監査モードに移行してください。