패키지 지원 프레임 워크-파일 시스템 쓰기 권한 수정

조사

Windows 앱은 응용 프로그램과 관련 된 특정 디렉터리를 Windows 앱 컨테이너 폴더로 리디렉션합니다. 응용 프로그램이 Windows 앱 컨테이너에 쓰려고 하면 오류가 트리거되고 쓰기가 실패 합니다.

PSF (패키지 지원 프레임 워크)를 사용 하면이 문제를 해결 하기 위해 Windows 앱 패키지를 향상 시킬 수 있습니다. 먼저 응용 프로그램에서 요청 하는 오류 및 디렉터리 경로를 확인 해야 합니다.

Windows 앱 오류 캡처

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

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

Windows 앱 오류 로그 검토

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

  1. 위의 표에 설명 된 오류를 검색 하 여 SysInternals Process Monitor results를 검토 합니다.
  2. 결과에 "이름이 없습니다." 결과가 표시 되는 경우 아래 이미지에 표시 된 것 처럼 "C:\Program Files\WindowsApps\...\" 외부의 디렉터리를 대상으로 하는 특정 앱에 대 한 "Desired Access: ..." 세부 정보를 사용 하 여 작업 디렉터리와 관련 된 오류를 성공적으로 식별 했습니다. 응용 프로그램에 PSF 수정 사항을 적용 하는 방법에 대 한 지침은 PSF 지원-Filesystem 액세스 문서를 참조 하세요. SysInternals 프로세스 모니터에 담당자 오류 메시지를 표시 하 여 디렉터리에 쓰지 못했습니다.

해결 방법

Windows 앱은 응용 프로그램과 관련 된 특정 디렉터리를 Windows 앱 컨테이너 폴더로 리디렉션합니다. 응용 프로그램이 Windows 앱 컨테이너에 쓰려고 하면 오류가 트리거되고 쓰기가 실패 합니다.

Windows 앱 컨테이너에 쓰지 못하는 Windows 앱과 관련 된 문제를 해결 하려면 다음 네 단계를 수행 해야 합니다.

  1. 로컬 디렉터리에 대 한 Windows 앱 준비
  2. App.config를 만들고 필요한 PSF 파일을 삽입 합니다.
  3. Windows App appxmanifest.xml 파일 업데이트
  4. Windows 앱 다시 패키징 및 서명

위의 단계에서는 Windows 앱의 콘텐츠를 로컬 준비 된 디렉터리로 추출 하 고, 준비 된 Windows app 디렉터리에 PSF 픽스업 파일을 삽입 하 고, PSF 시작 관리자를 가리키도록 응용 시작 관리자 프로그램을 구성 하 고, PSF 시작 관리자를 구성 하 여 작업 디렉터리를 지정 하는 앱으로를 리디렉션하는 방법에 대 한 지침을 제공 합니다.

필수 도구 다운로드 및 설치

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

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

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

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

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

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    
  3. Windows 10 Software Development 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 앱의 내용을 로컬 디렉터리에 추출/unpackaging 하 게 됩니다. Windows 앱이 스테이징 위치로 압축을 푼 후에는 PSF 픽스업 파일을 삽입 하 여 원치 않는 환경을 수정할 수 있습니다.

  1. 관리 PowerShell 창을 엽니다.

  2. 특정 응용 프로그램 파일을 대상으로 하는 다음 변수를 설정 하 고 Windows 10 SDK 버전을 설정 합니다.

    $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 앱에 정정 작업을 적용 하려면 web.config 파일을 만들고 실패 한 Windows 앱 시작 관리자 대 한 정보를 제공 해야 합니다. 문제가 발생 하는 Windows 앱 시작 프로그램이 여러 개 있는 경우 config.xml 파일을 여러 항목으로 업데이트할 수 있습니다.

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

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

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

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

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

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

    <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. Applications.Application.ID의 applications.id 값을 AppxManifest.xml 파일의 필드에 있는 값과 동일 하 게 설정 합니다 applications.id 이미지가 Appxmanifest.xml 파일 내에서 ID의 위치를 벗어났습니다.

  7. AppxManifest.xml파일의 응용 프로그램 파일에 있는 응용 프로그램의 applications.executable 상대 경로를 대상으로 하는 응용 프로그램에 대 한 상대 경로를 대상으로 하는 값 applications.executable 합니다. 이미지가 Appxmanifest.xml 파일 내에서 실행 파일의 위치를 벗어났습니다.

  8. applications.workingdirectoryAppxManifest.xml 파일의 응용 프로그램. 응용 프로그램 파일에 있는 상대 폴더 경로를 대상으로 하는 applications.workingdirectory 의 값을 설정 합니다. 이미지가 Appxmanifest.xml 파일 내에서 작업 디렉터리의 위치를 벗어났습니다.

  9. process.executableAppxManifest.xml 파일의 응용 프로그램 실행 파일에 있는 파일 이름 (경로 및 확장명 포함 안 함)을 대상으로 하는 process.executable 의 값을 설정 합니다. 이미지가 Appxmanifest.xml 파일 내에서 프로세스 실행 파일의 위치를 벗어났습니다.

  10. processes.fixups.dllprocesses.fixups.dll 에서 값을 설정 하 여 아키텍처 관련 FileRedirectionFixup.dll를 대상으로 지정 합니다. X64 아키텍처에 대 한 수정 인 경우 값을 FileRedirectionFixup64.dll로 설정 합니다. 아키텍처가 x86 이거나 알 수 없는 경우 값을 FileRedirectionFixup86.dll 설정 합니다.

  11. processes.fixups.config.redirectedPaths.packageRelative.baseprocesses.fixups.config.redirectedPaths.packageRelative.base 의 값을 AppxManifest.xml 파일의 응용 프로그램 응용 프로그램 파일에 있는 패키지 상대 폴더 경로로 설정 합니다. 이미지가 Appxmanifest.xml 파일 내에서 작업 디렉터리의 위치를 벗어났습니다.

  12. processes.fixups.config.redirectedPaths.packageRelative.patterns응용 프로그램에서 생성 되는 파일 형식과 일치 하도록 processes.fixups.config.redirectedPaths.packageRelative.patterns 파일의 값을 설정 합니다. PSF는 ". * \.log" 를 사용 하 여processes.fixups.config에서 식별 되는 디렉터리에 있는 모든 로그 파일에 대 한 쓰기를 리디렉션 합니다 . packageRelative 경로 및 자식 디렉터리입니다.

  13. 업데이트 된 app.config 파일을 저장 합니다.

    {
        "applications": [
            {
            "id": "PSFSample",
            "executable": "VFS/ProgramFilesX64/PS Sample App/PSFSample.exe"
            }
        ],
        "processes": [
            {
                "executable": "PSFSample",
                "fixups": [
                    {
                        "dll": "FileRedirectionFixup64.dll",
                        "config": {
                            "redirectedPaths": {
                                "packageRelative": [
                                    {
                                        "base": "VFS/ProgramFilesX64/PS Sample App/",
                                        "patterns": [
                                            ".*\\.log"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }
    
  14. 응용 프로그램 실행 파일 아키텍처에 따라 패키지 지원 프레임 워크에서 준비 된 Windows 앱의 루트에 다음 네 개의 파일을 복사 합니다. 다음 파일은 .\Microsoft.PackageSupportFramework. 내에 있습니다. 버전 > \bin.

    응용 프로그램 (x64) 애플리케이션(x86)
    PSFLauncher64.exe PSFLauncher32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe
    FileRedirectionFixup64.dll FileRedirectionFixup64.dll

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