Testar pacotes MSIX para anexação de aplicações

Este artigo mostra como montar pacotes MSIX fora da Área de Trabalho Virtual do Azure para ajudar a testar seus pacotes para anexação de aplicativos. As APIs que o aplicativo de alimentação anexa estão disponíveis para Windows 11 Enterprise e Windows 10 Enterprise. Essas APIs podem ser usadas fora da Área de Trabalho Virtual do Azure para testes, no entanto, não há um plano de gerenciamento para anexar aplicativos ou anexar aplicativos MSIX fora da Área de Trabalho Virtual do Azure.

Para obter mais informações sobre anexação de aplicativo e anexação de aplicativo MSIX, consulte anexar aplicativo e anexar aplicativo MSIX na Área de Trabalho Virtual do Azure.

Pré-requisitos

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

  • Um dispositivo com o Windows 11 Enterprise ou Windows 10 Enterprise.

  • Um aplicativo que você expandiu do formato MSIX para uma imagem que você pode usar com o aplicativo anexado. Saiba como Criar uma imagem MSIX para usar com a anexação de aplicativos na Área de Trabalho Virtual do Azure.

  • Se você estiver usando uma imagem CimFS, precisará instalar o módulo PowerShell CimDiskImage.

  • Uma conta de usuário que tem permissão de administrador local no dispositivo que você está usando para testar o pacote MSIX.

Você não precisa de uma implantação da Área de Trabalho Virtual do Azure porque este artigo descreve um processo de teste fora da Área de Trabalho Virtual do Azure.

Nota

O Suporte da Microsoft não suporta o módulo CimDiskImage PowerShell, portanto, se você tiver problemas, precisará enviar uma solicitação no repositório GitHub do módulo.

Fases

Para usar pacotes MSIX fora da Área de Trabalho Virtual do Azure, há quatro fases distintas que você deve executar na seguinte ordem:

  1. Fase
  2. Registar
  3. Cancelar o registo
  4. Destage

O preparo e a desestabilização são operações no nível da máquina, enquanto o registro e o cancelamento do registro são operações no nível do usuário. Os comandos que você precisa usar variam com base em qual versão do PowerShell você está usando e se suas imagens de disco estão no formato CimFS, VHDX ou VHD.

Nota

Todos os pacotes MSIX incluem um certificado. Você é responsável por garantir que os certificados para pacotes MSIX sejam confiáveis em seu ambiente.

Prepare-se para preparar um pacote MSIX

O script de preparo prepara sua máquina para receber o pacote MSIX e monta o pacote relevante em sua máquina.

Selecione a guia relevante para a versão do PowerShell que você está usando.

Para preparar pacotes usando o PowerShell 6 ou posterior, você precisa executar os seguintes comandos antes das operações de preparo para trazer os recursos do pacote do Tempo de Execução do Windows para o PowerShell.

  1. Abra um prompt do PowerShell como administrador.

  2. Execute o seguinte comando para baixar e instalar o Pacote do Tempo de Execução do Windows. Você só precisa executar os seguintes comandos uma vez por máquina.

    #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 do Tempo de Execução do Windows 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 você preparou sua máquina para preparar pacotes MSIX, você precisa montar sua imagem de disco e, em seguida, concluir o preparo do pacote MSIX.

Montar uma imagem de disco

O processo para montar uma imagem de disco varia dependendo se você está usando o formato CimFs, VHDX ou VHD para sua imagem de disco. Selecione a guia relevante para o formato que você está usando.

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. Você precisa dessas informações mais adiante neste artigo.

  3. Quando terminar, prossiga para Concluir a preparação de uma imagem de disco.

Concluir o preparo de uma imagem de disco

Finalmente, você precisa executar os seguintes comandos para todos os formatos de imagem para concluir o preparo da imagem de disco. Este comando usa a $deviceId variável que você criou quando montou a imagem de disco na seção anterior.

  1. Na mesma sessão do PowerShell, recupere as informações do aplicativo executando 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 em uma variável executando os seguintes comandos. Esta variável é necessária para etapas posteriores.

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

    $folderUri = $maniFestFolder.Replace('\\?\','file:\\\')
    $folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri
    
  4. Use o URI absoluto para preparar o pacote do aplicativo executando 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. Monitore o progresso do preparo para o pacote do aplicativo executando os seguintes comandos. O tempo necessário para preparar a embalagem depende do seu tamanho. A Status propriedade da $stagingResult variável será RanToCompletion quando o preparo 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
    

Uma vez que seu pacote MSI é preparado, você pode registrar seu pacote MSIX.

Registrar um pacote MSIX

Para registrar um pacote MSIX, execute os seguintes comandos na mesma sessão do PowerShell. Este comando usa a $msixPackageFullName variável criada em uma seção anterior.

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

Agora que o seu pacote MSIX está registado, a sua aplicação deve estar disponível para utilização na sua sessão. Agora você pode abrir o aplicativo para teste e solução de problemas. Quando terminar, você precisa cancelar o registro e desmontar seu pacote MSIX.

Cancelar o registro de um pacote MSIX

Quando terminar o seu pacote MSIX e estiver pronto para removê-lo, primeiro você precisa cancelá-lo. Para cancelar o registro do pacote MSIX, execute os seguintes comandos na mesma sessão do PowerShell. Esses comandos obtêm o parâmetro do DeviceId disco novamente e removem o pacote usando a $msixPackageFullName variável criada em uma seçã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

Desmontar um pacote MSIX

Finalmente, para desativar o pacote MSIX, você precisa desmontar sua imagem de disco, execute o seguinte comando na mesma sessão do PowerShell para garantir que o pacote ainda não esteja registrado para nenhum usuário. Este comando usa a $msixPackageFullName variável criada em uma seção anterior.

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

Desmontar a imagem dos discos

Para concluir o processo de desestabilização, você precisa desmontar os discos do sistema. O comando que você precisa usar depende do formato da imagem de disco. Selecione a guia relevante para o formato que você está usando.

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

Dismount-CimDiskImage -DeviceId $deviceId

Depois de terminar de desmontar os discos, você removeu com segurança o pacote MSIX.

Configurar scripts de simulação para o agente de anexação de aplicativos MSIX

Se quiser adicionar e remover pacotes MSIX ao seu dispositivo automaticamente, você pode usar os comandos do PowerShell neste artigo para criar scripts que são executados na inicialização, logon, logoff e desligamento. Para saber mais, consulte Usando scripts de inicialização, desligamento, logon e logoff na Diretiva de Grupo. Você precisa certificar-se de que todas as variáveis necessárias para cada fase estão disponíveis em cada script.

Você cria um script para cada fase:

  • O script de inicialização executa o processo de estágio .
  • O script de logon executa o processo de registro .
  • O script de logoff executa o processo de cancelamento de registro .
  • O script de desligamento executa o processo de destage .

Nota

Você pode usar o agendador de tarefas para executar o script de estágio. Para executar o script, defina o gatilho de tarefa como Quando o computador for iniciado e habilite Executar com privilégios mais altos.

Usar 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 do 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 arquivos de licença, você precisa usar um script do PowerShell que chame a MDM_EnterpriseModernAppManagement_StoreLicenses02_01 classe no Provedor de Ponte WMI.

Veja como configurar uma licença para uso offline:

  1. Transfira o pacote da aplicação, a licença e as estruturas necessárias a partir da Microsoft Store para Empresas. Você precisa dos arquivos 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. Você pode instalar a licença está no final da fase de preparação. Você precisa editar as seguintes variáveis:

    • $contentID é o valor ContentID do arquivo de licença não codificado (.xml). Você pode abrir o arquivo de licença em um editor de texto de sua escolha.

    • $licenseBlob é a cadeia de caracteres inteira para o blob de licença no arquivo de licença codificada (.bin). Você pode abrir o arquivo de licença codificado em um editor de texto de 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

Você pode encontrar scripts de demonstração para todos os quatro estágios de teste de pacotes MSIX e ajuda de sintaxe para como usá-los em nosso repositório GitHub. Esses scripts funcionam com qualquer versão do PowerShell e qualquer formato de imagem de disco.

Próximos passos

Saiba mais sobre a anexação de aplicativos e a anexação de aplicativos MSIX na Área de Trabalho Virtual do Azure: