Compartilhar via


Testar pacotes MSIX para anexar aplicativos

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

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

Pré-requisitos

Antes de poder testar um pacote para seguir as instruções deste artigo, você precisará dos seguintes itens:

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.

Observação

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

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. Estágio
  2. Registrar
  3. Cancelar registro
  4. Cancelar preparo

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

Observação

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

Prepare-se para preparar um pacote MSIX

O script de preparo prepara seu computador para receber o pacote MSIX e monta o pacote relevante em seu computador.

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 preparação para trazer os recursos do pacote do Windows Runtime para o PowerShell.

  1. Abra um prompt do PowerShell como administrador.

  2. Execute o seguinte comando para baixar e instalar o Pacote do Windows Runtime. Você só precisa 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 tornar os componentes do Windows Runtime disponíveis 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 seu computador para a preparação de pacotes MSIX, é necessário montar a imagem do disco e concluir a preparação do pacote MSIX.

Montar uma imagem de disco

O processo de montagem de uma imagem de disco varia de acordo com o formato CimFs, VHDX ou VHD usado 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ê precisará dessas informações mais adiante neste artigo.

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

Concluir a preparação de uma imagem de disco

Por fim, você precisa executar os seguintes comandos para todos os formatos de imagem para concluir a preparação da imagem de disco. Esse comando usa a variável $deviceId que você criou quando montou a imagem do 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. Essa variável é necessária para as etapas posteriores.

    $msixPackageFullName = $manifestFolder.Split('\')[-1]
    Write-Output $msixPackageFullName
    
  3. Crie um URI absoluto para a pasta de manifesto da 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 da preparação do pacote de aplicativos executando os seguintes comandos. O tempo necessário para preparação do pacote depende do seu tamanho. A propriedade Status da variável $stagingResult será RanToCompletion quando a preparação estiver concluída.

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

Quando o pacote MSI estiver preparado, você poderá registrar o pacote MSIX.

Registrar um pacote MSIX

Para registrar um pacote MSIX, execute os seguintes comandos na mesma sessão do PowerShell. Esse comando usa a variável $msixPackageFullName 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 seu pacote MSIX está registrado, seu aplicativo deve estar disponível para uso em sua sessão. Agora você pode abrir o aplicativo para teste e solução de problemas. Após a conclusão, é necessário cancelar o registro e remover a preparação do pacote MSIX.

Cancelar o registro de um pacote MSIX

Quando terminar de usar o pacote MSIX e estiver pronto para removê-lo, primeiro será necessário cancelar o registro. Para cancelar o registro do pacote MSIX, execute os seguintes comandos na mesma sessão do PowerShell. Esses comandos obtêm o parâmetro DeviceId do disco novamente e removem o pacote usando a variável $msixPackageFullName 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

Remover da preparação um pacote MSIX

Por fim, para destruir o pacote MSIX, é necessário desmontar a imagem do disco e executar o seguinte comando na mesma sessão do PowerShell para garantir que o pacote ainda não esteja registrado para nenhum usuário. Esse comando usa a variável $msixPackageFullName criada em uma seção anterior.

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

Desmontar a imagem dos discos

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

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

Dismount-CimDiskImage -DeviceId $deviceId

Quando terminar de desmontar os discos, você terá removido com segurança o pacote MSIX.

Configurar scripts de simulação para o agente de anexação do aplicativo MSIX

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

Você cria um script para cada fase:

  • O script de inicialização executa o processo estágio.
  • O script de logon executa o processo registrar.
  • O script de logoff executa o processo de cancelamento de registro.
  • O script de desligamento executa o processo de remoção da preparação.

Observação

Você pode usar o agendador de tarefas para executar o script de preparação. Para executar o script, defina o gatilho da tarefa como Quando o computador iniciar e habilite Executar com privilégios mais altos.

Usar pacotes offline

Se você estiver usando pacotes em dispositivos que não estão conectados à Internet, precisará verificar se as licenças do pacote estão instaladas em seu dispositivo para executar o aplicativo com sucesso. Se o dispositivo estiver online, as licenças necessárias serão baixadas automaticamente.

Para instalar os arquivos de licença, você precisa usar um script do PowerShell que chame a classe MDM_EnterpriseModernAppManagement_StoreLicenses02_01 no Provedor de Ponte WMI.

Veja como configurar uma licença para uso offline:

  1. Faça o download do pacote de aplicativos, da licença e das estruturas necessárias na Microsoft Store para Empresas. Você precisa dos arquivos de licença codificados e não codificados. Para saber como fazer o download de um aplicativo licenciado offline, consulte Distribuir aplicativos offline.

  2. Execute os seguintes comandos do PowerShell como administrador. Você pode instalar a licença no final da fase de preparação. Você precisa editar as seguintes variáveis:

    • $contentID é o valor da 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 completa para o blob de licença no arquivo de licença Codificado (.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 em todos as quatro fases do teste de pacotes MSIX e ajuda de sintaxe sobre como usá-los em nosso repositório do GitHub. Esses 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 aplicativos e a anexação de aplicativos MSIX na Área de Trabalho Virtual do Azure: