Тестирование пакетов MSIX для подключения приложений

В этой статье показано, как подключить пакеты MSIX за пределами виртуального рабочего стола Azure, чтобы протестировать пакеты для подключения приложений. ИНТЕРФЕЙСы API, присоединенные к power app, доступны для Windows 11 Корпоративная и Windows 10 Корпоративная. Эти API можно использовать за пределами виртуального рабочего стола Azure для тестирования, однако для подключения приложений MSIX или подключения приложений за пределами виртуального рабочего стола Azure нет уровня управления.

Дополнительные сведения о присоединении приложений MSIX и присоединении приложений см. в статье MSIX App attach and app attach in Azure Virtual Desktop.

Необходимые компоненты

Прежде чем протестировать пакет, чтобы выполнить инструкции в этой статье, вам потребуется следующее:

  • Устройство под управлением Windows 11 Корпоративная или Windows 10 Корпоративная.

  • Приложение, развернутое из формата MSIX, в изображение, которое можно использовать с присоединением приложения. Узнайте, как создать образ MSIX для использования с подключением приложений в Виртуальном рабочем столе Azure.

  • Если вы используете образ CimFS, необходимо установить модуль CimDiskImage PowerShell.

  • Учетная запись пользователя с разрешением локального администратора на устройстве, которое вы используете для тестирования пакета MSIX.

Развертывание виртуального рабочего стола Azure не требуется, так как в этой статье описывается процесс тестирования за пределами виртуального рабочего стола Azure.

Примечание.

служба поддержки Майкрософт не поддерживает модуль PowerShell CimDiskImage, поэтому при возникновении проблем вам потребуется отправить запрос в репозитории GitHub модуля.

Этапы

Чтобы использовать пакеты MSIX за пределами виртуального рабочего стола Azure, необходимо выполнить четыре этапа, которые необходимо выполнить в следующем порядке:

  1. Этап
  2. Регистр
  3. Отмена регистрации
  4. Отмена размещения

Промежуточные и дестационные операции — это операции на уровне компьютера, а регистрация и отмена регистрации — это операции на уровне пользователя. Команды, которые необходимо использовать, зависят от используемой версии PowerShell и того, находятся ли образы дисков в CimFS, VHDX или VHD-формате.

Примечание.

Все пакеты MSIX включают сертификат. Вы несете ответственность за обеспечение доверия сертификатов для пакетов MSIX в вашей среде.

Подготовка к этапу пакета MSIX

Промежуточный скрипт подготавливает компьютер к получению пакета MSIX и подключает соответствующий пакет к компьютеру.

Выберите соответствующую вкладку для используемой версии PowerShell.

Чтобы выполнить этапы пакетов с помощью PowerShell 6 или более поздней версии, необходимо выполнить следующие команды перед промежуточными операциями, чтобы перенести возможности пакета среда выполнения Windows в PowerShell.

  1. Откройте запрос PowerShell от имени администратора.

  2. Выполните следующую команду, чтобы скачать и установить пакет среда выполнения Windows. Для каждого компьютера необходимо выполнить только следующие команды.

    #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. Затем выполните следующую команду, чтобы сделать компоненты среда выполнения Windows доступными в 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
    

Этап пакета MSIX

После подготовки компьютера к этапу пакетов MSIX необходимо подключить образ диска, а затем завершить промежуточное выполнение пакета MSIX.

Подключение образа диска

Процесс подключения образа диска зависит от того, используется ли формат CimFs, VHDX или VHD для образа диска. Выберите соответствующую вкладку для используемого формата.

Чтобы подключить образ диска CimFS, выполните приведенные ниже действия.

  1. В том же сеансе 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. Сохраните переменную $deviceId. Эти сведения потребуются позже в данной статье.

  3. По завершении перейдите к завершению промежуточного образа диска.

Завершение промежуточного образа диска

Наконец, необходимо выполнить следующие команды для всех форматов образов, чтобы завершить промежуточное выполнение образа диска. Эта команда использует $deviceId переменную, созданную при подключении образа диска в предыдущем разделе.

  1. В том же сеансе PowerShell получите сведения о приложении, выполнив следующие команды:

    $manifest = Get-ChildItem -LiteralPath $deviceId -Recurse -File AppxManifest.xml
    $manifestFolder = $manifest.DirectoryName
    
  2. Получите полное имя пакета MSIX и сохраните его в переменной, выполнив следующие команды. Эта переменная необходима для последующих шагов.

    $msixPackageFullName = $manifestFolder.Split('\')[-1]
    Write-Output $msixPackageFullName
    
  3. Создайте абсолютный универсальный код ресурса (URI) для папки манифеста для API диспетчер пакетов, выполнив следующие команды:

    $folderUri = $maniFestFolder.Replace('\\?\','file:\\\')
    $folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri
    
  4. Используйте абсолютный универсальный код ресурса (URI) для этапа пакета приложения, выполнив следующие команды:

    $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. Отслеживайте промежуточный ход выполнения пакета приложения, выполнив следующие команды. Время, необходимое для этапа пакета, зависит от его размера. Свойство Status переменной $stagingResult будет происходить RanToCompletion после завершения промежуточного выполнения.

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

После завершения пакета MSI можно зарегистрировать пакет MSIX.

Регистрация пакета MSIX

Чтобы зарегистрировать пакет MSIX, выполните следующие команды в том же сеансе PowerShell. Эта команда использует $msixPackageFullName переменную, созданную в предыдущем разделе.

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

После регистрации пакета MSIX приложение должно быть доступно для использования в сеансе. Теперь можно открыть приложение для тестирования и устранения неполадок. После завершения необходимо отменить регистрацию и отвести пакет MSIX.

Отмена регистрации пакета MSIX

После завершения работы с пакетом MSIX и готовы удалить его, сначала необходимо отменить регистрацию. Чтобы отменить регистрацию пакета MSIX, выполните следующие команды в том же сеансе PowerShell. Эти команды снова получают параметр диска DeviceId и удаляют пакет с помощью $msixPackageFullName переменной, созданной в предыдущем разделе.

$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

Destage a MSIX package

Наконец, чтобы отключить пакет MSIX, необходимо отключить образ диска, выполните следующую команду в том же сеансе PowerShell, чтобы убедиться, что пакет еще не зарегистрирован для любого пользователя. Эта команда использует $msixPackageFullName переменную, созданную в предыдущем разделе.

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

Отключение образа дисков

Чтобы завершить процесс дедестов, необходимо отключить диски из системы. Команда, используемая для использования, зависит от формата образа диска. Выберите соответствующую вкладку для используемого формата.

Чтобы отключить образ диска CimFS, выполните следующие команды в том же сеансе PowerShell:

Dismount-CimDiskImage -DeviceId $deviceId

После завершения отключения дисков вы безопасно удалили пакет MSIX.

Настройка сценариев моделирования для агента подключения приложения MSIX

Если вы хотите автоматически добавлять и удалять пакеты MSIX на устройство, можно использовать команды PowerShell в этой статье для создания скриптов, выполняемых при запуске, входе в систему, выходе и завершении работы. Дополнительные сведения см. в статье "Использование скриптов запуска, завершения работы, входа и выхода в групповую политику". Необходимо убедиться, что все переменные, необходимые для каждого этапа, доступны в каждом сценарии.

Вы создаете скрипт для каждого этапа:

  • Скрипт запуска запускает процесс этапа .
  • Скрипт входа запускает процесс регистрации .
  • Скрипт выхода запускает процесс отмены регистрации .
  • Скрипт завершения работы запускает процесс дестажа .

Примечание.

Планировщик задач можно использовать для запуска скрипта этапа. Чтобы запустить скрипт, установите триггер задачи на момент запуска компьютера и включите запуск с высокими привилегиями.

Использование пакетов в автономном режиме

Если вы используете пакеты из Microsoft Store для бизнеса или Microsoft Store для образования на устройствах, которые не подключены к Интернету, необходимо получить лицензии на пакет из Microsoft Store и установить их на устройстве, чтобы успешно запустить приложение. Если устройство подключено к сети и может подключиться к Microsoft Store для бизнеса, необходимые лицензии должны загружаться автоматически, но если вы находитесь в автономном режиме, необходимо вручную настроить лицензии.

Чтобы установить файлы лицензий, необходимо использовать сценарий PowerShell, который вызывает MDM_EnterpriseModernAppManagement_StoreLicenses02_01 класс в поставщике моста WMI.

Вот как настроить лицензию для автономного использования:

  1. Скачайте пакет приложения, лицензию и необходимые платформы из Microsoft Store для бизнеса. Вам нужны как закодированные, так и незакодированные файлы лицензий. Сведения о том, как скачать автономное приложение, см. в статье "Распространение автономных приложений".

  2. Выполните следующие команды PowerShell от имени администратора. Вы можете установить лицензию в конце промежуточного этапа. Необходимо изменить следующие переменные:

    • $contentID — это значение ContentID из незакодированного файла лицензии (.xml). Вы можете открыть файл лицензии в любом текстовом редакторе по своему усмотрению.

    • $licenseBlob — это вся строка для большого двоичного объекта лицензии в кодированном файле лицензии (.bin). Вы можете открыть закодированный файл лицензии в любом текстовом редакторе по своему усмотрению.

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

Демонстрационные сценарии

Демонстрационные сценарии для всех четырех этапов тестирования пакетов MSIX и синтаксиса помогут использовать их в репозитории GitHub. Эти скрипты работают с любой версией PowerShell и любым форматом образа диска.

Следующие шаги

Дополнительные сведения о присоединении приложений MSIX и присоединении приложений в Виртуальном рабочем столе Azure: