アプリケーション仮想化 MSIX App Attach を試す!

ついにGAしたので、「MSIX App Attach」を試したいと思います!
MSIX App Attachとは、セッションホストに対して、アプリケーションを配信する機能を提供します。使い所としては、マスターイメージに対し、事前にアプリケーションをインストールしておく必要が無くなり、セッションホスト展開後に必要なアプリケーションを指定したユーザーに配信する事ができるようになります。

ユーザーがサインインしたタイミングで、許可されたアプリケーションがマウントされます。
※機能的にはFSLogixと似ていますが、関連はありません。

【MSIX App Attach を設定するための流れ】

①アプリケーションの準備
②MSIX Packaging Tool を使い、アプリケーションからMSIX Package化を行う。
③msixmgr tool を使い、MSIX PackageからMSIX Image化を行う。
④MSIX Imageをファイルサーバーに配置し、セッションホストに配信する。
※セッションホストにも証明書のインストールが必要

[MSIX Package内のファイル(一部)]

AppxManifest.xml:MSIXアプリの基本情報(DisplayName / Description / EntryPoint / Logo / Language / TargetDevice)。パッケージ化の際に入力した情報が含まれている。

AppxBlockMap.xml:アプリケーションが利用するファイルの一覧とパッケージに格納されている各データブロックのインデックスと暗号化ハッシュ値が含まれている。

AppxSignature.p7x:パッケージに署名するときに生成される。すべてのMSIXパッケージは、署名されている必要がある。

Registry.dat:[HKEY_LOCAL_MACHINE\SOFTWARE]以下を保持

【考慮事項】

・Windows 10 2004以降 Single/Multi-session 対応 ※Server OS は未対応
・パッケージ化には証明書が必須 ※自己署名証明書でもOK
・パッケージ化後のアップデートは未サポート
・アプリケーションディレクトリ内に書き込みを行うアプリは未サポート
・未サポート:ドライバー、VPNクライアント、Active-X、アンチウイルスソフト
・ストレージ要件:[サインイン:10 IOPS / 通常:1 IOPS][Latency 400 ms][64k Block]
・ストレージはセッションホストと同じリージョンにすること
・WVD以外でも利用可能だが、PowerShellを駆使する必要がある


全体の流れ

Step1:作業用VMの作成
Step2:自己署名証明書の作成
Step3:アプリケーションのMSIXパッケージ化 [.msix]
Step4:セッションホストへの証明書インストール
Step5:MSIXパッケージのMSIXイメージ化 [.vhdx][.cim]
Step6:ホストプールへの配信設定

今回は「Visual Studio Code」をMSIXイメージ化(VHDX)して配信します。
※CimFSは次回試します~


Step1:作業用VMの作成

MSIXパッケージ作成環境
・Windows 10 1809 以降 ※配信するセッションホストと同じOSバージョンを推奨
・余計なアプリケーションやサービスが存在しないこと
・各種自動アップデートを停止していること
・インストール済みアプリケーションのパッケージ化は、事前にアンイストールを行うこと
・VHDXファイルを扱うため、Hyper-V(役割)が必要

各種自動アップデートを停止します。

reg add HKLM\Software\Policies\Microsoft\WindowsStore /v AutoDownload /t REG_DWORD /d 0 /f

Schtasks /Change /Tn “\Microsoft\Windows\WindowsUpdate\Scheduled Start” /Disable

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager /v PreInstalledAppsEnabled /t REG_DWORD /d 0 /f

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\Debug /v ContentDeliveryAllowedOverride /t REG_DWORD /d 0x2 /f

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
※Hyper-Vの有効化。再起動あり


Step2:自己署名証明書の作成

※作業用VMで行います。赤字は適宜変更して下さい。

【自己署名証明書の作成】

New-SelfSignedCertificate -Type Custom -Subject “CN=MSIX App Attach” -KeyUsage DigitalSignature -NotAfter (Get-Date).AddYears(10) -CertStoreLocation “Cert:\CurrentUser\My” -TextExtension @(“2.5.29.37={text}1.3.6.1.5.5.7.3.3”, “2.5.29.19={text}”)

証明書が作成されている

【 証明書の出力 】

$password = ConvertTo-SecureString -String “password” -Force -AsPlainText

Export-PfxCertificate -cert “Cert:\CurrentUser\My\CA59698AFA~” -FilePath “C:\MSIX.pfx” -Password $password
※MSIXパッケージ インストール用

Export-Certificate -cert “Cert:\CurrentUser\My\CA59698AFA~” -FilePath “C:\MSIX.cer
※セッションホスト インストール用


Step3:アプリケーションのMSIXパッケージ化

※作業用VMで行います。

Microsoft Store から[MSIX Packaging Tool]を検索し、インストールします。

MSIX Packaging Tool を起動し、[アプリケーションパッケージ]を選択

パッケージを作成するインストーラーを選択してください:[.msi][.exe]を指定
署名の基本設定:[証明書(.pfx)を使用して署名する]を選択
証明書を参照:※Step2で作成した[MSIX.pfx]を指定
パスワード:エクスポート時に設定したパスワード

パッケージ名:※ユーザーには表示されない
パッケージの表示名:※スタートメニューに表示される
発行元の表示名:※ユーザーに表示される
バージョン:素直にバージョンを入力

自動的にインストーラーが実行されるので、インストールします。

一度、実行し必要な設定(日本語化など)を行う。

インストール終了後、自動アップデートを無効に設定します。
※MSIXパッケージ化後のアップデートをサポートしていません。

再起動が必要なアプリケーションの場合は「再起動」を実施します。

エントリーポイント(実行ファイル)のパスが表示されます。
表示されない場合は、手動で[.exe]のパスを指定して下さい。
※インストール済みアプリをパッケージ化した場合は表示されない。

パッケージから除外したいアプリケーションを選択します。
※なにも表示されない場合はスルー

パッケージファイルの保存場所を指定します。

パッケージ化されたアプリケーションが確認できます。


Step4:セッションホストへの証明書インストール

※展開済みのセッションホストかマスターイメージにて実施

Step2で作成した[MSIX.cer]をセッションホストにインストールします。

[ローカルコンピューター]を選択

[証明書をすべて次のストアに配置する]ー[信頼されたユーザー]を選択

[完了]です。

証明書がインストールされている


Step5:MSIXパッケージのMSIXイメージ化

※作業用VMで行います。赤字は適宜変更して下さい。

New-VHD -SizeBytes 500MB -Path “C:\temp\VSCode_1.55.2.0_x64.vhdx” -Dynamic -Confirm:$false
※空のVHDXを作成。VHDXのサイズはパッケージ化したアプリの約5倍が目安。
※VHDX名は[アプリ名称+バージョン]がわかりやすい。

$vhdObject = Mount-VHD “C:\temp\VSCode_1.55.2.0_x64.vhdx” -Passthru
※作成したVHDXをマウント

$disk = Initialize-Disk -Passthru -Number $vhdObject.Number
※マウントしたVHDXを初期化

$partition = New-Partition -AssignDriveLetter -UseMaximumSize -DiskNumber $disk.Number
※フォーマットを促すポップアップは[キャンセル]します。
※空のVHDXにパーティションを作成

Format-Volume -FileSystem NTFS -Confirm:$false -DriveLetter $partition.DriveLetter -Force
※空のVHDXをNTFSフォーマット

マウントしたFドライブ直下にフォルダを作成。名前はなんでもよい。

ここから、作成した空のVHDXに対しMSIXパッケージを展開しイメージ化します。

msixmgr tool をダウンロード

解凍した[msixmgr.exe]と同じ階層にMSIXパッケージ化したアプリを配置

.\msixmgr.exe -Unpack -packagePath “VSCode_1.55.2.0_x64__dscwm6pdg8ty6.msix” -destination “F:\VSCode” -applyacls
※パッケージ化したアプリをVHDXに展開

$vhdObject = Dismount-VHDC:\temp\VSCode_1.55.2.0_x64.vhdx -Passthru
※最後にアンマウント

作成した[VSCode_1.55.2.0_x64.vhdx]をファイルサーバーに配置します。
※ユーザーアカウントとコンピューターオブジェクトに対して読み取り権限が必要


Step6:ホストプールへの配信設定

[MSIXイメージパス]の設定を行う際に、下記のようなチェックが入ります。

・MSIXイメージ内に証明書が存在すること
・セッションホストから、ファイルサーバー内のMSIXイメージにアクセスできること
・稼働している全てのセッションホストに証明書がインストールされていること
※停止しているセッションホストは対象外

MSIXイメージパス:ファイルサーバーのパスを指定
MSIXパッケージ:※自動入力
パッケージアプリケーション:※自動入力
表示名:※自動入力
登録の種類:オンデマンドを選択
状態:アクティブを選択

設定完了

【アプリケーショングループ設定】

MSIXイメージは、「デスクトップ配信」「リモートアップ配信」両方に対応しています。
・デスクトップ配信:OSにインストールされたような状態でデスクトップ画面が配信される。
・リモートアップ配信:通常のリモートアップ同様、アプリケーション画面が配信される。

[デスクトップ配信設定]

アプリケーションソース:※変更不可
MSIXパッケージ:※自動入力
アプリケーション名:※Azure Portalでの表示名
表示名:※ユーザーに表示される

[リモートアップ配信設定]

アプリケーションソース:※MSIXパッケージを選択
MSIXパッケージ:※自動入力
MSIXアプリケーション:※自動入力
アプリケーション名:※Azure Portalでの表示名
表示名:※ユーザーに表示される


それでは、接続してみましょう!

初回のMSIXパッケージをマウントするまでに時間が必要です。一度マウントすると、ユーザーサインアウト、セッションホストの再起動/停止を行ってもアンマウントされません。
WVD Client(ブラウザOK)での接続が必要。RDPでは利用できません。

このような感じで表示される。
※リモートアップ版は通常と同様の使い勝手です。

デスクトップにサインインすると、セッションホストにインストールしていないはずの
「Visual Studio Code」が確認できます。

Visual Studio CodeのMSIXイメージがマウントされている事が確認できます!
※複数のユーザーがサインインした場合でも、マウントするMSIXイメージは1つです。

セッションホストは、5分間隔でMSIX App Attachの更新確認を行っているため、MSIXイメージの[追加/削除]はこの間隔の影響を受けます。デフォルト5分間隔

[最短の1分間隔に変更する方法]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RDInfraAgent\MSIXAppAttach]
“PackageListCheckIntervalMinutes” = dword:00000001