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

조사

Windows 앱은 애플리케이션과 관련된 특정 디렉터리를 Windows 앱 컨테이너 폴더로 리디렉션합니다. 애플리케이션이 설치의 일부로 하위 폴더(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. 다음 드롭다운 메뉴에서 값이 is로 설정되어 있는지 확인합니다.
  8. 텍스트 필드에 앱의 프로세스 이름(예: PSFSample.exe)을 입력합니다. Example of the Process Monitor Filter Windows with App Name
  9. 추가 단추를 선택합니다.
  10. 프로세스 모니터 필터 창에서 프로세스 이름이라는 레이블이 지정된 첫 번째 드롭다운 메뉴를 선택합니다.
  11. 드롭다운 메뉴에서 결과를 선택합니다.
  12. 다음 드롭다운 메뉴에서 선택하고 드롭다운 메뉴에서 선택 하지 않습니다 .
  13. 텍스트 필드에 SUCCESS를 입력합니다. Example of the Process Monitor Filter Windows with Result
  14. 추가 단추를 선택합니다.
  15. 확인 단추를 선택합니다.
  16. Windows 앱을 시작하고, 오류를 트리거하고, Windows 앱을 닫습니다.

Windows 앱 오류 로그 검토

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

  1. 위의 표에 설명된 오류를 검색하여 SysInternals 프로세스 모니터 결과를 검토합니다.
  2. 결과에 "C:\Program Files\WindowsApps\...\"(아래 이미지와 같이) 외부의 디렉터리를 대상으로 하는 특정 앱에 대해 "원하는 액세스: ..." 세부 정보가 포함된 "이름을 찾을 수 없음" 결과가 표시되면 작업 디렉터리와 관련된 오류를 성공적으로 식별한 경우 PSF 지원 - 파일 시스템 액세스 문서를 사용하여 PSF 수정을 앱에 적용하는 방법에 대한 지침을 참조하세요. Displays the error message witnessed in the SysInternals Process Monitor for failure to write to directory.

해결 방법

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

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

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

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

필수 도구 다운로드 및 설치

이 프로세스는 다음 도구의 검색 및 사용을 안내합니다.

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

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

  1. NuGet 클라이언트 도구의 최신(미리 보기가 아닌) 버전을 다운로드하고 폴더에 C:\PSF\nugetnuget.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 앱 패키지의 루트로 이동해야 합니다.

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

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

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

  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. config.json 파일의 애플리케이션 ID 필드에 있는 AppxManifest.xml 파일에 있는 Package.Applications.Application ID 필드의 값을 복사합니다. Image circling the location of the ID within the AppxManifest file.

  7. AppxManifest.xml 파일에 있는 실행 파일의 패키지 상대 경로를 config.json 파일 Package.Applications.Application 의 애플리케이션 실행 파일 필드로 복사합니다. Image circling the location of the executable within the AppxManifest file.

  8. config.json 파일의 Applications WorkingDirectory 필드에 있는 AppxManifest.xml 파일에 있는 Package.Applications.Application실행 파일 필드에서 패키지 상대 부모 경로를 복사합니다. Image circling the location of the working directory within the AppxManifest file.

  9. AppxManifest.xml 파일에 있는 실행 파일 필드의 실행 파일 이름을 config.json 파일 Package.Applications.Application프로세스 실행 파일 필드로 복사합니다. Image circling the location of the process executable within the AppxManifest file.

  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 내에 있습니다.< Version>\bin.

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

AppxManifest 업데이트

config.json 파일을 만들고 업데이트한 후 config.json에 포함된 각 Windows App 시작 관리자 대해 Windows 앱의AppxManifest.xml업데이트해야 합니다. AppxManifest의 애플리케이션은 이제 애플리케이션 아키텍처와 연결된 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