다음을 통해 공유


앱 연결에 대한 MSIX 패키지 테스트

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

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

필수 구성 요소

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

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

참고

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

단계

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

  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 패키지를 안전하게 제거했습니다.

App Attach 에이전트에 대한 시뮬레이션 스크립트 설정

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

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

  • 시작 스크립트는 스테이지 프로세스를 실행합니다.
  • 로그온 스크립트는 레지스터 프로세스를 실행합니다.
  • 로그오프 스크립트는 등록 취소 프로세스를 실행합니다.
  • 종료 스크립트는 디스테이지 프로세스를 실행합니다.

참고

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

오프라인 패키지 사용

인터넷에 연결되지 않은 디바이스에서 패키지를 사용하는 경우 앱을 성공적으로 실행하려면 패키지 라이선스가 디바이스에 설치되어 있는지 확인해야 합니다. 디바이스가 온라인 상태이면 필요한 라이선스가 자동으로 다운로드됩니다.

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

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

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

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

다음 단계

Azure Virtual Desktop의 앱 연결에 대해 자세히 알아보세요.