次の方法で共有


App Attach の MSIX パッケージをテストする

この記事では、Azure Virtual Desktop の外部で MSIX パッケージをマウントして、アプリアタッチのパッケージをテストする方法について説明します。 App Attach を機能する API は、Windows 11 EnterpriseとWindows 10 Enterpriseで使用できます。 これらの API は、テストのために Azure Virtual Desktop の外部で使用できますが、Azure Virtual Desktop の外部には App Attach 用の管理プレーンはありません。

App Attach の詳細については、「 Azure Virtual Desktop でのアプリアタッチ」を参照してください。

前提条件

この記事の指示に従ってパッケージをテストする前に、次のものが必要です。

この記事では、Azure Virtual Desktop の外部でテストするプロセスについて説明しているため、Azure Virtual Desktop のデプロイは必要ありません。

注:

Microsoft サポートでは CimDiskImage PowerShell モジュールがサポートされていないため、問題が発生した場合は、モジュールの GitHub リポジトリで要求を送信する必要があります。

フェーズ

Azure Virtual Desktop の外部で MSIX パッケージを使用するには、次の順序で実行する必要がある 4 つの異なるフェーズがあります。

  1. ステージ
  2. 登録
  3. 登録解除
  4. ステージ解除

ステージングとデタグ付けはマシン レベルの操作ですが、登録と登録解除はユーザー レベルの操作です。 使用する必要があるコマンドは、使用している PowerShell のバージョンと、ディスク イメージが CimFSVHDX、VHD 形式のいずれであるかによって異なります。

注:

すべての MSIX パッケージには証明書が含まれています。 MSIX パッケージの証明書が環境内で信頼されていることを確認する責任があります。

MSIX パッケージのステージングを準備する

ステージング スクリプトは、MSIX パッケージを受け取るためにマシンを準備し、関連するパッケージをコンピューターにマウントします。

使用している PowerShell のバージョンに関連するタブを選択します。

PowerShell 6 以降を使用してパッケージをステージングするには、ステージング操作の前に次のコマンドを実行して、Windows ランタイム パッケージの機能を PowerShell に取り込む必要があります。

  1. 管理者として PowerShell プロンプトを開きます。

  2. 次のコマンドを実行して、Windows ランタイム パッケージをダウンロードしてインストールします。 次のコマンドは、コンピューターごとに 1 回だけ実行する必要があります。

    #Required for PowerShell 6 and later
    $nuGetPackageName = 'Microsoft.Windows.SDK.NET.Ref'
    Register-PackageSource -Name MyNuGet -Location https://www.nuget.org/api/v2 -ProviderName NuGet
    Find-Package $nuGetPackageName | Install-Package
    
  3. 次に、次のコマンドを実行して、Windows ランタイム コンポーネントを PowerShell で使用できるようにします。

    #Required for PowerShell 6 and later
    $nuGetPackageName = 'Microsoft.Windows.SDK.NET.Ref'
    $winRT = Get-Package $nuGetPackageName
    $dllWinRT = Get-ChildItem (Split-Path -Parent $winRT.Source) -Recurse -File WinRT.Runtime.dll
    $dllSdkNet = Get-ChildItem (Split-Path -Parent $winRT.Source) -Recurse -File Microsoft.Windows.SDK.NET.dll
    Add-Type -AssemblyName $dllWinRT.FullName
    Add-Type -AssemblyName $dllSdkNet.FullName
    

MSIX パッケージをステージングする

MSIX パッケージをステージングするマシンを準備したら、ディスク イメージをマウントしてから、MSIX パッケージのステージングを完了する必要があります。

ディスク イメージをマウントする

ディスク イメージをマウントするプロセスは、ディスク イメージに CimFsVHDX、または VHD 形式のどちらを使用しているかによって異なります。 使用している形式の関連タブを選択します。

CimFS ディスク イメージをマウントするには:

  1. 同じ PowerShell セッションで、次のコマンドを実行します。

    $diskImage = "<Local or UNC path to the disk image>"
    
    $mount = Mount-CimDiskImage -ImagePath $diskImage -PassThru -NoMountPath
    
    #We can now get the Device Id for the mounted volume, this will be useful for the destage step.
    $deviceId = $mount.DeviceId
    Write-Output $deviceId
    
  2. 変数は $deviceIdのままにします。 この情報は、この記事の後半で必要になります。

  3. 完了したら、「 ディスク イメージのステージングを完了する」に進みます。

ディスク イメージのステージングを完了する

最後に、すべてのイメージ形式に対して次のコマンドを実行して、ディスク イメージのステージングを完了する必要があります。 このコマンドでは、前のセクションでディスク イメージをマウントしたときに作成した $deviceId 変数を使用します。

  1. 同じ PowerShell セッションで、次のコマンドを実行してアプリケーション情報を取得します。

    $manifest = Get-ChildItem -LiteralPath $deviceId -Recurse -File AppxManifest.xml
    $manifestFolder = $manifest.DirectoryName
    
  2. MSIX パッケージの完全な名前を取得し、次のコマンドを実行して変数に格納します。 この変数は、後の手順で必要になります。

    $msixPackageFullName = $manifestFolder.Split('\')[-1]
    Write-Output $msixPackageFullName
    
  3. 次のコマンドを実行して、Package Manager API のマニフェスト フォルダーの絶対 URI を作成します。

    $folderUri = $maniFestFolder.Replace('\\?\','file:\\\')
    $folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri
    
  4. 絶対 URI を使用して、次のコマンドを実行してアプリケーション パッケージをステージングします。

    $asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object { $_.ToString() -eq 'System.Threading.Tasks.Task`1[TResult] AsTask[TResult,TProgress](Windows.Foundation.IAsyncOperationWithProgress`2[TResult,TProgress])' })[0]
    $asTaskAsyncOperation = $asTask.MakeGenericMethod([Windows.Management.Deployment.DeploymentResult], [Windows.Management.Deployment.DeploymentProgress])
    
    $packageManager = New-Object -TypeName Windows.Management.Deployment.PackageManager
    
    $asyncOperation = $packageManager.StagePackageAsync($folderAbsoluteUri, $null, "StageInPlace")
    
  5. 次のコマンドを実行して、アプリケーション パッケージのステージングの進行状況を監視します。 パッケージのステージングにかかる時間は、そのサイズによって異なります。 ステージングが完了すると、$stagingResult変数の Status プロパティがRanToCompletionされます。

    $stagingResult = $asTaskAsyncOperation.Invoke($null, @($asyncOperation))
    
    while ($stagingResult.Status -eq "WaitingForActivation") {
        Write-Output "Waiting for activation..."
        Start-Sleep -Seconds 5
    }
    
    Write-Output $stagingResult
    

MSI パッケージがステージングされたら、MSIX パッケージを登録できます。

MSIX パッケージを登録する

MSIX パッケージを登録するには、同じ PowerShell セッションで次のコマンドを実行します。 このコマンドでは、前のセクションで作成した $msixPackageFullName 変数を使用します。

$manifestPath = Join-Path (Join-Path $Env:ProgramFiles 'WindowsApps') (Join-Path $msixPackageFullName AppxManifest.xml)
Add-AppxPackage -Path $manifestPath -DisableDevelopmentMode -Register

MSIX パッケージが登録されたので、アプリケーションをセッションで使用できるようになります。 これで、テストとトラブルシューティングのためにアプリケーションを開くことができます。 完了したら、MSIX パッケージの登録を解除して破棄する必要があります。

MSIX パッケージの登録を解除する

MSIX パッケージの使用が完了し、削除する準備ができたら、まず登録を解除する必要があります。 MSIX パッケージの登録を解除するには、同じ PowerShell セッションで次のコマンドを実行します。 これらのコマンドは、ディスクの DeviceId パラメーターをもう一度取得し、前のセクションで作成した $msixPackageFullName 変数を使用してパッケージを削除します。

$appPath = Join-Path (Join-Path $Env:ProgramFiles 'WindowsApps') $msixPackageFullName
$folderInfo = Get-Item $appPath
$deviceId = '\\?\' + $folderInfo.Target.Split('\')[0] +'\'
Write-Output $deviceId #Save this for later

Remove-AppxPackage $msixPackageFullName -PreserveRoamableApplicationData

MSIX パッケージを破棄する

最後に、MSIX パッケージを破棄するには、ディスク イメージをマウント解除する必要があります。同じ PowerShell セッションで次のコマンドを実行して、パッケージが引き続きユーザーに登録されていないことを確認します。 このコマンドでは、前のセクションで作成した $msixPackageFullName 変数を使用します。

Remove-AppxPackage -AllUsers -Package $msixPackageFullName -ErrorAction SilentlyContinue

ディスク イメージのマウントを解除する

デスタッグ プロセスを完了するには、ディスクをシステムからマウント解除する必要があります。 使用する必要があるコマンドは、ディスク イメージの形式によって異なります。 使用している形式の関連タブを選択します。

CimFS ディスク イメージをマウント解除するには、同じ PowerShell セッションで次のコマンドを実行します。

Dismount-CimDiskImage -DeviceId $deviceId

ディスクのマウントを解除したら、MSIX パッケージを安全に削除しました。

App Attach エージェントのシミュレーション スクリプトを設定する

MSIX パッケージをデバイスに自動的に追加および削除する場合は、この記事の PowerShell コマンドを使用して、起動時、ログオン、ログオフ、シャットダウン時に実行されるスクリプトを作成できます。 詳細については、「グループ ポリシーでのスタートアップ、シャットダウン、ログオン、ログオフ スクリプトの使用」を参照してください。 各フェーズに必要な変数が各スクリプトで使用できることを確認する必要があります。

各フェーズのスクリプトを作成します。

  • スタートアップ スクリプトは 、ステージ プロセスを実行します。
  • ログオン スクリプトは 、登録 プロセスを実行します。
  • ログオフ スクリプトは 登録解除 プロセスを実行します。
  • シャットダウン スクリプトは 、destage プロセスを実行します。

注:

タスク スケジューラを使用して、ステージ スクリプトを実行できます。 スクリプトを実行するには、タスク トリガーを [コンピューターの起動時] に設定し、[ 最高の特権で実行] を有効にします。

パッケージをオフラインで使用する

インターネットに接続されていないデバイスでパッケージを使用している場合は、アプリを正常に実行するために、パッケージ ライセンスがデバイスにインストールされていることを確認する必要があります。 デバイスがオンラインの場合は、必要なライセンスが自動的にダウンロードされます。

ライセンス ファイルをインストールするには、WMI ブリッジ プロバイダーで MDM_EnterpriseModernAppManagement_StoreLicenses02_01 クラスを呼び出す PowerShell スクリプトを使用する必要があります。

オフラインで使用するライセンスを設定する方法を次に示します。

  1. アプリ パッケージ、ライセンス、および必要なフレームワークをビジネス向け Microsoft Storeからダウンロードします。 エンコードされたライセンス ファイルとエンコードされていないライセンス ファイルの両方が必要です。 オフライン ライセンスアプリをダウンロードする方法については、「オフライン アプリの 配布」を参照してください。

  2. 管理者として次の PowerShell コマンドを実行します。 ライセンスはステージング フェーズの最後にインストールできます。 次の変数を編集する必要があります。

    • $contentID は、コード化されていないライセンス ファイル (.xml) の ContentID 値です。 任意のテキスト エディターでライセンス ファイルを開くことができます。

    • $licenseBlob は、エンコードされたライセンス ファイル (.bin) 内のライセンス BLOB の文字列全体です。 エンコードされたライセンス ファイルは、任意のテキスト エディターで開くことができます。

      $namespaceName = "root\cimv2\mdm\dmmap"
      $className = "MDM_EnterpriseModernAppManagement_StoreLicenses02_01"
      $methodName = "AddLicenseMethod"
      $parentID = "./Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses"
      
      #Update $contentID with the ContentID value from the unencoded license file (.xml)
      $contentID = "{'ContentID'_in_unencoded_license_file}"
      
      #Update $licenseBlob with the entire String in the encoded license file (.bin)
      $licenseBlob = "{Entire_String_in_encoded_license_file}"
      
      $session = New-CimSession
      
      #The final string passed into the AddLicenseMethod should be of the form <License Content="encoded license blob" />
      $licenseString = '<License Content='+ '"' + $licenseBlob +'"' + ' />'
      
      $params = New-Object Microsoft.Management.Infrastructure.CimMethodParametersCollection
      $param = [Microsoft.Management.Infrastructure.CimMethodParameter]::Create("param",$licenseString ,"String", "In")
      $params.Add($param)
      
      try
      {
           $instance = New-CimInstance -Namespace $namespaceName -ClassName $className -Property @{ParentID=$parentID;InstanceID=$contentID}
           $session.InvokeMethod($namespaceName, $instance, $methodName, $params)
      }
      catch [Exception]
      {
           Write-Host $_ | Out-String
      }
      

デモンストレーション スクリプト

MSIX パッケージのテストのすべての 4 つの段階のデモ スクリプトと、 GitHub リポジトリで使用する方法に関する構文のヘルプを確認できます。 これらのスクリプトは、任意のバージョンの PowerShell と任意のディスク イメージ形式で動作します。

次の手順

Azure Virtual Desktop での App Attach の詳細については、以下を参照してください。