MSIX app attachをAVDリファレンスアーキテクチャ上に構築

# はじめに
Azure Virtual Desktop(AVD)において、OSイメージとアプリケーションを分離して管理するために、[MSIX app attach](https://docs.microsoft.com/ja-jp/azure/virtual-desktop/app-attach)という技術があります。
実装の手順は、公式ガイドである[Docs](https://docs.microsoft.com/ja-jp/azure/virtual-desktop/app-attach)や[日本マイクロソフトのサポートのGitHubページ](https://jpwinsup.github.io/blog/2021/04/26/RemoteDesktopService/AVD/avd-how-to-deploy-msix-app-attach/)、また[牛上さんのページ](https://www.cloudou.net/windows-virtual-desktop/wvd030/)などがあります。
ここでは、システムとして実装するために、自己証明書は使わない[AVDリファレンスアーキテクチャ](https://qiita.com/takeokams/items/b292e35f8f8cc11c8bee)を活用します。

# 前提
[AVDリファレンスアーキテクチャ](https://qiita.com/takeokams/items/b292e35f8f8cc11c8bee)の環境

# 手順
## 作業用VMの展開
1. spoke-twoなどのVNetに、セッションホストと同じOSのVMを作成
2. ドメイン参加
3. 以後、管理者で作業

注意点: 再接続するとローカルになる。FSLogixのグループポリシーが効いてしまうと証明書作成が失敗するのでその場合は適用しないようにすること。

## 証明書テンプレートにコード署名を追加
PDCのVMの中で下記作業します。
1. Server ManagerのToolsメニューからCertification Authorityを起動
2. Certificate Templatesフォルダを右クリックして、Certificate Template for Issueを選択
3. Code Signingを追加
![cs-template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/4e5c3b84-7beb-706d-10c7-67bb20e44b65.png)

## 署名用鍵を作成
作業用VMで操作します。
1. MMCを起動して、ファイルメニューから証明書スナップインを追加
![mmc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/ab337ae9-2e14-46f0-b323-e3ff50584f4e.png)
2. 新しい証明書の要求を選択して、Active Directory登録ポリシーを選択 (出ないときはADユーザーでログインできていないかもしれません)
3. コード署名にチェックをして、プロパティから、秘密鍵をクスポート可能に設定
![cert-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/4dd84b5c-3e40-2771-a0f0-0d976831061f.png)
4. 作成した証明書を秘密鍵とともにエクスポート
![cert-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/c911f60d-b6e7-3c9d-fbef-1078b8efff1e.png)

## MSIX Packaging Toolを準備
作業用VM内に、MSIX Packaging Toolをインストールします。
Azure Firewall PremiumでInternetへのアクセスを閉じている場合は、アプリケーションルールに、Webカテゴリのコンピュータとテクノロジを、施業用VMからアクセスできるように追加しておきます。
1. Microsoft Storeでインストール
![tool-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/872de2c1-95f8-d67d-f43b-f4755c5d63d3.png)

## アプリケーションのパッケージ化
ここではVisual Studio Codeを利用します。
[ここ](https://code.visualstudio.com/download)から、システムインストーラーを作業用VM内にダウンロードしておきます。
[牛上さんのブログ](https://www.cloudou.net/windows-virtual-desktop/wvd030/)のStep 3そのままですので、そちらを参照してもよいです。
1. MSIX Packaging Toolを起動して、一番左のApplication packageを選択
2. 最初のCreate package on this computerを選択
3. Windows Searchを無効化
![packaging-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/be3eb3cb-e60b-2c4f-3e6c-c7fe30b9a4ae.png)
4. Visual Studio Codeのシステムインストーラーを指定、エクスポートした秘密鍵付きの証明書を指定
![packaging-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/47e427a6-d823-15d3-75d8-b4bd51bc5340.png)
5. Visual Studio Codeのパッケージ情報を指定
![packaging-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/12a96a98-8d39-6706-879f-aaaac0fa6222.png)
6. Visual Studio Codeをインストール
7. Visual Studio Codeのアップデートを無効化
![packaging-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/f22c9fce-007b-a8b9-3456-75d8a149148b.png)
8. MSIX Packaging Toolのウィザードをそのまま実施してパッケージを作成

## MSIXMGRツールの準備
ほぼ、[CSSのページ](https://jpwinsup.github.io/blog/2021/04/26/RemoteDesktopService/AVD/avd-how-to-deploy-msix-app-attach/#MSIX-%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8-%E3%82%92-MSIX-app-attach-%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AB%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B)と同様の作業になります。
1. [MSIX mgr tool](https://aka.ms/msixmgr)を作業用VMにダウンロード
2. Zipファイルを展開して、x64フォルダを`C:\MSIXappattach`として移動
3. 作成したMSIXパッケージを`C:\MSIXappattach`に移動

## VHD化
パッケージを配信するために、VHDファイルにまとめます。
VHDを操作するコマンドレットのために、最初のみHyper-Vを作業用VMにセットします。

```powershell
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
```

VHDファイルにパッケージを展開します。

VHDファイルを作成

```powershell
New-VHD -SizeBytes 1024MB -Path c:\MSIXappattach\VSCode_1.58.0.0_x64.vhdx -Dynamic -Confirm:$false
```

マウント

```powershell
$vhdObject = Mount-VHD c:\MSIXappattach\VSCode_1.58.0.0_x64.vhdx -Passthru
```

初期化、パーティションの作成、フォーマット
Exploreからフォーマットを促す画面が出ますが、キャンセル

```powershell
$disk = Initialize-Disk -Passthru -Number $vhdObject.Number
$partition = New-Partition -AssignDriveLetter -UseMaximumSize -DiskNumber $disk.Number
Format-Volume -FileSystem NTFS -Confirm:$false -DriveLetter $partition.DriveLetter -Force
```

フォルダを作成して、パッケージを展開

```powershell
New-Item F:\VSCode -ItemType Directory
cd C:\MSIXappattach
.\msixmgr.exe -Unpack -packagePath .\VSCode_1.58.0.0_x64__f0yfp0x2dcyvj.msix -destination "F:\VSCode" -applyacls
$vhdObject = Dismount-VHD C:\MSIXappattach\VSCode_1.58.0.0_x64.vhdx -Passthru
```

## VHDファイルをファイルサーバーに配置
Azure Filesの共有をマウント

```powershell
# Azure Filesのストレージ名
$StorageAccountName = "takeokast"
# 異なる名前で共有名を設定している場合は置き換える必要あり
$share_name = "avdfileshare"
# Azure Portalで、ストレージアカウントのアクセスキーを確認し置き換える必要あり
# パスワードにはADのポリシーにより有効期限がある場合があり、https://docs.microsoft.com/ja-jp/azure/storage/files/storage-files-identity-ad-ds-update-passwordを事前に参照して運用を検討する必要あり
$st_key = "access_key"
# ローカルでマウントするドライブレター
$mount_drv = "Z"

$unc_path = "\\" + $StorageAccountName + ".file.core.windows.net\" + $share_name
$net_account = "Azure\" + $StorageAccountName

$securePass = ConvertTo-SecureString $st_key -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential $net_account, $securePass

New-PSDrive -Name $mount_drv -PSProvider FileSystem -Root $unc_path -Credential $cred
```

コピー

```powershell
$folder_path = $mount_drv + ':\' +'MSIX'
copy .\VSCode_1.58.0.0_x64.vhdx $folder_path
```

アンマウント

```powershell
Remove-PSDrive -Name $mount_drv
```

## セッションホストからのAzure Filesアクセス権設定
[セッションホストに必要なファイル共有へのアクセス権限](https://docs.microsoft.com/ja-jp/azure/virtual-desktop/app-attach-file-share#how-to-set-up-the-file-share)を設定します。
AVDのリファレンスアーキテクチャを利用する場合、セッションホストのコンピュータオブジェクトを`AZF FSLogix Contributor`に追加することで、必要な権限が与えられます。
この作業は、PDC VMの中で、セッションホストのコンピュータオブジェクトを選択してグループに追加すると簡単にできます。
![session-right.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/3eab69e1-d453-eacd-0b4c-841699b79257.png)

## MSIXパッケージをホストプールに追加
AVDのホストプールから、コピーしたMSIXイメージをUNCパスで指定し、表示名を設定して、アクティブに設定します。
![package-add-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/e56ca1f5-f5c5-6ec0-b1fb-fedd48e89bfd.png)

## アプリケーショングループ作成
デスクトップにも配信できますが、Remote Appとして設定してみます。
![remote-app-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/834a1be0-f6d3-9009-8841-1c442f5b812c.png)
![remote-app-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/c77b2f33-0460-d011-4855-22d91633942a.png)
この後は、ユーザー、ワークスペースの割り当てを行います。

## 利用確認
起動すると見た目にはローカルで起動したのと変わりありませんが、タスクバーのアイコンがリモートデスクトップ接続であることを示しています。
![remote-app-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/4f9e9c54-65d9-486a-f338-b3711fa77f9a.png)

# 参考
- [日本マイクロソフト サポートチームのMSIX app attach の構築手順](https://jpwinsup.github.io/blog/2021/04/26/RemoteDesktopService/AVD/avd-how-to-deploy-msix-app-attach/)
- [牛上さんブログ](https://www.cloudou.net/windows-virtual-desktop/wvd030/)