Windows Server 2022 (Azure VM) の日本語化イメージを用意する Azure VM Image Builder / sysprep

# Windows Server を 日本語化 する
Windows Server を 日本語化 するのって結構時間もかかるし、面倒な感じです。
日本語化した VM イメージを作成しておき、日本語での利用が可能な VM をすぐデプロイできるようにしておきたいと思います。


# 基本 - デプロイ済み VM を 日本語化する
とはいえ、
　イメージ作成なんて面倒、すぐ使える方法は…？
　まずは目の前の VM 1台をいますぐ日本語化したいんだけど？
なんて時もあるかと思います。

そんなとき、 [@tksh164 さん](https://github.com/tksh164/change-windows-language-regional-settings) のスクリプトが非常に便利です。

https://github.com/tksh164/change-windows-language-regional-settings

https://github.com/tksh164/change-windows-language-regional-settings

直接、日本語化済みの Windows Server 2022 Datacenter をデプロイすることや、Windows Server 2019/2022 を日本語化するための PowerShell スクリプト が公開されています。
素晴らしい。

|  | 日本語化済み VM をデプロイする | VM を日本語化するスクリプト |
|:-:|:-:|:-:|
| URL | [Azure デプロイ可能版（PowerShell DSE）](https://github.com/tksh164/azure-demo-scripts-templates/tree/master/arm-templates/win-lang-region-config ) | [PowerShell版](https://github.com/tksh164/change-windows-language-regional-settings ) |
| 概要 | 日本語化された VM を１台だけデプロイしたいというときは、こちらの GitHub からデプロイをすれば、OKです。<br>デプロイには多少時間がかかりますが、非常に楽です。|  デプロイ済みの VM を日本語化したいということであれば、この日本語化スクリプトを実行することで、日本語化できます。 |
| 実行例（展開してください） |  <details><summary> 実行例　</summary> Github の デプロイボタンからデプロイを行います。 <br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/92995f26-8201-0653-0712-262af0a3bf08.png) <br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/a35642e9-0f46-3750-0500-98dba52a1c65.png)<br> デプロイにかかる時間は 20分程度でした。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/a0f76252-3738-a99d-ada6-b00ef74d9b8f.png)<br> ログインしてみます。 <br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/05a57149-3aa5-199c-09b8-fb48ecffc8f9.png) <br>日本語化済みの Windows Server 2022 DataCenter Gen2 が起動します。 <br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/6eed0cea-d7f2-7875-7305-c39bcabfc5be.png)<br> </details>   |  <details><summary> 実行例　</summary><br> 途中で再起動が必要なスクリプトなので、２回に分けて実行します<br><br> １回目は 161行目までを実行します。<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/0c101e99-15c4-47e8-cb10-bde19c1aac1b.png)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/009bc68f-99d4-4ab8-5c14-70ec98c4b384.png) <br> ２回目は、161行目以降から最終行までを実行します。<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/a41a9832-283a-01ac-e641-e9b031a273ff.png)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/9f1b1e87-11ac-1f9d-86d4-72c38aabd9ff.png)<br><br> 日本語化されていることが確認できます。 <br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/cc9831a5-3937-7887-54ca-51e8a4135ed1.png)<br> </details>  |


# Azure VM Image Builder で Windows Server 2022 を 日本語化 する
[@tksh164 さん](https://github.com/tksh164/change-windows-language-regional-settings) の PowerShell スクリプトを少し改変したものを用意して、Azure VM Image Builder で利用可能にしてみました。

https://github.com/uedait/change-windows-language-regional-settings-ImageBuilder

PowerShell の スクリプト が2つありますので、Azure VM Image Builder で 2つとも実行するように構成すれば OK です。

- https://raw.githubusercontent.com/uedait/change-windows-language-regional-settings-ImageBuilder/main/change-ws2022-lang-ja-step1.ps1
- https://raw.githubusercontent.com/uedait/change-windows-language-regional-settings-ImageBuilder/main/change-ws2022-lang-ja-step2.ps1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/02bd1119-57e8-35d2-d37a-e34060120b29.png)



なお、Azure VM Image Builder については、以下で紹介されている内容が参考になります。

- [Azure Portal 対応の Azure VM Image Builder を試し隊](https://www.kentsu.website/2023/04/02/azure-portal-%e5%af%be%e5%bf%9c%e3%81%ae-azure-image-builder-%e3%82%92%e8%a9%a6%e3%81%97%e9%9a%8a/)
- [Azure VM Image BuilderがGUI対応していたらしいので試す](https://zenn.dev/microsoft/articles/6dca45e20e560f)


それでは Azure VM Image Builder での Windows Server 2022 の日本語化を試してみます。
手順は、概ね以下のようになります。
<details><summary> マネージドID の作成と権限の付与　</summary> 

マネージドID を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/b9bf1fac-edaf-aac4-051c-f23451ae926b.png)

マネージドID に対して、ImageBuilder を作っていく リソースグループ への権限を付与します。
カスタムロール を作成することもできますが、今回は雑に、共同作成者権限を付与しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/1cc238e2-45a8-aa54-f491-65b8addfd154.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/783669da-397a-1aca-d228-1b80e4f1032f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/df58ab17-a9ef-9568-cc3c-ead8fcebad9a.png)



</details>
<details><summary> イメージテンプレートの作成　</summary> 

[イメージテンプレート] を検索し、新規に作成していきます。
[イメージ] を選択する際、 Windows Server 2022 のものを選択します。
 選択肢が多いのですが、間違って Core (GUIなし) のものを選択したりしないようにしてください…
また、 [ギャラリー] や [VM イメージ定義] も、ここで新規作成が可能です。
最後に、十分な権限を持つ マネージドID との関連付けも行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/ec26e97b-f994-110e-ce0f-e815449277f3.png)


[カスタマイズ] のタブで、PowerShell スクリプトを実行するように構成します。
以下2つのスクリプトを順番に実行するように構成します。
[Script Source URL] のところにそのまま張り付ければ大丈夫なはずです。

https://raw.githubusercontent.com/uedait/change-windows-language-regional-settings-ImageBuilder/main/change-ws2022-lang-ja-step1.ps1
https://raw.githubusercontent.com/uedait/change-windows-language-regional-settings-ImageBuilder/main/change-ws2022-lang-ja-step2.ps1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/950e5c6f-ba09-6fd5-e89f-40e2038d2582.png)


</details>

<details><summary> ビルドする　</summary> 
イメージテンプレートが作成された後は、ビルドを行います。

1時間程度かかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/3e26257c-c66d-f50a-305f-01552eed3997.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/273da6cc-ab0f-63bf-034e-53ecbdef41a0.png)

</details>

<details><summary> VM を作成して確認　</summary> 
ビルドが完了したら、VM を作成して確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/10406723-227b-ec36-e1d4-42f255253ec0.png)

ログインしてみると、Windows Modules Installer の処理が始まります。
それなりに時間（ 5-8 分)がかかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/19ad6ec7-9758-8ef9-c2fb-20d54dbb09af.png)

日本語化されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/bf53c0cd-8990-d11f-08fb-7a94794fdb7e.png)
</details>


# Sysprep + Azure Portal から VM をキャプチャして Windows Server 2022 日本語化イメージを作成する

日本語化した VM が既にある場合には、そちらを Sysprep で一般化して、使いまわすこともできます。
今回は日本語化しただけの ほぼクリーンな Windows Server で試していますが、既にある程度サーバー役割を持たせている場合（あまりないかとは思いますが）には、以下も参照して Sysprep が可能なのかどうかも確認する必要があります。

https://learn.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/sysprep-support-for-server-roles?view=windows-11

さて、Sysprep + Azure Portal から VM をキャプチャ の手順は概ね以下の通りです。

<details><summary> 日本語化済みVM を sysprep で 一般化 する　</summary>
 
sysprep する方法は [公開ドキュメント](https://learn.microsoft.com/ja-jp/azure/virtual-machines/generalize#windows )に記載があります。

抜粋すると概ね以下の順序です。 公開ドキュメント内の 手順5 までは、PowerShell ではなく cmd での実行なので注意です。
最後の　”仮想マシンのステータスを [一般化] に設定”　は、 Azure Portal 上から Cloud Shell で実施すれば OK です。

> 3.panther ディレクトリ (C:\Windows\Panther) を削除します。
```cmd.exe
rmdir /s /q C:\Windows\Panther
```

> 5.次に、ディレクトリを %windir%\system32\sysprep に変更して、次を実行します。
```cmd.exe
cd %windir%\system32\sysprep
sysprep.exe /oobe /generalize /mode:vm /shutdown
```

sysprep (5.まで) を実施すると、VM はシャットダウンされ、Azure VM の状態は [停止済み] となります。
VM は再起動せず、続けて、CloudShell から以下を実施していきます。

> Sysprep が完了したら、仮想マシンのステータスを [一般化] に設定します。

```Azure PowerShell.
Set-AzVm -ResourceGroupName $rgName -Name $vmName -Generalized
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/ed18c0f2-d2dc-33df-cc4a-a2f51c6f9633.png)

</details>
<details><summary> Azure Portal から VM をキャプチャ </summary>

こちらも、[公開ドキュメント](https://learn.microsoft.com/ja-jp/azure/virtual-machines/capture-image-portal )があります。
なお、VMイメージの作成と sysprep は別ですので、最初に sysprep してからキャプチャしましょう。

> Azure Compute Gallery (旧称 Shared Image Gallery) に格納されているイメージの場合、アカウントが既に作成されている VM を使用することも (特殊化)、イメージを作成する前に VM を一般化して、マシン アカウントや他のマシン固有の情報を削除することもできます。

一般化まで済ませた VM で キャプチャ を開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/f1abb454-a489-4587-506a-26ce9db88e88.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/ae5d4fe3-28c1-3386-2bd9-de107217c6c8.png)

10分程度 で、VM イメージ バージョン が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/8f5ccb6b-de0a-6bf3-2689-50719689f77d.png)

</details>
<details><summary> VM を作成して確認 </summary>

VM を作成して確認してみます。
なお、作成したイメージは、[共有イメージ] の中にありますので、ここから選択してデプロイすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/49a61e4f-433b-e46d-df71-5069587b3fc4.png)

日本語化されています。
なお、こちらは 1分 とかからず ログイン でき、Azure Image Builder よりも素早く利用を開始できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/6f0f692d-7542-3111-b8ab-3e7ecd6f12c1.png)

</details>

# まとめ
それぞれ実施してみた感想など、まとめておきます。
なお、所要時間はあくまでも私の手元で試した限りで、デプロイする VM の SKU 等でも当然違ってくるかと思います。

|| Azure Image Builder | Sysprep + キャプチャ |
|:-:|:-:|:-:|
| 日本語化 + Sysprep + イメージ作成の手間 | ビルドボタンを押せば、あとは自動 | 手動 |
| イメージ作成　所要時間 | 1時間程度 | Sysprep 2-3分、キャプチャ 10分程度 <br>(日本語化にかかる時間を除く) |
| VM初回ログイン　所要時間  | 5-8 分程度 | 数十秒程度 |
| メリット  | イメージ作成の手間がかからない。<br>KBが出た後などイメージが更新された場合でも、手間なくビルドして、最新の日本語化イメージを用意しておける。 | 初回ログインの際の「Windows Modules Installer」の処理が無く、初回ログインの所要時間が短い。VMデプロイ後、すぐに検証を開始できる。 |

Azure Image Builder で　Windows Modules Installer　の処理を省く方法があればいいのですが、ちょっと見つけられませんでした。
何か情報があれば教えてください。

何かのお役に立てば。


# 参考

https://github.com/tksh164/azure-demo-scripts-templates/tree/master/arm-templates/win-lang-region-config

https://github.com/tksh164/change-windows-language-regional-settings

https://www.kentsu.website/2023/04/02/azure-portal-%e5%af%be%e5%bf%9c%e3%81%ae-azure-image-builder-%e3%82%92%e8%a9%a6%e3%81%97%e9%9a%8a/

https://zenn.dev/microsoft/articles/6dca45e20e560f

https://hack-life.hatenablog.com/entry/azure-how-to-sysprep