共用方式為


測試 MSIX 應用程式連結的套件

本文說明如何在 Azure 虛擬桌面外部裝載 MSIX 套件,以協助測試用於應用程式連結的套件。 Windows 11 企業版和 Windows 10 企業版可使用支援應用程式連結的 API。 這些 API 可用於 Azure 虛擬桌面外部進行測試,不過,在 Azure 虛擬桌面外部沒有應用程式連結或 MSIX 應用程式連結的管理平面。

如需應用程式連結和 MSIX 應用程式附加的詳細資訊,請參閱 Azure 虛擬桌面中的應用程式附加和 MSIX 應用程式附加。

必要條件

測試套件以遵循本文中的指示之前,您需要下列事項:

您不需要 Azure 虛擬桌面部署,因為本文說明在 Azure 虛擬桌面外部測試的程序。

注意

Microsoft 支援服務不支援 CimDiskImage PowerShell 模組,因此如果您遇到任何問題,您必須在 該模組的 GitHub 存放庫 提交要求。

階段

若要在 Azure 虛擬桌面外部使用 MSIX 套件,您必須依下列順序執行四個不同的階段:

  1. 階段
  2. 註冊
  3. 取消註冊
  4. 降級

暫存和取消暫存是機器層級的作業,註冊和取消註冊則是使用者層級作業。 您需要使用的命令會依據您使用的 PowerShell 版本,以及磁碟映像是否為 CimFSVHDXVHD 格式而有所不同。

注意

所有 MSIX 套件都包含憑證。 您必須確認您的環境信任 MSIX 應用程式的憑證。

準備暫存 MSIX 套件

暫存指令碼會讓您的電腦準備接收 MSIX 套件,並將相關套件裝載至您的電腦。

針對您使用的 PowerShell 版本,選取相關的索引標籤。

若要使用 PowerShell 6 或更新版本暫存套件,您必須在暫存作業之前執行下列命令,才能將 Windows 執行階段套件的功能提供給 PowerShell。

  1. 以管理員身分開啟 PowerShell 提示字元。

  2. 執行下列命令以下載並安裝 Windows 執行階段套件。 每台電腦只需要執行下列命令一次。

    #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 套件的暫存。

裝載磁碟映像

裝載磁碟映像的程式會因您使用的磁碟映像是 CimFsVHDXVHD 格式而有所不同。 針對您使用的格式選取相關的索引標籤。

若要掛接 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. 執行下列命令,為套件管理員 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 套件。

設定 MSIX 應用程式附加代理程式的模擬指令碼

如果您想要自動將 MSIX 套件新增至裝置和移除,您可以使用本文中的 PowerShell 命令來建立在啟動、登入、登出和關機時執行的指令碼。 若要深入瞭解,請參閱 在群組原則中使用啟動、關機、登入和登出指令碼。 您必須確認每個階段所需的任何變數都可以在每個指令碼中使用。

您可以為每個階段建立指令碼:

  • 啟動指令碼會執行 暫存 程序。
  • 登入指令碼會執行 註冊 程序。
  • 登出指令碼會執行 取消註冊 程序。
  • 關機指令碼會執行 解除暫存 程序。

注意

您可以使用工作排程器來執行階段指令碼。 若要執行指令碼,請將工作觸發程序設定為 [當電腦啟動時],並啟用 [以最大使用權限執行]

離線使用套件

如果您在未連線到因特網的裝置上使用套件,您必須確定您的裝置上已安裝套件授權,才能成功執行應用程式。 如果您的裝置已上線,則必要的授權應該會自動下載。

若要安裝授權檔案,您必須使用 PowerShell 指令碼,以呼叫 WMI 橋接器提供者中的 MDM_EnterpriseModernAppManagement_StoreLicenses02_01 類別。

以下說明如何設定離線使用的授權:

  1. 從 Microsoft Store for Business 下載應用程式套件、授權與所需架構。 您同時需要已編碼與未編碼的授權檔案。 若要瞭解如何下載離線授權應用程式,請參閱 散發離線應用程式

  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 套件所有四個階段的示範指令碼,以及如何在 GitHub 存放庫 中使用的語法說明。 這些指令碼適用於任何版本的 PowerShell 和任何磁碟映像格式。

下一步

深入瞭解 Azure 虛擬桌面中的應用程式連結和 MSIX 應用程式連結: