本文說明如何在 Azure 虛擬桌面外部掛接 MSIX 套件,以協助測試應用程式連結的套件。 Power App Attach 的 API 適用於 Windows 11 企業版 和 Windows 10 企業版。 這些 API 可以在 Azure 虛擬桌面外部用於測試,但 Azure 虛擬桌面外部沒有應用程式連結的管理平面。
如需應用程式連結的詳細資訊,請參閱 Azure 虛擬桌面中的應用程式連結。
必要條件
在測試套件以遵循本文中的指示之前,您需要下列專案:
執行 Windows 11 企業版 或 Windows 10 企業版 的裝置。
從 MSIX 格式擴充為影像的應用程式,您可以搭配應用程式附加使用。 瞭解如何 建立 MSIX 映像,以搭配 Azure 虛擬桌面中的應用程式連結使用。
如果您使用 CimFS 映射,則必須安裝 CimDiskImage PowerShell 模組。
在您用來測試 MSIX 套件的裝置上具有本機系統管理員許可權的用戶帳戶。
您不需要 Azure 虛擬桌面部署,因為本文說明在 Azure 虛擬桌面外部進行測試的程式。
注意事項
Microsoft 支援服務 不支援 CimDiskImage PowerShell 模組,因此如果您遇到任何問題,就必須在模組的 GitHub 存放庫上提交要求。
階段
若要在 Azure 虛擬桌面外部使用 MSIX 套件,您必須依下列順序執行四個不同的階段:
- 階段
- 登錄
- 取消註冊
- 取消暫存
暫存和還原標記是機器層級作業,而註冊和取消註冊則是用戶層級作業。 您需要使用的命令會根據您使用的PowerShell版本,以及您的磁碟映像是 CimFS、 VHDX 或 VHD 格式而有所不同。
注意事項
所有 MSIX 套件都包含憑證。 您必須負責確保 MSIX 套件的憑證在您的環境中受到信任。
準備暫存 MSIX 套件
預備文本會準備您的計算機以接收 MSIX 套件,並將相關的套件掛接至您的電腦。
選取您所使用 PowerShell 版本的相關索引標籤。
若要使用 PowerShell 6 或更新版本來暫存套件,您必須在預備作業之前執行下列命令,將 Windows 執行階段 套件的功能帶入 PowerShell。
以系統管理員身分開啟PowerShell提示字元。
執行下列命令以下載並安裝 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接下來,執行下列命令,讓 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 套件的預備。
掛接磁碟映像
掛接磁碟映像的程式會因您為磁碟映像使用 CimFs、 VHDX 或 VHD 格式而有所不同。 選取您所使用格式的相關索引標籤。
若要掛接 CimFS 磁碟映射:
在相同的 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保留變數
$deviceId。 您稍後在本文中需要這項資訊。完成後,請繼續 完成暫存磁碟映像。
完成暫存磁碟映像
最後,您必須針對所有映像格式執行下列命令,以完成暫存磁碟映像。 此命令會使用您在上一 $deviceId 節中掛接磁碟映像時所建立的變數。
在相同的 PowerShell 工作階段中,執行下列命令來擷取應用程式資訊:
$manifest = Get-ChildItem -LiteralPath $deviceId -Recurse -File AppxManifest.xml $manifestFolder = $manifest.DirectoryName執行下列命令,以取得 MSIX 套件完整名稱,並將它儲存在變數中。 後續步驟需要此變數。
$msixPackageFullName = $manifestFolder.Split('\')[-1] Write-Output $msixPackageFullName執行下列命令,為套件管理員 API 的指令清單資料夾建立絕對 URI:
$folderUri = $maniFestFolder.Replace('\\?\','file:\\\') $folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri執行下列命令,使用絕對 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")執行下列命令來監視應用程式封裝的預備進度。 暫存套件所需的時間取決於其大小。 當
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網橋提供者中的類別。
以下說明如何設定離線使用的授權:
從 商務用 Microsoft Store 下載應用程式套件、授權和必要架構。 您需要編碼和未編碼的授權檔案。 若要瞭解如何下載離線授權應用程式,請參閱 散發脫機應用程式。
以系統管理員身分執行下列 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 虛擬桌面中的應用程式連結: