共用方式為


測試應用程式附加的 MSIX 套件

本文說明如何在 Azure 虛擬桌面外部掛接 MSIX 套件,以協助測試應用程式連結的套件。 Power App Attach 的 API 適用於 Windows 11 企業版 和 Windows 10 企業版。 這些 API 可以在 Azure 虛擬桌面外部用於測試,但 Azure 虛擬桌面外部沒有應用程式連結的管理平面。

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

必要條件

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

您不需要 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. 執行下列命令來監視應用程式封裝的預備進度。 暫存套件所需的時間取決於其大小。 當 Status 暫存完成時, $stagingResult 變數的屬性將會 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 工作階段中執行下列命令。 這些命令會再次取得磁碟的 參數,並使用$msixPackageFullName在上一節中建立的DeviceId變數來移除封裝。

$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 套件新增至裝置,您可以使用本文中的 PowerShell 命令來建立在啟動、登入、註銷和關機時執行的腳本。 若要深入瞭解,請參閱在 群組原則 中使用啟動、關機、登入和註銷腳本。 您必須確定每個文稿中都提供每個階段所需的任何變數。

您會為每個階段建立文稿:

  • 啟動文本會執行 階段 程式。
  • 登入腳本會執行 註冊 程式。
  • 註銷腳本會執行 取消註冊 程式。
  • 關機腳本會執行 淘汰 程式。

注意事項

您可以使用工作排程器來執行階段腳稿。 若要執行腳本,請將工作觸發程式設定為 [ 計算機啟動時 ],並啟 用 [以最高許可權執行]

離線使用套件

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

若要安裝授權檔案,您必須使用PowerShell腳本來呼叫 MDM_EnterpriseModernAppManagement_StoreLicenses02_01 WMI網橋提供者中的類別。

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

  1. 從 商務用 Microsoft Store 下載應用程式套件、授權和必要架構。 您需要編碼和未編碼的授權檔案。 若要瞭解如何下載離線授權應用程式,請參閱 散發脫機應用程式

  2. 以系統管理員身分執行下列 PowerShell 命令。 您可以在 預備階段結束時安裝授權。 您需要編輯下列變數:

    • $contentID 是來自未編碼授權檔案的 ContentID 值, (.xml) 。 您可以在您選擇的文字編輯器開啟授權檔案。

    • $licenseBlob 是編碼授權檔案中授權 Blob 的整個字串, () .bin 。 您可以在您選擇的文字編輯器中開啟編碼的授權檔案。

      $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 虛擬桌面中的應用程式連結: