Testování a řešení potíží s balíčky MSIX pomocí připojení aplikace MSIX

V tomto článku se dozvíte, jak pomocí aplikace MSIX připojit balíčky MSIX mimo Azure Virtual Desktop pro účely testování a řešení potíží.

Pokud chcete použít připojení aplikace MSIX s Azure Virtual Desktopem, můžete k přidání a publikování aplikací použít Azure Portal nebo Azure PowerShell .

Předpoklady

Než budete moct pomocí připojení aplikace MSIX postupovat podle pokynů v tomto článku, budete potřebovat následující věci:

  • Klient Windows 10 nebo 11.

  • Aplikace, kterou jste rozšířili z formátu MSIX do formátu připojení aplikace. Informace o rozšíření aplikace MSIX najdete v tématu Použití nástroje MSIXMGR.

  • Pokud používáte image CimFS, budete si muset před zahájením práce nainstalovat následující modul:

    Install-Module CimDiskImage
    Import-Module CimDiskImage
    

Tyto pokyny nevyžadují nasazení služby Azure Virtual Desktop, protože popisují proces testování mimo Azure Virtual Desktop.

Poznámka:

podpora Microsoftu tento modul image disku CimFS v současné době nepodporuje, takže pokud narazíte na nějaké problémy, budete muset odeslat žádost do úložiště GitHub modulu.

Fáze připojení aplikace MSIX

Pokud chcete používat balíčky MSIX mimo Azure Virtual Desktop, existují čtyři různé fáze, které musíte provést v následujícím pořadí, jinak to nebude fungovat:

  1. Fáze
  2. Registrovat
  3. Zrušit registraci
  4. Destage

Příprava a destagování jsou operace na úrovni počítače a registrace jsou operace na úrovni uživatele. Příkazy, které budete potřebovat použít, se budou lišit v závislosti na tom, jakou verzi PowerShellu používáte a jestli jsou vaše image disků ve formátu CimFS nebo VHD(X).

Poznámka:

Všechny balíčky aplikací MSIX obsahují certifikát. Zodpovídáte za zajištění důvěryhodnosti certifikátů pro aplikace MSIX ve vašem prostředí.

Příprava balíčku MSIX

Přípravný skript připraví váš počítač na příjem balíčku MSIX a připojí příslušný balíček k počítači. Následující příkazy budete muset spustit jenom jednou na počítač.

Pokud ale používáte image ve formátu CimFS nebo verzi PowerShellu větší než 5.1, pokyny budou vypadat trochu jinak. Novější verze PowerShellu jsou více platforem, což znamená, že části aplikací pro Windows jsou rozdělené do vlastního balíčku označovaného jako prostředí Windows Runtime. K instalaci balíčku s více platformami PowerShellu budete muset použít mírně odlišnou verzi příkazů.

Ke spuštění příkazů v následujících částech budete muset spustit PowerShell jako Správa istrator.

V dalším kroku se budete muset rozhodnout, které pokyny je potřeba provést, abyste mohli balíček vytvořit podle toho, jakou verzi PowerShellu používáte.

PowerShell 6 a novější

Pokud chcete zfázovat balíčky při spuštění pomocí PowerShellu 6 nebo novějšího, musíte před přípravnou operací spustit následující příkazy, abyste mohli přenést možnosti balíčku prostředí Windows Runtime, který jste dříve nainstalovali do relace PowerShellu.

  1. Nejprve spuštěním tohoto příkazu získejte balíček prostředí Windows Runtime:

    #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
    
  2. Potom spuštěním následujícího příkazu zpřístupněte komponenty prostředí Windows Runtime v relaci PowerShellu.

    #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
    

PowerShell 5.1 a starší

Spuštěním následujícího příkazu připravte balíčky při spuštění pomocí PowerShellu verze 5.1 nebo starší:

#Required for PowerShell versions less than or equal to 5.1
[Windows.Management.Deployment.PackageManager,Windows.Management.Deployment,ContentType=WindowsRuntime] | Out-Null
Add-Type -AssemblyName System.Runtime.WindowsRuntime

Připojení image disku

Teď, když jste připravili počítač na přípravu balíčků připojení aplikace MSIX, budete muset připojit image disku. Tento proces se bude lišit v závislosti na tom, jestli pro image disku používáte formát VHD (X) nebo CimFs .

Poznámka:

Nezapomeňte zaznamenat ID zařízení pro každou aplikaci ve výstupu příkazu. Tyto informace budete potřebovat, abyste mohli postupovat podle pokynů dále v tomto článku.

Připojení image disku CimFS:

  1. Spusťte tento příkaz:

    $diskImage = "<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. Až budete hotovi, pokračujte dokončením přípravy image disku.

Dokončení přípravy image disku

Nakonec budete muset spustit následující příkaz pro všechny formáty imagí, abyste dokončili přípravu image disku. Tento příkaz použije proměnnou $DeviceId , kterou jste vytvořili při připojení image disku v předchozí části.

#Once the volume is mounted we can retrieve the application information
$manifest = Get-Childitem -LiteralPath $DeviceId -Recurse -File AppxManifest.xml
$manifestFolder = $manifest.DirectoryName

#We can now get the MSIX package full name, this will be needed for later steps.
$msixPackageFullName = $manifestFolder.Split('\')[-1]
Write-Output $msixPackageFullName

#We need to create an absolute uri for the manifest folder for the Package Manager API
$folderUri = $maniFestFolder.Replace('\\?\','file:\\\')
$folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri

#Package Manager will now use the absolute uri to stage the application package
$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")
$stagingResult = $asTaskAsyncOperation.Invoke($null, @($asyncOperation))

#You can check the $stagingResult variable to  monitor the staging progress for the application package
Write-Output $stagingResult

Váš balíček MSIX je teď připravený k registraci.

Registrace balíčku MSIX

Pokud chcete zaregistrovat balíček MSIX, spusťte následující rutiny PowerShellu se zástupnými hodnotami nahrazenými hodnotami, které platí pro vaše prostředí.

Parametr $msixPackageFullName by měl být úplný název balíčku z předchozí části, ale formát by měl být podobný následujícímu příkladu: Publisher.Application_version_Platform__HashCode.

Pokud jste po přípravě aplikace nenačetli parametr, můžete ho najít také jako název složky pro samotnou aplikaci v C:\Program Files\WindowsApps.

$msixPackageFullName = "<package full name>"

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

Teď, když je váš balíček MSIX zaregistrovaný, by vaše aplikace měla být k dispozici pro použití ve vaší relaci. Teď můžete aplikaci otevřít pro účely testování a řešení potíží.

Zrušení registrace balíčku MSIX

Pokud jste s balíčkem hotovi a jste připraveni ho odebrat, je teď čas ho zrušit. Pokud chcete zrušit registraci, budete znovu potřebovat $msixPackageFullName parametr.

Pokud chcete balíček zrušit, spusťte následující příkaz po nahrazení zástupného textu příslušnými hodnotami:

$msixPackageFullName = "<package full name>"

Remove-AppxPackage $msixPackageFullName -PreserveRoamableApplicationData

Destage balíček MSIX

Pokud chcete balíček MSIX destage, ujistěte se, že používáte příkazový řádek PowerShellu se zvýšenými oprávněními. Abyste získali parametr disku, musíte spustit následující příkaz PowerShellu DeviceId . Zástupný symbol nahraďte $packageFullName názvem balíčku, který testujete. V produkčním nasazení doporučujeme tento příkaz spustit pouze při vypnutí systému.

$msixPackageFullName = "<package full name>"

#If you don't know the DeviceId of the mounted disk, you can find it using the following code.
$appPath = Join-Path (Join-Path $Env:ProgramFiles 'WindowsApps') $msixPackageFullName
$folderInfo = Get-Item $appPath
$DeviceId = '\\?\' + $folderInfo.LinkTarget.Split('\')[0] +'\'
Write-Output $DeviceId #Save this for later

Remove-AppxPackage -AllUsers -Package $msixPackageFullName
Remove-AppxPackage -Package $msixPackageFullName

Odpojte disky od systému.

Pokud chcete dokončit proces destagingu, budete muset disky odpojit od systému. Příkaz, který budete potřebovat použít, závisí na formátu image disku.

Pokud je vaše image ve formátu CimFS, spusťte tuto rutinu:

DisMount-CimDiskimage -DeviceId $DeviceId

Po odpojení disků jste bezpečně odebrali balíček MSIX.

Nastavení simulačních skriptů pro agenta připojení aplikace MSIX

Pokud chcete balíčky MSIX přidávat a odebírat automaticky, můžete pomocí příkazů PowerShellu v tomto článku vytvořit skripty, které se spouští při spuštění, přihlášení, odhlášení a vypnutí. Další informace o těchto typech skriptů najdete v tématu Použití skriptů při spuštění, vypnutí, přihlášení a odhlášení v zásadách skupiny.

Každý z těchto automatických skriptů spustí jednu fázi připojení skriptů aplikace:

  • Spouštěcí skript spustí skript fáze.
  • Přihlašovací skript spustí registrační skript.
  • Skript pro odhlášení spustí deregister skript.
  • Skript vypnutí spustí skript destage.

Poznámka:

Plánovač úloh můžete spustit pomocí skriptu fáze. Pokud chcete spustit skript, nastavte trigger úlohy na Při spuštění počítače a povolte spustit s nejvyššími oprávněními.

Použití balíčků offline

Pokud používáte balíčky z Microsoft Store pro firmy nebo Microsoft Store pro vzdělávání v síti nebo na zařízeních, která nejsou připojená k internetu, potřebujete získat licence balíčků z Microsoft Storu a nainstalovat je do zařízení, aby se aplikace úspěšně spustila. Pokud je vaše zařízení online a může se připojit k Microsoft Store pro firmy, měly by se požadované licence stahovat automaticky, ale pokud jste offline, budete muset licence nastavit ručně.

K instalaci licenčních souborů budete muset použít skript PowerShellu, který volá třídu MDM_EnterpriseModernAppManagement_StoreLicenses02_01 ve zprostředkovateli mostu WMI.

Tady je postup, jak nastavit licence pro offline použití:

  1. Stáhněte balíček aplikace, licence a požadované architektury z Microsoft Store pro firmy. Potřebujete kódované i nekódované licenční soubory. Podrobné pokyny ke stažení najdete tady.

  2. Aktualizujte následující proměnné ve skriptu pro krok 3:

    • $contentID je hodnota ContentID z nekódovaného licenčního souboru (.xml). Licenční soubor můžete otevřít v textovém editoru podle svého výběru.
    • $licenseBlob je celý řetězec objektu blob licence v zakódovaném licenčním souboru (.bin). Kódovaný licenční soubor můžete otevřít v textovém editoru podle vašeho výběru.
  3. Spusťte následující skript z PowerShellu spuštěného jako správce. Vhodné místo pro instalaci licencí je na konci přípravné fáze , protože v tomto okamžiku musíte také spustit PowerShell jako správce.

    $namespaceName = "root\cimv2\mdm\dmmap"
    $className = "MDM_EnterpriseModernAppManagement_StoreLicenses02_01"
    $methodName = "AddLicenseMethod"
    $parentID = "./Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses"
    
    #TODO - Update $contentID with the ContentID value from the unencoded license file (.xml)
    $contentID = "{'ContentID'_in_unencoded_license_file}"
    
    #TODO - 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
    }
    

Ukázkové skripty

Ukázkové skripty pro všechny čtyři fáze procesu balíčku MSIX App Attach a syntaxi najdete v naší šabloně. Tyto skripty budou fungovat s libovolnou verzí PowerShellu a libovolným formátem image disku.

Další kroky

Pokud máte nějaké dotazy, můžete je pokládat na webu Azure Virtual Desktop TechCommunity.

Svůj názor na Azure Virtual Desktop můžete také nechat v centru zpětné vazby ke službě Azure Virtual Desktop.