패키지 지원 프레임워크 - 작업 디렉터리 수정

조사

Windows 앱은 애플리케이션과 관련된 특정 디렉터리를 Windows App 컨테이너 폴더로 리디렉션합니다. 애플리케이션이 설치의 일부로 하위 폴더( )를 만들고 나중에 이 하위 폴더를 호출하는 경우 존재하지 C:\Program Files\Vendor\subfolder 않으므로 디렉터리를 찾지 못합니다.

PSF(패키지 지원 프레임워크)를 사용하여 Windows 앱 패키지를 개선하여 이 문제를 해결할 수 있습니다. 먼저 앱에서 요청하는 오류 및 디렉터리 경로를 식별해야 합니다.

Windows 앱 오류 캡처

결과 필터링은 애플리케이션 관련 오류를 더 쉽게 볼 수 있는 선택적 단계입니다. 이렇게 하려면 두 개의 필터 규칙을 만듭니다. 첫 번째는 애플리케이션 프로세스 이름에 대한 포함 필터이고, 두 번째는 성공하지 못한 결과를 포함하는 것입니다.

  1. SysInternals 프로세스 모니터를다운로드하여 C:\PSF\ProcessMonitor 디렉터리에 추출합니다.
  2. Windows 탐색기를 열고 추출된 SysInternals 프로세스 모니터 폴더로 이동합니다.
  3. SysInternals procmon.exe(프로세스 모니터) 파일을 두 번 클릭하여 앱을 시작합니다.
  4. UAC에서 메시지가 표시되면 단추를 선택합니다.
  5. 프로세스 모니터 필터 창에서 아키텍처로 레이블이 지정되는 첫 번째 드롭다운 메뉴를 선택합니다.
  6. 드롭다운 메뉴에서 프로세스 이름을 선택합니다.
  7. 다음 드롭다운 메뉴에서 값이 로 설정되어 있는지 확인합니다.
  8. 텍스트 필드에 앱의 프로세스 이름(예: PSFSample.exe)을 입력합니다. 앱 이름이 있는 프로세스 모니터 필터 Windows 예
  9. 추가 단추를 선택합니다.
  10. 프로세스 모니터 필터 창에서 프로세스 이름레이블이 인 첫 번째 드롭다운 메뉴를 선택합니다.
  11. 드롭다운 메뉴에서 결과를 선택합니다.
  12. 다음 드롭다운 메뉴에서 해당 메뉴를 선택하고 드롭다운 메뉴에서 이 아닌지 선택합니다.
  13. 텍스트 필드에 SUCCESS를 입력합니다. 결과가 있는 프로세스 모니터 필터 Windows 예
  14. 추가 단추를 선택합니다.
  15. 확인 단추를 선택합니다.
  16. Windows 앱을 시작하고, 오류를 트리거하고, Windows 앱을 닫습니다.

Windows 앱 실패 로그 검토

Windows 앱 프로세스를 캡처한 후 결과를 조사하여 실패가 작업 디렉터리와 관련되어 있는지 확인해야 합니다.

  1. 위의 표에 설명된 오류를 검색하여 SysInternals 프로세스 모니터 결과를 검토합니다.
  2. 아래 이미지와 같이 "C:\Program Files\WindowsApps\...\" 외부의 디렉터리를 대상으로 하는 특정 앱에 대해 "원하는 액세스: ..." 세부 정보가 있는 "이름을 찾을 수 없습니다" 결과가 표시된 경우 작업 디렉터리와 관련된 오류를 성공적으로 식별한 경우 PSF 지원 - 파일 시스템 액세스 문서를 사용하여 PSF 수정 사항을 앱에 적용하는 방법에 대한 지침을 확인합니다. 디렉터리에 쓰지 못한 경우 SysInternals 프로세스 모니터에서 감시되는 오류 메시지를 표시합니다.

해결 방법

Windows 앱은 애플리케이션과 관련된 특정 디렉터리를 Windows App 컨테이너 폴더로 리디렉션합니다. 애플리케이션이 설치의 일부로 하위 폴더( )를 만들고 나중에 이 하위 폴더를 호출하는 경우 존재하지 C:\Program Files\Vendor\subfolder 않으므로 디렉터리를 찾지 못합니다.

잘못된 작업 디렉터리를 참조하는 Windows 앱과 관련된 문제를 해결하려면 다음 네 단계를 수행해야 합니다.

  1. 로컬 디렉터리에 Windows 앱 준비
  2. Config.json을 만들고 필요한 PSF 파일 삽입
  3. Windows AppxManifest 파일 업데이트
  4. Windows 앱 다시 패키지 및 서명

위의 단계에서는 Windows 앱의 콘텐츠를 로컬 준비된 디렉터리에 추출하고, PSF 픽스업 파일을 준비된 Windows App 디렉터리에 삽입하고, PSF 시작 관리자를 가리키도록 애플리케이션 시작 관리자 구성한 다음, PSF 시작 관리자를 작업 디렉터리를 지정하는 앱으로 리디렉션하도록 PSF config.json 파일을 구성하는 지침을 제공합니다.

필수 도구 다운로드 및 설치

이 프로세스는 다음 도구를 검색하고 사용하는 과정을 안내합니다.

  • NuGet 클라이언트 도구
  • 패키지 지원 프레임워크
  • Windows 10 SDK(최신 버전)
  • SysInternals 프로세스 모니터

다음은 필요한 도구를 다운로드하고 설치하는 단계별 지침을 제공합니다.

  1. NuGet 클라이언트 도구의최신(미리 보기가 아닌) 버전을 다운로드하고 폴더에nuget.exe 저장합니다.

  2. 관리 PowerShell 창에서 다음을 실행하여 Nuget을 사용하여 패키지 지원 프레임워크를 다운로드합니다.

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    
  3. Windows 10 소프트웨어 개발 Toolkit(Win 10 SDK) 를다운로드하여 설치합니다.

    1. Win 10 SDK를 다운로드합니다.
    2. 이전 단계에서 다운로드한 winsdksetup.exe 실행합니다.
    3. 다음 단추를 선택합니다.
    4. 설치를 위해 다음 세 가지 기능만 선택합니다.
      • 데스크톱 앱용 Windows SDK 서명 도구
      • UWP C++ 앱용 Windows SDK
      • UWP 앱 지역화를 위한 Windwos SDK
    5. 설치 단추를 선택합니다.
    6. 확인 단추를 선택합니다.

Windows 앱 준비

Windows 앱을 스테이징하면 Windows 앱의 콘텐츠를 추출/압축을 풀고 로컬 디렉터리로 압축을 풉니다. Windows 앱의 압축이 스테이징 위치로 압축 해제되면 원치 않는 환경을 수정하는 PSF 픽스업 파일을 삽입할 수 있습니다.

  1. 관리 PowerShell 창을 엽니다.

  2. 특정 앱 파일을 대상으로 하는 다음 변수를 설정하고 SDK 버전을 Windows 10.

    $AppPath          = "C:\PSF\SourceApp\PSFSampleApp.msix"         ## Path to the MSIX App Installer
    $StagingFolder    = "C:\PSF\Staging\PSFSampleApp"                ## Path to where the MSIX App will be staged
    $OSArchitecture   = "x$((gwmi Win32_Processor).AddressWidth)"    ## Operating System Architecture
    $Win10SDKVersion  = "10.0.19041.0"                               ## Latest version of the Win10 SDK
    
  3. 다음 PowerShell cmdlet을 실행하여 Windows 앱의 압축을 스테이징 폴더로 압축 해제합니다.

    ## Sets the directory to the Windows 10 SDK
    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    
    ## Unpackages the Windows App to the staging folder
    .\makeappx.exe unpack /p "$AppPath" /d "$StagingFolder"
    

필요한 PSF 파일 만들기 및 삽입

Windows 앱에 정정 작업을 적용하려면 config.json 파일을 만들고 실패한 Windows App 시작 관리자 대한 정보를 제공해야 합니다. 문제가 발생하는 Windows 앱 시작 관리자가 여러 개 있는 경우 config.json 파일을 여러 항목으로 업데이트할 수 있습니다.

config.json 파일을 업데이트한 후 config.json 파일 및 지원 PSF 픽스업 파일을 Windows App 패키지의 루트로 이동해야 합니다.

  1. Visual Studio Code(VS Code) 또는 다른 텍스트 편집기를 엽니다.

  2. VS Code 맨 위에 있는 파일 메뉴를 선택하고 드롭다운 메뉴에서 새 파일을 선택하여 새 파일을 만듭니다.

  3. VS Code 창 맨 위에 있는 파일 메뉴를 선택하고 드롭다운 메뉴에서 저장을 선택하여 파일을 config.json으로 저장합니다. 다른 이름으로 저장 창에서 Windows 앱 스테이징 디렉터리(C:\PSF\Staging\PSFSampleApp)로이동하고 파일 이름을 설정합니다. 저장 단추를 선택합니다.

  4. 다음 코드를 새로 만든 config.json 파일에 복사합니다.

    {
        "applications": [
            {
                "id": "",
                "executable": "",
                "workingDirectory": ""
            }
        ],
        "processes": [
            {
                "executable": ""
            }
        ]
    }
    
  5. VS Code 또는 다른 텍스트 편집기를 사용하여 Windows 앱 준비 폴더(C:\PSF\Staging\PSFSampleApp\AppxManifest.xml)에 있는 준비된 Windows AppxManifest 파일을 엽니다.

    <Applications>
        <Application Id="PSFSAMPLE" Executable="VFS\ProgramFilesX64\PS Sample App\PSFSample.exe" EntryPoint="Windows.FullTrustApplication">
        <uap:VisualElements BackgroundColor="transparent" DisplayName="PSFSample" Square150x150Logo="Assets\StoreLogo.png" Square44x44Logo="Assets\StoreLogo.png" Description="PSFSample">
            <uap:DefaultTile Wide310x150Logo="Assets\StoreLogo.png" Square310x310Logo="Assets\StoreLogo.png" Square71x71Logo="Assets\StoreLogo.png" />
        </uap:VisualElements>
        </Application>
    </Applications>
    
  6. 에 있는 AppxManifest.xml 파일에 있는 ID 필드의 값을 config.json 파일의 애플리케이션 ID 필드에 복사합니다. AppxManifest 파일 내에서 ID의 위치를 둘러싸는 이미지입니다.

  7. 에 있는 AppxManifest.xml 파일에 있는 실행 파일 필드에서 config.json 파일의 애플리케이션 실행 파일 필드로 패키지 상대 경로를 복사합니다. AppxManifest 파일 내에서 실행 파일의 위치를 둘러싸는 이미지입니다.

  8. 에 있는 AppxManifest.xml 파일에 있는 실행 파일 필드에서 패키지 상대 부모 경로를 config.json 파일의 Applications WorkingDirectory 필드로 복사합니다. AppxManifest 파일 내에서 작업 디렉터리 위치를 둘러싸는 이미지입니다.

  9. 에 있는 AppxManifest.xml 파일에 있는 실행 파일 필드에서 config.json 파일의 프로세스 실행 파일 필드에 실행 파일 이름을 복사합니다. AppxManifest 파일 내에서 프로세스 실행 파일의 위치를 둘러싸는 이미지입니다.

  10. 업데이트된 config.json 파일을 저장합니다.

    {
        "applications": [
            {
            "id": "PSFSample",
            "executable": "VFS/ProgramFilesX64/PS Sample App/PSFSample.exe",
            "workingDirectory": "VFS/ProgramFilesX64/PS Sample App/"
            }
        ],
        "processes": [
            {
            "executable": "PSFSample"
            }
        ]
    }
    
  11. 애플리케이션 실행 파일 아키텍처에 따라 패키지 지원 프레임워크에서 다음 세 개의 파일을 준비된 Windows 앱의 루트에 복사합니다. 다음 파일은 .\Microsoft.PackageSupportFramework 내에 있습니다. 버전 > \bin.

    애플리케이션(x64) 애플리케이션(x86)
    PSFLauncher64.exe PSFLauncher32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe

Appxmanifest.xml 업데이트

app.config 파일을 만들고 업데이트 한 후에는 app.config에 포함 된 각 Windows 앱 시작 관리자에 대해 Windows 앱의 AppxManifest.xml 업데이트 해야 합니다. Appxmanifest.xml의 응용 프로그램은 이제 응용 프로그램 아키텍처와 관련 된 PSFLauncher.exe 를 대상으로 해야 합니다.

  1. 파일 탐색기를 열고 준비 된 MSIX 앱 폴더 (C:\PSF\Staging\PSFSampleApp)로 이동 합니다.

  2. AppxManifest.xml를 마우스 오른쪽 단추로 클릭 하 고 드롭다운 메뉴에서 코드로 열기 를 선택 합니다. 필요에 따라 다른 텍스트 편집기를 사용 하 여 열 수 있습니다.

  3. 다음 정보를 사용 하 여 AppxManifest.xml 파일을 업데이트 합니다.

    <Package ...>
    ...
    <Applications>
        <Application Id="PSFSample"
                    Executable="PSFLauncher32.exe"
                    EntryPoint="Windows.FullTrustApplication">
        ...
        </Application>
    </Applications>
    </Package>
    

응용 프로그램을 다시 패키지 합니다.

모든 수정 사항이 적용 되었으므로 이제 Windows 앱을 msix으로 다시 패키지 하 고 코드 서명 인증서를 사용 하 여 서명할 수 있습니다.

  1. 관리 PowerShell 창을 엽니다.

  2. 다음 변수를 설정 합니다.

    $AppPath          = "C:\PSF\SourceApp\PSFSampleApp_Updated.msix" ## Path to the MSIX App Installer
    $CodeSigningCert  = "C:\PSF\Cert\CodeSigningCertificate.pfx"     ## Path to your code signing certificate
    $CodeSigningPass  = "<Password>"                                 ## Password used by the code signing certificate
    $StagingFolder    = "C:\PSF\Staging\PSFSampleApp"                ## Path to where the MSIX App will be staged
    $OSArchitecture   = "x$((gwmi Win32_Processor).AddressWidth)"    ## Operating System Architecture
    $Win10SDKVersion  = "10.0.19041.0"                               ## Latest version of the Win10 SDK
    
  3. 다음 PowerShell cmdlet을 실행 하 여 준비 폴더에서 Windows 앱을 다시 압축 합니다.

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
    
  4. 다음 PowerShell cmdlet을 실행 하 여 Windows 앱에 서명 합니다.

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\signtool.exe sign /v /fd sha256 /f $CodeSigningCert /p $CodeSigningPass $AppPath