以前、Windows Serverゲストの一般化イメージを含むHyper-V仮想マシン(VM)のテンプレートを作成する方法について紹介しました。今回は、クライアントOSであるWindows 11 Enterprise(バージョン23H2)のVMテンプレート作成に挑戦します。Windows 10以降、MicrosoftアカウントによるセットアップやMicrosoft Storeアプリの存在など、Windowsセットアップにはさまざまな変更が加えられた結果、Sysprepによる一般化には少し工夫が必要になりました。
2024.10.03 更新) Windows 11 バージョン 24H2 (OSビルド26100.1742メディア使用)ではこの方法で Sysprep を成功させることはできませんでした。Windows 11 バージョン 24H2でSysprepを成功させるためには、この記事の最後に追記した追加の手順が必要です。
Windowsクライアントの新しいセットアップオプション
マスターPCのデバイスにWindowsをインストールしてカスタマイズを加え、「Sysprep(システム準備ツール)」(Microsoft Learn)を実行してイメージを一般化、そのマスターイメージをキャプチャして、ネットワーク経由などでそのイメージを大量のデバイスにOSをイメージ展開するという方法は、「Windows展開サービス(Windows Deployment Services)」(Microsoft Learn)を始めとするOS展開ツールで古くから使用されてきた技術です。Windows 10やWindows 11でもその方法は利用可能です。
Windows 10以降、「プロビジョニングパッケージ」(Microsoft Learn)や「Windows Autopilot」(Microsoft Learn)という、イメージ展開に代わる新しいクライアントセットアップ技術が利用可能になりました。これらは、OSのイメージ展開ではなく、プリインストールされたWindowsを組織用に自動セットアップするものです。
Hyper-VやAzure上のVMにWindowsクライアントを展開する場合は、昔ながらのSysprepによる一般化イメージを使用するのが便利です。しかし、Windows 10以降、以前のように一般化イメージを簡単に作ることはできなくなりました。従来の方法で一般化しようとすると、一般化に失敗したり、致命的なエラーが発生したりするようになったのです。そんなこともあって、Windows 10およびWindows 11のSysprepに関しては、新しいバージョン(機能更新プログラム)がリリースされるたびに、実験してきました。その成功や失敗の記録は、旧ブログ(外部サイト)に残してあります。
今回は、その経験を踏まえて、(この記事の執筆時点で)最新のWindows 11バージョン23H2 Evaluation日本語版(90日間評価版)のVMテンプレートを作成してみます。ほとんど同じ手順でWindows 10(長期サービスチャネルである LTSCを含む)のVMテンプレートを作成できるはずです。しかし、LTSC以外のWindows 10のサポートは1年後(2025年10月)には終了するため、Windows 10について詳しい説明は無意味でしょう。
Windows 11 Enterprise|Microsoft Evaluation Center
なお、ここで示す手順はHyper-V VMとして展開できるVMテンプレートイメージです。Windows Virtual DesktopやMicrosoft 365 Cloud PC用のイメージについては、サービス固有の要件がありますので、その作成方法については公式ドキュメントに従ってください。
チュートリアル: Windows 11 デスクトップを含むサンプルの Azure Virtual Desktop インフラストラクチャをデプロイする|Azure Virtual Desktop(Microsoft Learn)
デバイス イメージの概要|Windows 365(Microsoft Learn)
Hyper-V VMにWindows 11ゲストをインストールする
Windows ServerゲストのVMテンプレートの作成手順については、以下の回で紹介しました。
vol.18 ラボ環境 on Azureを作る(6) - VMテンプレートを作成する
Windows 11ゲストのVMテンプレートの場合、Windows Serverゲストのように簡単にはいきません。Windows 10以降のインストールイメージの一般化には、いくつかテクニックが必要です。そのタイミングや設定については、私の経験上、探し当てた方法なので、正解かどうかは分かりません。大事なのはこの方法で一般化が成功することです。
- Windows 11のシステム要件を満たす構成のHyper-V VMを新規作成します。具体的には、UEFIベースの第2世代仮想マシンとして作成し、セキュアブートとトラステッドプラットフォームモジュール(TPM)を有効化します。また、メモリ4GB(4096MB)以上を割り当て、2コア以上の仮想プロセッサを割り当てます。そして、DVDドライブにWindows 11 Enterprsie Evaluation日本語版のISOイメージを割り当て、DVDドライブから起動するように設定します(画面1)。
画面1 Windows 11のシステム要件を満たすようにHyper-V VM(第2世代)を作成し、設定する
- VMを開始し、「Press any key to boot from CD or DVD....」と表示されている間に[Enter]キー(または任意のキー)を押して、DVD(ISOイメージ)から起動します。
- 「Windowsセットアップ」が開始したら、[Shift]+[F10]キーを押して(WinPEの)コマンドプロンプトを開き、「vol.4 推奨パーティション構成でクリーンインストールするには」で説明した手順でパーティションを手動で作成します(画面2)。その後、「Windowsセットアップ」を進めて、「ドライブ0 パーティション3: Windows」のプライマリパーティションを選択してインストールを行います(画面3)。
画面2 DISKPARTコマンドを使用して、パーティションを手動で作成する。パーティションを手動で作成する理由は、このブログの読者ならよくご存じのはず
画面3 手動で作成したプライマリパーティションを選択してインストールを進める
- ファイルのコピーなどが終わり、何度か再起動したあと、「職場または学校向けに設定しましょう」のページが表示されたら、「サインインオプション」をクリックし、「代わりにドメインに参加する」を選択します(画面4)。「このデバイスを使うのは誰ですか?」のページで、ローカルアカウント名(後ですぐに削除することになります)を入力し、パスワードとセキュリティの質問を設定します。
画面4 Microsofアカウントや会社のアカウント(Microsoft Entra ID)ではなく、ローカルアカウントでセットアップを進める
- 「デバイスのプライバシー設定の選択」ページで「同意」をクリックします。
- 「更新プログラムを確認しています」に続いて、「最新の機能をインストールしています」の画面が表示されます。「更新中 手順 1/3: ダウンロード中 - 100%」まで進み、「更新中 手順 2/3: インストール中 - X%」になったら、その時点でVMの設定を開き、ネットワークを切断します(画面5)。待っている間、サーフィンゲームでもプレイして時間をつぶしてください(セットアップのこの部分は2024年中頃に追加されたようです)。ネットワークを切断する理由は、ユーザーがサインインした後に始まってしまうストアアプリの更新を止めるためです。ビルトインのストアアプリの更新や、新たなアプリがインストールされてしまうと、Sysprepによる一般化は失敗します。アプリのアンインストール(Remove-AppxPackageを使用)で回避できる場合がありますが、最初からブロックしておく方が簡単です。
画面5 この時点(ユーザーがデスクトップにサインインするより以前)でVMのネットワークを切断しておく
- 更新が完了したら(失敗した場合でも)、「デスクトップに進む」をクリックして、セットアップ時に作成したローカルアカウントでサインインします。
ゲストOSの構成、更新、一般化
ここまでの時点で、ローカルユーザーによるサインインが行われました。VMのネットワークは切断されたままです。この後、Sysprepの実行に向けて、少し面倒な作業があります。
- 「コンピューターの管理」スナップイン(compmgmt.msc)の「ローカル ユーザーとグループ¥ユーザー」を開き、既定で無効になっているローカル管理者アカウントのAdministratorのプロパティを開き、有効にします。また、Administratorにパスワードを設定します(画面6)。なお、Administratorを有効にしても、最後にSysprepを実行したあとに、再び無効化されます。
画面6 Administratorを有効にし、パスワードを設定する
- 現在サインイン中のユーザーをサインアウトし、Administratorの資格情報でWindowsにサインインします。
- 「システムのプロパティ」コントロールパネル(sysdm.cpl)を開いて、「詳細設定」タブのユーザープロファイルにある「設定」をクリックし、セットアップ時に作成したローカルユーザーのプロファイルを削除します。また、「コンピューターの管理」スナップイン(compmgmt.msc)を開き、セットアップ時に作成したローカルユーザーのアカウントを削除します(画面7)。
画面7 セットアップ時に作成したローカルユーザーのプロファイルを削除し、そのユーザーアカウントも削除する
- コマンドプロンプトを開き、以下のコマンドラインを実行します。
C:\> Schtasks.exe /change /disable /tn "\Microsoft\Windows\AppxDeploymentClient\Pre-staged app cleanup"
「ローカルグループポリシーエディター」スナップイン(Gpedit.msc)を開き、以下のポリシーを設定します。ポリシーを設定したら、コマンドプロンプトで「gpupdate」を実行し、ポリシーを適用します(画面8)。
● コンピューターの管理¥管理用テンプレート¥Windows コンポーネント¥クラウド コンテンツ¥Microsoft コンシューマー エクスペリエンスを無効にする:有効
● コンピューターの管理¥管理用テンプレート¥Windows コンポーネント¥ストア¥更新プログラムの自動ダウンロードおよび自動インストールをオフにする:有効
● コンピューターの管理¥管理用テンプレート¥Windows コンポーネント¥ストア¥最新バージョンの Windows への更新プログラム提供をオフにする:有効
画面8 3つのポリシーを既定の「未構成」から「有効」に変更し、ポリシーを適用する
- この時点でようやくネットワークを再接続します。ネットワーク接続後、Windows Updateを実行して、OSを最新の状態にアップデートします。また、Microsoft Edgeの更新や、イメージにあらかじめ組み込んでおくデスクトップアプリケーションをインストールします(画面9)。なお、Microsoft Storeを開いて、ストアアプリを更新することはしないでください。
画面9 VMをネットワークに再接続し、Windows Updateの実行や、デスクトップアプリケーションのインストール、ツールのコピーなどを行う
- 先ほど設定した3つのポリシー設定を、すべて元の状態(未構成)に戻します。「gpupdate」の実行は必要ありません。また、手順4で無効化したタスクの有効化も不要です。Sysprep後の初回起動時に自動的に有効化されるからです。
- コマンドプロンプトを開き、「C:¥Windows¥System32¥Sysprep」に移動して、次のコマンドを実行します(画面10)。VMが停止したら一般化イメージの完成です。
C:\Windows\System32\Sysprep> sysprep /oobe /generalize /shutdown /mode:vm
画面10 ポリシー設定を元に戻し、Sysprepを実行して一般化後、シャットダウンする
応答ファイル(Unattend.xml)によるMini-Setupの自動化
Sysprepで一般化したイメージ(のコピー)を使用したVMを起動すると、初回起動時に「国または地域はこれでよろしいですか?」「これは正しいキーボード レイアウトまたは入力方式ですか?」から始まり、アカウント(オンラインまたはローカル)の追加やプライバシー設定、エクスペリエンスのカスタマイズなど、Windowsの最終的なセットアップを行う「Mini-Setup」のプロセスへと進みます。
セットアップ情報を含む応答ファイル(unattend.xml)を作成し、イメージのC:ドライブのルート(または「%Windir%¥System32¥Sysprep」など)に配置しておけば、Mini-Setupを完全に自動化することが可能です。応答ファイル(Unattend.xml)のサンプルは、旧ブログ(外部サイト)にWindows 10向けのワークグループ構成とドメイン構成の両方のサンプルがあります。Windows 11でも問題なく使用できるはずです。以下の応答ファイルは、ワークグループ構成(ワークグループ名: WORKGROUP)、コンピューター名はランダム、ローカルユーザー「localuser」、パスワード「P@ssw0rd」、タイムゾーン「日本標準時(Tokyo Standard Time)」、表示・入力言語/システムロケール「日本語(ja-jp)」でWindows 11の一般化イメージを自動セットアップできます(画面11)。
この応答ファイルのサンプルはWindows 11 Evaluation日本語版向けであり、プロダクトキーの設定は含まれていません。製品版でプロダクトキーを自動設定したい場合は、「specialize」セクションのコンピューター名(ComputerName)の次の行に「<ProductKey>XXXXX-XXXXX-XXXXX-XXXXX-XXXXX</ProductKey>」の行を追加してください。
[Unattend.xml](プレーンテキストで表示)
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<settings pass="specialize">
<component name="Microsoft-Windows-Shell-Setup" 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">
<ComputerName>*</ComputerName>
</component>
<component name="Microsoft-Windows-UnattendedJoin" 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">
<Identification>
<JoinWorkgroup>WORKGROUP</JoinWorkgroup>
</Identification>
</component>
</settings>
<settings pass="oobeSystem">
<component name="Microsoft-Windows-Shell-Setup" 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">
<OOBE>
<HideEULAPage>true</HideEULAPage>
<HideLocalAccountScreen>true</HideLocalAccountScreen>
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
<ProtectYourPC>3</ProtectYourPC>
</OOBE>
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Password>
<Value>P@ssw0rd</Value>
<PlainText>true</PlainText>
</Password>
<Group>Administrators</Group>
<Name>localuser</Name>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
<TimeZone>Tokyo Standard Time</TimeZone>
</component>
<component name="Microsoft-Windows-International-Core" 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">
<InputLocale>ja-JP</InputLocale>
<SystemLocale>ja-JP</SystemLocale>
<UILanguage>ja-JP</UILanguage>
<UserLocale>ja-JP</UserLocale>
</component>
</settings>
</unattend>
画面11 一般化イメージに「C:¥unattend.xml」を配置しておくことで、Mini-Setupを完全に自動化できる
Windows 11 バージョン 24H2 の場合(10.3 追記)
2024年10月1日(米国時間)、Windows 11バージョン24H2が正式にリリースされました。上記手順でWindows 11バージョン24H2のテンプレートを作成しようとした場合、Syspepは失敗します。これは、Windows 11バージョン24H2でOSドライブのBitLockerドライブ暗号化が既定でオンになる仕様に変更されたことの影響です。C:¥Windows¥System32¥Sysprep¥Panther¥setupact.logを確認すると、BitLockerがオンになっていることが原因でSysprepが失敗したことが記録されています(画面12)。
画面12 Windows 11バージョン24H2では、OSドライブのBitLockerドライブ暗号化が既定でオンになった。その影響でSysprepが失敗するように
この問題を回避するには、コマンドプロンプトで以下のコマンドラインを実行し、C:ドライブの暗号化をオフにし、暗号化が完全に解除されたことを確認してから、Sysprepを実行してください(画面13)。なお、Sysprepで一般化したイメージをデプロイしても、BitLockerドライブ暗号化はオフのままです。必要に応じて手動で有効化してください。
manage-bde -off C:
manage-bde -status C:
画面13 BitLockerドライブ暗号化をオフにし暗号化が完全に解除されたあとに Sysprep を実行する
・ ・ ・
“ラボ環境 in オンプレを作る”シリーズは今回でひとまず最後になります。何か新しいことがあれば続編として再登場するでしょう。ここまでの目次を以下にまとめておきました。この連載では、Hyper-Vの入れ子になった仮想化(Nested Virtualization)を評価、検証環境のために使用していますが、オンプレミス、Azureの両方とも、Hyper-Vの入れ子になった仮想化は、いくつかのシナリオおよび制約(Azure VMではNATネットワークを使用など)の下、運用環境での使用がサポートされていることを最後に付け加えておきます。
“次のシナリオでは、運用環境での入れ子になった Hyper-V VM の使用が、Azure とオンプレミスの両方でサポートされています。 また、サービスとアプリケーションもサポートされていることを確認することをお勧めします。”
入れ子になった仮想化の概要(Microsoft Learn)
Azure 仮想マシンに対する Microsoft サーバー ソフトウェアのサポート(Microsoft Learn)