Probar paquetes MSIX para la conexión de aplicaciones

En este artículo se muestra cómo montar paquetes MSIX fuera de Azure Virtual Desktop para ayudar a probar los paquetes para la conexión de aplicaciones. Las API que permiten el funcionamiento de la conexión de aplicaciones están disponibles para Windows 11 Enterprise y Windows 10 Enterprise. Estas API se pueden usar fuera de Azure Virtual Desktop para realizar pruebas, pero no hay ningún plano de administración para la conexión de aplicaciones MSIX o la conexión de aplicaciones fuera de Azure Virtual Desktop.

Para obtener más información sobre la conexión de aplicaciones MSIX y la conexión de aplicaciones, consulte Conexión de aplicaciones MSIX y conexión de aplicaciones en Azure Virtual Desktop.

Requisitos previos

Para poder probar un paquete para seguir las instrucciones de este artículo, necesita lo siguiente:

No necesita una implementación de Azure Virtual Desktop porque en este artículo se describe un proceso para realizar pruebas fuera de Azure Virtual Desktop.

Nota:

El Soporte técnico de Microsoft no admite el módulo de PowerShell CimDiskImage, por lo que si tiene algún problema, deberá enviar una solicitud en el repositorio de GitHub del módulo.

Fases

Para usar paquetes MSIX fuera de Azure Virtual Desktop, hay cuatro fases distintas que debe realizar en el orden siguiente:

  1. Fase
  2. Register
  3. Eliminar registro
  4. Quitar del "stage"

El almacenamiento provisional y la anulación de este son operaciones de nivel de equipo, mientras que el registro y la anulación de este son operaciones de nivel de usuario. Los comandos que necesita usar varían en función de la versión de PowerShell que use y de si las imágenes de disco están en formato CimFS, VHDX o VHD.

Nota:

Todos los paquetes MSIX incluyen un certificado. Su responsabilidad es asegurarse de que los certificados de los paquetes MSIX sean de confianza en su entorno.

Prepararse para almacenar provisionalmente un paquete MSIX

El script de ensayo prepara la máquina para recibir el paquete MSIX y monta el paquete correspondiente en la máquina.

Seleccione la pestaña correspondiente para la versión de PowerShell que usa.

Para agregar al "stage" paquetes mediante PowerShell 6 o posterior, debe ejecutar los siguientes comandos antes de las operaciones de agregar al "stage" para incorporar las funcionalidades del paquete de Windows Runtime a PowerShell.

  1. Abra un símbolo del sistema de PowerShell como administrador.

  2. Ejecute el siguiente comando para descargar e instalar el paquete de Windows Runtime. Solo tiene que ejecutar los siguientes comandos una 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. A continuación, ejecute el siguiente comando para que los componentes de Windows Runtime estén disponibles en 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
    

Agregar al "stage" un paquete MSIX

Ahora que ha preparado la máquina para agregar al "stage" paquetes MSIX, debe montar la imagen de disco y, a continuación, finalizar la agregación al "stage" del paquete MSIX.

Montar una imagen de disco

El proceso para montar una imagen de disco varía en función de si usa el formato CimFs, VHDX o VHD para la imagen de disco. Seleccione la pestaña correspondiente para el formato que usa.

Para montar una imagen de disco CimFS:

  1. Ejecute el comando siguiente en la misma sesión de 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
    
  2. Mantenga la variable $deviceId. Necesitará esta información posteriormente en este artículo.

  3. Cuando haya terminado, continúe con Finalización de la agregación al "stage" de una imagen de disco.

Finalización de la agregación al "stage" de una imagen de disco

Por último, debe ejecutar los siguientes comandos para que todos los formatos de imagen completen la agregación al "stage" de la imagen de disco. Este comando usa la variable $deviceId que creó al montar la imagen de disco en la sección anterior.

  1. En la misma sesión de PowerShell, recupere la información de la aplicación mediante la ejecución de los siguientes comandos:

    $manifest = Get-ChildItem -LiteralPath $deviceId -Recurse -File AppxManifest.xml
    $manifestFolder = $manifest.DirectoryName
    
  2. Obtenga el nombre completo del paquete MSIX y almacénelo en una variable mediante la ejecución de los siguientes comandos. Esta variable es necesaria para los pasos posteriores.

    $msixPackageFullName = $manifestFolder.Split('\')[-1]
    Write-Output $msixPackageFullName
    
  3. Cree un URI absoluto para la carpeta de manifiesto para la API del Administrador de paquetes mediante la ejecución de los siguientes comandos:

    $folderUri = $maniFestFolder.Replace('\\?\','file:\\\')
    $folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri
    
  4. Use el URI absoluto para agregar al "stage" el paquete de aplicación mediante la ejecución de los siguientes 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. Supervise el progreso de agregar al "stage" el paquete de aplicación mediante la ejecución de los siguientes comandos. El tiempo necesario para agregar al "stage" el paquete depende de su tamaño. La propiedad Status de la variable $stagingResult se RanToCompletion cuando se complete la agregación al "stage".

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

Una vez agregado al "stage" el paquete MSI, puede registrar el paquete MSIX.

Registrar un paquete MSIX

Para registrar un paquete MSIX, ejecute los siguientes comandos en la misma sesión de PowerShell. Este comando usa la variable $msixPackageFullName creada en una sección anterior.

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

Ahora que el paquete MSIX está registrado, la aplicación debe estar disponible para su uso en la sesión. Ahora puede abrir la aplicación para probar y solucionar problemas. Una vez que haya terminado, debe eliminar el registro y quitar del "stage" el paquete MSIX.

Eliminar el registro de un paquete MSIX

Una vez que haya terminado con el paquete MSIX y esté listo para quitarlo, primero debe anular su registro. Para anular el registro del paquete MSIX, ejecute los siguientes comandos en la misma sesión de PowerShell. Estos comandos vuelven a obtener el parámetro DeviceId del disco y quitan el paquete mediante la variable $msixPackageFullName creada en una sección 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

Quitar del "stage" un paquete MSIX

Por último, para quitar del "stage" el paquete MSIX, debe desmontar la imagen de disco y ejecutar el siguiente comando en la misma sesión de PowerShell para asegurarse de que el paquete aún no está registrado para ningún usuario. Este comando usa la variable $msixPackageFullName creada en una sección anterior.

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

Desmontar la imagen de discos

Para finalizar el proceso de quitar del "stage", debe desmontar los discos del sistema. El comando que necesita usar depende del formato de la imagen de disco. Seleccione la pestaña correspondiente para el formato que usa.

Para desmontar una imagen de disco CimFS, ejecute los siguientes comandos en la misma sesión de PowerShell:

Dismount-CimDiskImage -DeviceId $deviceId

Una vez que haya terminado de desmontar los discos, habrá quitado de forma segura el paquete MSIX.

Configuración de scripts de simulación para el agente de asociación de aplicaciones en formato MSIX

Si quiere agregar y quitar paquetes MSIX al dispositivo automáticamente, puede usar los comandos de PowerShell de este artículo para crear scripts que se ejecuten en el inicio, inicio de sesión, cierre de sesión y apagado. Para más información, consulte el artículo sobre cómo usar los scripts de inicio, apagado, inicio de sesión y cierre de sesión en una directiva de grupo. Debe asegurarse de que las variables necesarias para cada fase están disponibles en cada script.

Cree un script para cada fase:

  • El script de inicio ejecuta el proceso de agregar al "stage".
  • El script de inicio de sesión ejecuta el proceso de registro.
  • El script de cierre de sesión ejecuta el proceso de eliminar registro.
  • El script de apagado ejecuta el proceso de quitar del "stage".

Nota:

Puede usar el programador de tareas para ejecutar el script de agregar al "stage". Para ejecutar el script, establezca el desencadenador de tareas en Cuando el equipo arranque y habilite Ejecutar con los privilegios más elevados.

Uso de paquetes sin conexión

Si usa paquetes de Microsoft Store para Empresas o de Microsoft Store para Educación en dispositivos que no está conectados a Internet, debe obtener las licencias de paquete en Microsoft Store e instalarlas en el dispositivo para ejecutar correctamente la aplicación. Si el dispositivo está en línea y puede conectarse a Microsoft Store para Empresas, las licencias necesarias se deben descargar automáticamente pero, si está sin conexión, debe configurar las licencias de manera manual.

Para instalar los archivos de licencia, debe usar un script de PowerShell que llame a la clase MDM_EnterpriseModernAppManagement_StoreLicenses02_01 en el proveedor de puente WMI.

Aquí se muestra cómo configurar una licencia para su uso sin conexión:

  1. Descargue el paquete de la aplicación, la licencia y los marcos de trabajo requeridos de Microsoft Store para Empresas. Necesita los archivos de licencias codificados y sin codificar. Para obtener información sobre cómo descargar una aplicación con licencia sin conexión, consulte Distribuir aplicaciones sin conexión.

  2. Ejecute los siguientes comandos de PowerShell como administrador. Puede instalar la licencia al final de la fase de agregar al "stage". Debe editar las siguientes variables:

    • $contentID es el valor ContentID del archivo de licencia no codificado (.xml). Puede abrir el archivo de licencia en el editor de texto que prefiera.

    • $licenseBlob es la cadena entera para el blob de licencia en el archivo de licencia codificado (.bin). Puede abrir el archivo de licencia codificado en el editor de texto que prefiera.

      $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 demostración

Puede encontrar scripts de demostración para las cuatro fases de prueba de paquetes MSIX y la ayuda de sintaxis para cómo usarlos en nuestro repositorio de GitHub. Estos scripts funcionan con cualquier versión de PowerShell y cualquier formato de imagen de disco.

Pasos siguientes

Obtenga más información sobre la conexión de aplicaciones MSIX y la conexión de aplicaciones en Azure Virtual Desktop: