今回は、Windows イメージのカスタマイズの続きで、応答ファイルを作成して、現在作業している Windows イメージに仕込みます。
前回と今回は連続的な作業になっています。既に、Windows イメージをマウントしている状態であれば、そのままで構いません。
マウントしていない場合は、後ほどイメージのマウントを案内するので、それまではマウントしなくても構いません。
では、始めていきましょう。
応答ファイルを使って Windows をカスタマイズ
Windows では、応答ファイル (無人応答ファイルとも呼ばれます)を使用して、Windows の初期セットアップ中に Windowsをカスタマイズすることが出来ます。
例えば、初期ユーザーを自動作成したり、EULA (ソフトウェア利用許諾契約) の表示をすっ飛ばしたり、プロダクトキーをあらかじめ仕込んでおいたり・・等々。
ここでは、主に以下のような設定を施しておきます。
- システムの言語設定、キーボード設定を日本語 (MS-IME) にする
- あらかじめ Administrator で作成しておいたユーザープロファイルを、Default Users プロファイルにコピーする。
- プロダクトキーを仕込む
- 既定の壁紙を設定する
また、Windows イメージに カスタマイズしたスタートメニュー を設定する方法もありますが、これは簡単に述べるだけにしておきます1。
応答ファイルの構成パスについて
構成パス というのは、Windows をインストールする際に、イメージにカスタマイズを加えることができるそれぞれのフェーズのことです。
これらの構成パスの全てを設定するわけではなく、主には specialize と oobeSystem が重要になってきます。
それぞれの構成パスに関する説明は次のとおりです。
- windowsPE
- これらの設定は、Windowsセットアップインストールプログラムによって使用されます。この構成パスが処理された後、対象のコンピュータに Windows イメージがコピーされます。
- offlineServicing
- DISM コマンドを使用して、無人応答ファイルをオフラインイメージに適用する時に処理されます。WindowsPE 構成パスが成功した後、コンピューターが再起動する前に実行されます。
- generalize
- この構成パスでは、コンピューター固有の情報が Windows から削除され、Windows イメージをキャプチャして、他のコンピュータに展開できるようになります。
- specialize
- 多くの設定はここに追加する必要があります。これらの設定は、監査モード (auditMode) と、OOBE (Out Of Box Experience) モードの開始時にトリガーされます。また、この構成パスで、一意のセキュリティID (SID) が生成されます。ネットワークの構成、インターナショナル設定、ドメイン設定などの多くの機能はここで構成します。
- auditMode
- この構成パスは、監査モード開始時にすぐに実行されます。
- oobeSystem
- 「Windows へようこそ」が開始される前に実行されます。ユーザーアカウントの作成、言語とロケールの設定を指定するために使用されます。
上記のうち、auditMode と、oobeSystem は排他になります。監査モードに入るときには、oobeSystem は実行されませんし、oobeSystem が実行されるときには、auditMode は適用されません。
応答ファイルの作成
応答ファイルは、Windows システムイメージマネージャー (SIM) を使用して作成します。SIM は Windows ADK に既にバンドルされているので、そちらから起動します。
Windows SIM を使用する
Windows システムイメージマネージャー (SIM) は、
[スタートメニュー
] → [Windows Kits
] → [Windows システムイメージマネージャー
]
と辿っていき、右クリックして [その他
] → [管理者として実行
] します。
Windows SIM でカタログファイルの作成
応答ファイルを作成するには、実際に作成しようとしている Windows のイメージファイル (WIM) からカタログファイルを作成する必要があります。
カタログファイルには、Windows イメージ内の設定とパッケージのみを含むバイナリファイルで、Windows イメージを使って作成することができます。このファイルは、Windows SIM でのみ使用されます。
前回 の記事で、Windows 10 のライセンスメディアから install.wim
を作業用ディレクトリにコピーしていると思うので、それを利用してカタログ情報を取得します。
まず、[ファイル
] → [Windows イメージの選択
] で、作業用ディレクトリの Images
に保存した、install.wim
を選択し、開きます。
「イメージの選択」 が開いたら、利用するイメージを選択します。これから作成したいのは、Windows 10 Pro のイメージなので、Windows 10 Pro を選択します。
「Windows System Image Manager」のダイアログが開くので、[はい
] をクリックすると、カタログファイルの作成が始まるのでしばらく待ちます。
カタログファイルが読み終わると、[Windows イメージ] ペインの [Components] にコンポーネントの一覧がインポートされます。
応答ファイルの作成と基本操作
これで準備ができたので、応答ファイルを作成しましょう。
[ファイル
] → [新しい応答ファイル
] をクリックします。
[応答ファイル] ペインに応答ファイルの構成パスが表示されます。
この構成パスに先程のコンポーネントを割り当てていきます。
コンポーネントを構成パスに実際に割り当ててみる例は以下のとおりです。
まず、 [ Windows イメージ ] ペインの
- [
amd64_Microsoft-Windows-Shell-Setup_10.0.XXXXX.XXX_neutral
]2 を右クリックして - [
パス 4 specialize に設定を追加
] をクリック。
すると、[ 応答ファイル ] ペインの [4 specialize
] に項目が追加されます。
続いて、[応答ファイル] ペインの [Components
] → [4 specialize
] → [amd64_Microsoft-Windows-Shell-Setup_neutral
] をクリックすると、[ Microsoft-Windows-Shell-Setup プロパティ ] にプロパティと設定の一覧が表示されます。
プロパティの [ CopyProfile
] の値を [ true
] に設定します。
このように、Windows イメージのコンポーネントを、応答ファイルの構成パスに配備していく形で、応答ファイルを作成していきます。
ここで、各構成パスごとに自身の行った設定を紹介してみたいと思います。
構成パスとコンポーネントの設定例
Windows PE
Microsoft-Windows-International-Core-WinPE
Windows PE で使用される言語を設定します。
- InputLocale:
0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}
→ MS-IME を使う構成です。 - LeyeredDriver:
6
→ 日本語106/109キーボードを使う構成です。 - SystemLocale:
ja-JP
- UILanguage:
ja-JP
- UILanguageFallback:
en-US
- UserLocale:
ja-JP
- SetupUILanguage
- UILanguage:
ja-JP
- UILanguage:
Generalize
Microsoft-Windows-PnpSysprep
作成した参照マシンを Generalize (一般化) する際に、参照マシンにインストールされているデバイスのドライバやその他のドライバを削除します。
- DoNotCleanUpNonPresentDevices:
false
- PersistAllDeviceInstalls:
false
Specialize
Microsoft-Windows-Shell-Setup
- CopyProfile:
true
→ 参照マシンで作成した Administrator のユーザープロファイルを、Default Users プロファイルにコピーします。 - ComputerName:
*
→ 展開先のPCのホスト名を自動生成します。 - ProductKey:
XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
→ ライセンスで取得しているプロダクトキーを指定します。 - TimeZone:
Tokyo Standard Time
- OEMName:
Studio Rough and Cheap
ここは任意でOK - OEMInformation: この部分は任意でOK。内容は、システム詳細情報のサポート欄に表示されます。
- Logo:
%windir%\System32\OEM\oem.logo
→ この部分は未使用になっているみたいで、本来必要ないかもしれませn。 - Manufactuer:
Studio Rough And Cheap Support Team
→ 情報に表示されます。必要に応じてどうぞ。 - Model:
20H2 CUSTOM IMAGE MODEL
→ システム詳細情報に表示されます。 - SupportURL:
https://www.rough-and-cheap.jp/
→ これ以下はサポート情報に表示されます。 - SupportHours:
9:00-18:00
→ サポート受付時間 - SupportPhone:
XXX-XXXX-XXXX
→ サポート連絡先
- Logo:
oobeSystem
Microsoft-Windows-International-Core
- InputLocale:
0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}
→ 詳細は下の表を参照。
InputLocale | 説明 |
---|---|
0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76} |
Microsoft IME |
0411:{D5A86FD5-5308-47EA-AD16-9C4EB160EC3C}{773EB24E-CA1D-4B1B-B420-FA985BB0B80D} |
Google日本語入力 |
0411:{B166439D-B0E1-4F24-BA36-E88CAA865815}{0B557B4C-5740-4110-A60A-1493FA10BF2B} |
ATOK 2016 |
- SystemLocale:
ja-JP
- UILanguage:
ja-JP
- UILanguageFallback:
en-US
- UserLocale:
ja-JP
Microsoft-Windows-Shell-Setup
- TimeZone:
Tokyo Standard Time
- OOBE
- HideEULAPage:
true
→ EULA (ソフトウェア利用許諾契約) のページをすっ飛ばします。 - ProtectYourPC:
3
→ こちらに書かれているように、PCを保護するための簡易設定を有効にするか無効にするか設定します。3
を指定したときは、無効にします。 - HideOnlineAccountScreen:
true
→ オンラインアカウントでサインインするページを非表示にします。 - HideLocalAccountScreen:
true
→ 管理者アカウントの設定は、応答ファイル中でする (後述) ので、OOBE 中では表示させません。 - HideWirelessSetupInOOBE:
true
→ ワイヤレスネットワークへの接続画面を非表示にします。 - NetworkLocation:
work
→ ネットワークの場所を、オフィスネットワーク(プライベート)で設定します。
- HideEULAPage:
- Themes: 既定のテーマの設定をします。
- ThemeName:
Rough and Cheap Theme
→ テーマの名前。適当で可。 - DesktopBackground:
%windir%\System32\OEM\default-wallpaper.jpg
→ デフォルトの壁紙。パスは、イメージ上のパスになります。
- ThemeName:
- UserAccounts: 詳細は下記参照。
応答ファイルで、予め管理用のローカルアカウントを作成するには、次のようにします。
- Microsoft-Windows-Shell-Setup / UserAccounts / LocalAccounts を右クリックして 「新しい LocallAccount の挿入」をクリックします。
- Microsoft-Windows-Shell-Setup / UserAccounts / LocalAccounts / LocalAccount で次の項目に値を設定する
Group
:Administrators
Name
: 任意のユーザー名
これで、LocalAccount の直下に、Password という項目が追加されると思います。
- Password
PlainText
: 通常、true
になっています。Value
: パスワードを指定します。
ちなみに、パスワードはプレーンテキストになっていますが、応答ファイルを保存する際にハッシュ化されます。
Microsoft-Windows-Deployment
- Reseal:
Audit
→ 監査モードで起動します。
本来は OOBE
として設定すべきなのですが、ここでは Audit
として設定しておきます。
応答ファイルの保存
ここまでの構成ができたら、[ツール
] → [応答ファイルの検証
]でエラーをチェックします。
特にエラーがなければ、ファイル名を Unattend-Audit.xml
として、作業用ディレクトリの AnswerFiles
ディレクトリに保存します。
次に、この Unattend-Audit.xml
をコピーし、Unattend-OOBE.xml
として AnswerFiles
ディレクトリにペーストします。
そして、Unattend-OOBE.xml
を「メモ帳」などの適当なテキストエディタで開き、次の場所を見つけます。
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Reseal>
<Mode>Audit</Mode>
</Reseal>
</component>
見つけたら、Audit
の部分を、OOBE
と書き換えて、上書き保存します。
これで、
Unattend-Audit.xml
Unattend-OOBE.xml
の2つの応答ファイルができました。
Windows イメージのカスタマイズを進める
ここで再び、Windows イメージの再登場になります。
既にマウントしている方は、そのままで良いですが、一旦マウントを解除している方はもう一度マウントします。
Dism /Mount-Wim /Wim-File:images\basicimage.wim /Index:1 /MountDir:mount\windows
Windows イメージに応答ファイルをコピー
Windows が起動時に検索できるように、C:\Windows\Panther
ディレクトリを作成します。
md mount\windows\Windows\Panther
C:\Windows\Panther
に、AnswerFiles\Unattend-Audit.xml
をコピーします。ファイル名は、Unattend.xml
とします。
copy AnswerFiles\Unattend-Audit.xml mount\windows\Windows\Panther\Unattend.xml
これで、参照マシンを起動時に 「監査モード」 で起動できるようになります。
次に、AnswerFiles\Unattend-OOBE.xml
を、C:\Recovery\OEM
にコピーします。ファイル名はそのままで良いです。
md mount\windows\Recovery\OEM
copy AnswerFiles\Unattend-OOBE.xml mount\windows\Windows\Panther
スタートメニューのカスタマイズ
展開する Windows イメージに、予めカスタマイズしておいたスタートメニューを設定することができます。
この記事の冒頭でも書いたように、簡単にさわりだけを述べるにとどめておきます。
要約しますと、LayoutModification.xml というファイルを作成して、それを Windowsイメージのデフォルトユーザープロファイルに保存するだけです。
デフォルトユーザープロファイルというのは、今マウントしているイメージで言えば、
mount\windows\Users\Default\AppData\Local\Microsoft\Windows\Shell
に保存します。
参考として、先に作成した USB-B の中に StartLayout\LayoutModification.xml
がありますので、一度見てみるといいかもしれません。
また、Microsoft ドキュメントでは、
というドキュメントも参考になるかもしれませんし、参考にならないかもしれません。
いずれにしても、この方法では、
- 実際に実機に展開するまで結果がわからない
という問題があるので、色々試行錯誤できる時間があれば試してみてもよいのですが、会社や組織で ActiveDirectory で運用されている場合は、グループポリシーでもスタートレイアウトは構成できるので、そちらの方が、早く簡単に動作を確認することができまし、展開させることができます。
スタートメニューのショートカット
スタートメニューをイメージに含めるか、あるいはグループポリシーで構成するか、いずれにするのかは別として、スタートメニューに追加したい項目については、.url
ファイルや、.lnk
ファイルを所定のディレクトリに追加しておく必要があります (追加しなくても良い方法もありますが、詳細は前述のドキュメントを参照してください)。
例えば以下のようにして、Windows のイメージに対してコピーしておきます。
Copy Resources\shortcuts\hoge.url "mount\Windows\ProgramData\Microsoft\Windows\Start Menu\Programs"
Copy Resources\shortcuts\fuga.lnk "mount\Windows\ProgramData\Microsoft\Windows\Start Menu\Programs"
その他諸々
予め禁断のディレクトリ、%Windir%\System32
に OEM
ディレクトリを作成しておきます3。
md mount\windows\Windows\System32\OEM
アイコンファイル
もし、組織独自のアイコンなどを予め追加しておきたい場合は、次のようにしてファイルをイメージにコピーします。
copy Resources\icons\* mount\windows\Windows\System32\OEM
壁紙
応答ファイルで指定しているテーマの壁紙をイメージにコピーします。
copy Resources\wallpapers\default-wallpaper.jpg mount\windows\Windows\System32\OEM
その他
その他、オフラインの Windows イメージで、コピー等が可能なファイルは予めコピーしておくと便利です。
例えば、
mount\windows\Users\Public\Desktop
には、共通のデスクトップショートカットを置いておく事ができます。mount\windows\Users\Public\{Videos, Pictures}
には、共通のイメージや動画を置いておく事ができます。
Windows イメージのアンマウント
Windows イメージを最適化する
Windows イメージをアンマウントする前にイメージを最適化し、イメージのサイズを可能な限り小さくします。
イメージを最適化するには、Dism /Cleanup-Image
を使います。
dism /Image:mount\windows /Cleanup-Image /StartComponentCleanup
前回、.NET Framework 3.5 の機能をインストールした場合は、次のようなエラーが出るかもしれません。
エラー: 0x800f0806
保留中の操作があるため、この操作を完了できませんでした。
DISM ログ ファイルは C:\WINDOWS\Logs\DISM\dism.log にあります
これは原因がはっきりとはわからないのですが、/Get-Packages
オプションで見てみると、
パッケージ ID : Microsoft-Windows-NetFx3-OnDemand-Package~31bf3856ad364e35~amd64~~10.0.19041.1
状態 : インストールの保留中
リリースの種類 : OnDemand Pack
インストール時刻 : 2021/03/10 0:35
とこんな感じで、インストールが保留されている状態になっています。
実際、上記エラーメッセージ中の C:\WINDOWS\Logs\DISM\dism.log
を見ても、保留中のパッケージがあるのでエラーになっている、という旨のログが出力されていました。
・・では、どうすればいいのか。
それは、ここではこの問題はあえて無視します。
上のコマンドは、あくまでもイメージのサイズを縮小させるために、不要なパッケージを削除したりするのが目的なので、特に必要がなければ この最適化の部分はスキップしても大丈夫 です4。
Windows イメージのアンマウント
続いて、Windows イメージをアンマウントします。
ただし、アンマウントする際に、
- イメージ内のファイルを別のアプリケーションで開いていている
- イメージ内のディレクトリをエクスプローラで開いていている
- 展開およびイメージングツール環境 のカレントディレクトリが、イメージ内のディレクトリである
ような場合、アンマウントが失敗 するので予め確認しておきます。
アンマウントするには、Dism /Unmount-Image
を使用します。
dism /unmount-image /mountdir:mount\windows /commit
展開イメージのサービスと管理ツール
バージョン: 10.0.19041.1
イメージを保存しています
[==========================100.0%==========================]
イメージのマウントを解除しています
[==========================100.0%==========================]
操作は正常に完了しました。
万が一閉じ忘れているファイルがあったりして、アンマウントが失敗した場合は次のようなエラーが出ます。
dism /unmount-image /mountdir:d:\deployment_work\2004\winpe_amd64\mount /commit
展開イメージのサービスと管理ツール
バージョン: 10.0.19041.1
イメージを保存しています
[==========================100.0%==========================]
イメージのマウントを解除しています
[==========================100.0%==========================]
エラー: 0xc1420117
ディレクトリを完全にはマウント解除できませんでした。これは通常、アプリケーションがマウント ディレクトリ内のファイルを開 いていることが原因です。マウント解除のプロセスを完了するには、これらのファイルを閉じてから、再度マウントを解除してください。
DISM ログ ファイルは C:\WINDOWS\Logs\DISM\dism.log にあります
この場合、既にイメージのコミットは完了している ので、開いたままになっているアプリケーションを閉じて、再度アンマウントを実行します。この時、コミットは既に終わっているので、/Commit
オプションをつけるとエラーになります。その場合は、/Discard
を付けてアンマウントしましょう。
dism /unmount-image /mountdir:d:\deployment_work\2004\winpe_amd64\mount /discard
展開イメージのサービスと管理ツール
バージョン: 10.0.19041.1
イメージのマウントを解除しています
[==========================100.0%==========================]
操作は正常に完了しました。
Windows イメージのエクスポート
次に、カスタマイズした Windows イメージを install.wim
としてエクスポートします。
まず、元々ソースとなった ISO イメージからコピーした install.wim
を削除します。
del Images\install.wim
次に、Dism /Export-Image
を使って、カスタムしたイメージ basicimage.wim
から install.wim
をエクスポートします。
dism /export-image /sourceimagefile:images\basicimage.wim /sourceindex:1 /destinationimagefile:images\install.wim
展開イメージのサービスと管理ツール
バージョン: 10.0.19041.1
イメージをエクスポートしています
[==========================100.0%==========================]
操作は正常に完了しました。
この段階で、作業用ディレクトリの Images
ディレクトリには、次のようなファイルが存在しているはずです。一度ここで整理しておきましょう。
basicimage.wim # カスタムしたイメージ
boot2.wim # Windows PE のカスタムイメージ
install-backup.wim # ソースISO からコピーしたオリジナルのイメージ
install.wim # カスタムイメージからエクスポートしたイメージ
次回予告
今回、応答ファイルを作成してWindows イメージに仕込み、更に様々な細々としたファイルを追加したりして、それを install.wim
としてエクスポートしました。
次回は、このエクスポートしたファイルを使って、参照マシンを作成していきます。
2件のコメント
匿名 · 2021年6月4日 10:49 AM
この続きを知りたいです。続編期待しています。
zaturendo · 2021年6月7日 10:33 AM
ありがとうございます。
もうすでにほぼ出来上がっているので、もう少しお待ち下さい・・。