Compartir a través de


Prueba de paquetes MSIX para la asociació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 asociación de aplicaciones. Las API que power App Attach están disponibles para Windows 11 Empresas 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 asociación de aplicaciones fuera de Azure Virtual Desktop.

Para obtener más información sobre la asociación de aplicaciones, consulte Asociació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:

Soporte técnico de Microsoft no admite el módulo CimDiskImage de PowerShell, 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. Etapa
  2. Registrarse
  3. Anulación del registro
  4. Volcado de datos

El almacenamiento provisional y el almacenamiento provisional son operaciones de nivel de máquina, mientras que el registro y el registro 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. Es responsable de asegurarse de que los certificados de los paquetes MSIX son de confianza en su entorno.

Preparación para almacenar provisionalmente un paquete MSIX

El script de almacenamiento provisional 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 preconfigurar paquetes con PowerShell 6 o versiones posteriores, debe ejecutar los siguientes comandos antes de las operaciones de almacenamiento provisional para llevar 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 equipo.

    #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
    

Fase de un paquete MSIX

Ahora que ha preparado la máquina para almacenar en fase los paquetes MSIX, debe montar la imagen de disco y, a continuación, finalizar el almacenamiento provisional del paquete MSIX.

Montaje de 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 está usando.

Para montar una imagen de disco CimFS:

  1. En la misma sesión de PowerShell, ejecute el siguiente 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. Mantenga la variable $deviceId. Necesitará esta información más adelante en este artículo.

  3. Cuando haya terminado, vaya a Finalizar el almacenamiento provisional de una imagen de disco.

Finalizar el almacenamiento provisional de una imagen de disco

Por último, debe ejecutar los siguientes comandos para todos los formatos de imagen para completar el almacenamiento provisional de la imagen de disco. Este comando usa la $deviceId variable 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 ejecutando los siguientes comandos:

    $manifest = Get-ChildItem -LiteralPath $deviceId -Recurse -File AppxManifest.xml
    $manifestFolder = $manifest.DirectoryName
    
  2. Obtenga el nombre completo del paquete MSIX y guárdelo 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 almacenar provisionalmente 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 del almacenamiento provisional del paquete de aplicación mediante la ejecución de los siguientes comandos. El tiempo necesario para almacenar provisionalmente el paquete depende de su tamaño. La Status propiedad de la $stagingResult variable será RanToCompletion cuando se complete el almacenamiento provisional.

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

Una vez que el paquete MSI está almacenado provisionalmente, puede registrar el paquete MSIX.

Registro de un paquete MSIX

Para registrar un paquete MSIX, ejecute los siguientes comandos en la misma sesión de PowerShell. Este comando usa la $msixPackageFullName variable 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 realizar pruebas y solucionar problemas. Una vez que haya terminado, debe anular el registro y eliminar el paquete MSIX.

Anulación del registro de un paquete MSIX

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

Eliminación de un paquete MSIX

Por último, para desmontar 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 todavía no está registrado para ningún usuario. Este comando usa la $msixPackageFullName variable creada en una sección anterior.

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

Desmontar la imagen de discos

Para finalizar el proceso de desasocar, es preciso 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 está usando.

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, ha quitado el paquete MSIX de forma segura.

Configuración de scripts de simulación para el agente de Asociación de aplicaciones

Si desea 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 al inicio, inicio de sesión, cierre de sesión y apagado. Para obtener más información, consulte Uso de scripts de inicio, apagado, inicio de sesión y cierre de sesión en 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 fase .
  • El script de inicio de sesión ejecuta el proceso de registro .
  • El script de cierre de sesión ejecuta el proceso de anulación del registro .
  • El script de apagado ejecuta el proceso de eliminación .

Nota:

Puede usar el programador de tareas para ejecutar el script de fase. Para ejecutar el script, establezca el desencadenador de tareas en Cuando se inicia el equipo y habilite Ejecutar con los privilegios más altos.

Uso de paquetes sin conexión

Si usa paquetes en dispositivos que no están conectados a Internet, debe asegurarse de que las licencias de paquete están instaladas en el dispositivo para ejecutar correctamente la aplicación. Si el dispositivo está en línea, las licencias necesarias deben descargarse automáticamente.

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

A continuación 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 necesarios de la Microsoft Store para Empresas. Necesita los archivos de licencia codificados y no codificados. Para obtener información sobre cómo descargar una aplicación con licencia sin conexión, consulte Distribución de aplicaciones sin conexión.

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

    • $contentID es el valor de ContentID del archivo de licencia no codificado (.xml). Puede abrir el archivo de licencia en un editor de texto de su elección.

    • $licenseBlob es la cadena completa del blob de licencias en el archivo de licencia codificado (.bin). Puede abrir el archivo de licencia codificado en un editor de texto de su elección.

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

Más información sobre la asociación de aplicaciones en Azure Virtual Desktop: