다음을 통해 공유


앱 연결용 MSIX 패키지 테스트

이 문서에서는 Azure Virtual Desktop 외부에서 MSIX 패키지를 탑재하여 앱 연결 패키지를 테스트하는 방법을 보여줍니다. 앱 연결을 구동하는 API는 Windows 11 Enterprise 및 Windows 10 Enterprise에서 사용할 수 있습니다. 이러한 API는 테스트를 위해 Azure Virtual Desktop 외부에서 사용할 수 있지만 Azure Virtual Desktop 외부에서 앱 연결 또는 MSIX 앱 연결을 위한 관리 평면은 없습니다.

앱 연결 및 MSIX 앱 연결에 대한 자세한 내용은 Azure Virtual Desktop에서 앱 연결 및 MSIX 앱 연결을 참조 하세요.

필수 조건

이 문서의 지침을 따라 패키지를 테스트하려면 다음 항목이 필요합니다.

이 문서에서는 Azure Virtual Desktop 외부에서 테스트하는 프로세스를 설명하므로 Azure Virtual Desktop 배포가 필요하지 않습니다.

참고 항목

Microsoft 지원은 CimDiskImage PowerShell 모듈을 지원하지 않으므로 문제가 발생하면 모듈의 GitHub 리포지토리에서 요청을 제출해야 합니다.

단계

Azure Virtual Desktop 외부에서 MSIX 패키지를 사용하려면 다음 순서에 따라 수행해야 하는 4가지 고유 단계가 있습니다.

  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. 이어서, 다음 명령을 실행하여 PowerShell에서 Windows 런타임 구성 요소를 사용할 수 있도록 합니다.

    #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. 다음 명령을 실행하여 패키지 관리자 API의 매니페스트 폴더에 대한 절대 URI를 만듭니다.

    $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. 다음 명령을 실행하여 애플리케이션 패키지의 스테이징 진행률을 모니터링합니다. 패키지를 스테이징하는 데 걸리는 시간은 해당 크기에 따라 달라집니다. $stagingResult 변수의 Status 속성은 스테이징이 완료되면 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

MSIX 패키지 스테이징 취소

마지막으로 MSIX 패키지의 스테이징을 취소하려면 디스크 이미지를 분리하고 동일한 PowerShell 세션에서 다음 명령을 실행하여 패키지가 여전히 등록되어 있는 사용자가 없도록 해야 합니다. 이 명령은 이전 섹션에서 만든 $msixPackageFullName 변수를 사용합니다.

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

디스크 이미지 분리

스테이징 취소 프로세스를 완료하려면 시스템에서 디스크를 분리해야 합니다. 사용해야 하는 명령은 디스크 이미지의 형식에 따라 달라집니다. 사용 중인 형식에 관련된 탭을 선택합니다.

CimFS 디스크 이미지를 분리하려면 동일한 PowerShell 세션에서 다음 명령을 실행합니다.

Dismount-CimDiskImage -DeviceId $deviceId

디스크 분리가 완료되면 MSIX 패키지를 안전하게 제거한 것입니다.

MSIX app attach 에이전트에 대한 시뮬레이션 스크립트 설정

MSIX 패키지를 자동으로 디바이스에 추가 및 제거하려는 경우 이 문서의 PowerShell 명령을 사용하여 시작, 로그온, 로그오프 및 종료 시 실행되는 스크립트를 만들 수 있습니다. 자세한 내용은 그룹 정책에서 시작, 종료, 로그온 및 로그오프 스크립트 사용을 참조하세요. 각 스크립트에서 각 단계에 필요한 변수를 모두 사용할 수 있는지 확인해야 합니다.

각 단계에 대한 스크립트를 만듭니다.

  • 시작 스크립트는 ‘stage’ 프로세스를 실행합니다.
  • 로그온 스크립트는 ‘register’ 프로세스를 실행합니다.
  • 로그오프 스크립트는 ‘deregister’ 프로세스를 실행합니다.
  • 종료 스크립트는 ‘destage’ 프로세스를 실행합니다.

참고 항목

작업 스케줄러를 사용하여 스테이징 스크립트를 실행할 수 있습니다. 스크립트를 실행하려면 작업 트리거를 컴퓨터가 시작될 때로 설정하고 가장 높은 권한으로 실행을 활성화합니다.

오프라인으로 패키지 사용

비즈니스용 Microsoft 스토어 또는 교육용 Microsoft 스토어의 패키지를 사용하는 경우 또는 인터넷에 연결되지 않은 디바이스에서 패키지를 사용하는 경우에는 Microsoft Store에서 패키지 라이선스를 확보하여 디바이스에 설치해야 앱을 성공적으로 실행할 수 있습니다. 디바이스가 온라인 상태이고 비즈니스용 Microsoft 스토어에 연결할 수 있으면 필요한 라이선스가 자동으로 다운로드되지만 오프라인이면 라이선스를 수동으로 설정해야 합니다.

라이선스 파일을 설치하려면 WMI Bridge 공급자에서 MDM_EnterpriseModernAppManagement_StoreLicenses02_01 클래스를 호출하는 PowerShell 스크립트를 사용해야 합니다.

오프라인 사용을 위해 라이선스를 설정하는 방법은 다음과 같습니다.

  1. 비즈니스용 Microsoft 스토어에서 앱 패키지, 라이선스 및 필수 프레임워크를 다운로드합니다. 인코딩된 라이선스 파일과 인코딩되지 않은 라이선스 파일이 모두 필요합니다. 오프라인 라이선스 앱을 다운로드하는 방법을 알아보려면 오프라인 앱 배포를 참조하세요.

  2. 관리자 권한으로 다음 PowerShell 명령을 실행합니다. 스테이징 단계의 끝에서 라이선스를 설치할 수 있습니다. 다음 변수를 편집해야 합니다.

    • $contentID는 인코딩되지 않은 라이선스 파일(.xml)의 ContentID 값입니다. 원하는 텍스트 편집기에서 라이선스 파일을 열 수 있습니다.

    • $licenseBlob은 인코딩된 라이선스 파일(.bin)의 라이선스 BLOB에 대한 전체 문자열입니다. 원하는 텍스트 편집기에서 인코딩된 라이선스 파일을 열 수 있습니다.

      $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 패키지를 테스트하기 위한 4개 스테이지 모두에 대한 데모 스크립트 및 사용법에 대한 구문 도움말을 GitHub 리포지토리에서 찾을 수 있습니다. 이러한 스크립트는 모든 버전의 PowerShell 및 모든 디스크 이미지 형식에서 작동합니다.

다음 단계

Azure Virtual Desktop에서 앱 연결 및 MSIX 앱 연결에 대해 자세히 알아봅니다.