Partilhar via


Testar pacotes MSIX para Anexar Aplicação

Este artigo mostra-lhe como montar pacotes MSIX fora do Azure Virtual Desktop para ajudar a testar os pacotes para Anexação de Aplicações. As APIs que ligam a Aplicação estão disponíveis para Windows 11 Enterprise e Windows 10 Enterprise. Estas APIs podem ser utilizadas fora do Azure Virtual Desktop para fins de teste. No entanto, não existe um plano de gestão para Anexar Aplicações fora do Azure Virtual Desktop.

Para obter mais informações sobre a Anexação de Aplicações, veja Anexar Aplicações no Azure Virtual Desktop.

Pré-requisitos

Antes de poder testar um pacote para seguir as instruções neste artigo, precisa das seguintes coisas:

Não precisa de uma implementação do Azure Virtual Desktop porque este artigo descreve um processo para testes fora do Azure Virtual Desktop.

Observação

Suporte da Microsoft não suporta o módulo CimDiskImage powerShell, pelo que, se tiver problemas, terá de submeter um pedido no repositório do GitHub do módulo.

Fases

Para utilizar pacotes MSIX fora do Azure Virtual Desktop, existem quatro fases distintas que tem de efetuar pela seguinte ordem:

  1. Estágio
  2. Registrar
  3. Anular registo
  4. Etapa final

O teste e a desativação são operações ao nível da máquina, enquanto o registo e o registo são operações ao nível do utilizador. Os comandos que precisa de utilizar variam consoante a versão do PowerShell que está a utilizar e se as imagens do disco estão no formato CimFS, VHDX ou VHD .

Observação

Todos os pacotes MSIX incluem um certificado. É responsável por garantir que os certificados dos pacotes MSIX são fidedignos no seu ambiente.

Preparar para preparar um pacote MSIX

O script de teste prepara o computador para receber o pacote MSIX e monta o pacote relevante no seu computador.

Selecione o separador relevante para a versão do PowerShell que está a utilizar.

Para preparar pacotes com o PowerShell 6 ou posterior, tem de executar os seguintes comandos antes das operações de teste para trazer as capacidades do pacote Windows Runtime para o PowerShell.

  1. Abra uma linha de comandos do PowerShell como administrador.

  2. Execute o seguinte comando para transferir e instalar o Pacote Windows Runtime. Só tem de executar os seguintes comandos uma vez por computador.

    #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. Em seguida, execute o seguinte comando para disponibilizar os componentes Windows Runtime no 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
    

Preparar um pacote MSIX

Agora que preparou o computador para preparar os pacotes MSIX, tem de montar a imagem do disco e, em seguida, concluir o teste do pacote MSIX.

Montar uma imagem de disco

O processo de montagem de uma imagem de disco varia consoante esteja a utilizar o formato CimFs, VHDX ou VHD para a sua imagem de disco. Selecione o separador relevante para o formato que está a utilizar.

Para montar uma imagem de disco CimFS:

  1. Na mesma sessão do PowerShell, execute o seguinte comando:

    $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. Mantenha a variável $deviceId. Irá precisar destas informações mais adiante neste artigo.

  3. Quando terminar, avance para Concluir a transição de uma imagem de disco.

Concluir a transição de uma imagem de disco

Por fim, tem de executar os seguintes comandos para todos os formatos de imagem para concluir o teste da imagem do disco. Este comando utiliza a $deviceId variável que criou quando montou a imagem do disco na secção anterior.

  1. Na mesma sessão do PowerShell, obtenha as informações da aplicação ao executar os seguintes comandos:

    $manifest = Get-ChildItem -LiteralPath $deviceId -Recurse -File AppxManifest.xml
    $manifestFolder = $manifest.DirectoryName
    
  2. Obtenha o nome completo do pacote MSIX e armazene-o numa variável ao executar os seguintes comandos. Esta variável é necessária para passos posteriores.

    $msixPackageFullName = $manifestFolder.Split('\')[-1]
    Write-Output $msixPackageFullName
    
  3. Crie um URI absoluto para a pasta de manifesto para a API do Gestor de Pacotes ao executar os seguintes comandos:

    $folderUri = $maniFestFolder.Replace('\\?\','file:\\\')
    $folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri
    
  4. Utilize o URI absoluto para preparar o pacote de aplicação ao executar os seguintes comandos:

    $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. Monitorize o progresso de teste do pacote de aplicação ao executar os seguintes comandos. O tempo necessário para preparar o pacote depende do tamanho. A Status propriedade da $stagingResult variável será RanToCompletion quando o teste estiver concluído.

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

Assim que o seu pacote MSI for testado, pode registar o seu pacote MSIX.

Registar um pacote MSIX

Para registar um pacote MSIX, execute os seguintes comandos na mesma sessão do PowerShell. Este comando utiliza a $msixPackageFullName variável criada numa secção anterior.

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

Agora que o pacote MSIX está registado, a sua aplicação deve estar disponível para utilização na sua sessão. Agora pode abrir a aplicação para testes e resolução de problemas. Quando tiver terminado, terá de anular o registo e anular o seu pacote MSIX.

Anular o registo de um pacote MSIX

Quando tiver terminado o seu pacote MSIX e estiver pronto para o remover, primeiro tem de o anular. Para anular o registo do pacote MSIX, execute os seguintes comandos na mesma sessão do PowerShell. Estes comandos obtêm novamente o parâmetro do DeviceId disco e removem o pacote com a $msixPackageFullName variável criada numa secção anterior.

$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

Desenarnar um pacote MSIX

Por fim, para desestar o pacote MSIX, tem de desmontar a imagem do disco, execute o seguinte comando na mesma sessão do PowerShell para garantir que o pacote ainda não está registado para nenhum utilizador. Este comando utiliza a $msixPackageFullName variável criada numa secção anterior.

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

Desmontar a imagem dos discos

Para concluir o processo de desativação, tem de desmontar os discos do sistema. O comando que precisa de utilizar depende do formato da sua imagem de disco. Selecione o separador relevante para o formato que está a utilizar.

Para desmontar uma imagem de disco CimFS, execute os seguintes comandos na mesma sessão do PowerShell:

Dismount-CimDiskImage -DeviceId $deviceId

Depois de concluir a desmontagem dos discos, removeu o pacote MSIX em segurança.

Configurar scripts de simulação para o agente de Anexação de Aplicações

Se quiser adicionar e remover pacotes MSIX automaticamente ao seu dispositivo, pode utilizar os comandos do PowerShell neste artigo para criar scripts que são executados no arranque, início de sessão, fim de sessão e encerramento. Para saber mais, veja Utilizar scripts de arranque, encerramento, início de sessão e início de sessão no Política de Grupo. Tem de se certificar de que todas as variáveis necessárias para cada fase estão disponíveis em cada script.

Cria um script para cada fase:

  • O script de arranque executa o processo de fase .
  • O script de início de sessão executa o processo de registo .
  • O script de início de sessão executa o processo de registo .
  • O script de encerramento executa o processo de preparação .

Observação

Pode utilizar o programador de tarefas para executar o script de fase. Para executar o script, defina o acionador de tarefas como Quando o computador é iniciado e ative Executar com privilégios mais elevados.

Utilizar pacotes offline

Se estiver a utilizar pacotes em dispositivos que não estão ligados à Internet, tem de se certificar de que as licenças de pacote estão instaladas no seu dispositivo para executar a aplicação com êxito. Se o seu dispositivo estiver online, as licenças necessárias devem ser transferidas automaticamente.

Para instalar os ficheiros de licença, tem de utilizar um script do PowerShell que chama a MDM_EnterpriseModernAppManagement_StoreLicenses02_01 classe no Fornecedor de Bridge WMI.

Eis como configurar uma licença para utilização offline:

  1. Transfira o pacote de aplicação, a licença e as arquiteturas necessárias do Microsoft Store para Empresas. Precisa dos ficheiros de licença codificados e não codificados. Para saber como transferir uma aplicação licenciada offline, consulte Distribuir aplicações offline.

  2. Execute os seguintes comandos do PowerShell como administrador. Pode instalar a licença no final da fase de teste. Tem de editar as seguintes variáveis:

    • $contentID é o valor ContentID do ficheiro de licença não codificado (.xml). Pode abrir o ficheiro de licença num editor de texto à sua escolha.

    • $licenseBlob é a cadeia completa do blob de licenças no ficheiro de licença codificada (.bin). Pode abrir o ficheiro de licença codificada num editor de texto à sua escolha.

      $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
      }
      

Scripts de demonstração

Pode encontrar scripts de demonstração para as quatro fases de teste de pacotes MSIX e ajuda de sintaxe para saber como utilizá-los no nosso repositório do GitHub. Estes scripts funcionam com qualquer versão do PowerShell e qualquer formato de imagem de disco.

Próximas etapas

Saiba mais sobre a Anexação de Aplicações no Azure Virtual Desktop: