패키지 지원 프레임 워크-파일 시스템 쓰기 권한 수정Package Support Framework - Filesystem Write Permission fixup

조사Investigation

Windows 앱은 응용 프로그램과 관련 된 특정 디렉터리를 Windows 앱 컨테이너 폴더로 리디렉션합니다.Windows Apps will redirect specific directories that are related to the application to the Windows App container folder. 응용 프로그램이 Windows 앱 컨테이너에 쓰려고 하면 오류가 트리거되고 쓰기가 실패 합니다.If an application attempts to write to the Windows App container, an error will trigger, and the write will fail.

PSF (패키지 지원 프레임 워크)를 사용 하 여 Windows 앱 패키지에 대 한 향상 된 기능을 통해이 문제를 해결할 수 있습니다.Using the Package Support Framework (PSF), enhancements can be made to the Windows App package to resolve this issue. 먼저 응용 프로그램에서 요청 하는 오류 및 디렉터리 경로를 확인 해야 합니다.First, we must identify the failure, and directory paths that are being requested by the app.

Windows 앱 오류 캡처Capture the Windows App Failure

결과를 필터링 하는 것은 응용 프로그램 관련 오류를 보다 쉽게 볼 수 있도록 하는 선택적 단계입니다.Filtering the results is an optional step, that will make viewing application related failures easier. 이렇게 하려면 두 개의 필터 규칙을 만듭니다.To do this, we will create two filter rules. 첫 번째는 응용 프로그램 프로세스 이름에 대 한 포함 필터이 고, 두 번째는 성공 하지 못하는 결과를 포함 하는 것입니다.The first an include filter for the application process name, and the second is an inclusion of any results that are not successful.

  1. SysInternals Process 모니터 를 다운로드 하 고 C:\psf\processmonitor 디렉터리에 압축을 풉니다.Download and extract the SysInternals Process Monitor to the C:\PSF\ProcessMonitor directory.
  2. Windows 탐색기를 열고 추출 된 SysInternals Process Monitor 폴더로 이동 합니다.Open Windows Explorer and navigate to the extracted SysInternals Process Monitor Folder
  3. 앱을 시작 하는 procmon.exe (SysInternals Process Monitor) 파일을 두 번 클릭 합니다.Double-click the SysInternals Process Monitor (procmon.exe) file, launching the app.
  4. UAC에서 메시지가 표시 되 면 단추를 선택 합니다.If prompted by UAC, select the Yes button.
  5. 프로세스 모니터 필터 창에서 아키텍처 로 레이블이 지정 된 첫 번째 드롭다운 메뉴를 선택 합니다.In the Process Monitor Filter Window, select the first drop-down menu labeled with Architecture.
  6. 드롭다운 메뉴에서 프로세스 이름 을 선택 합니다.Select Process Name from the drop-down menu.
  7. 다음 드롭다운 메뉴에서 가 is 값으로 설정 되어 있는지 확인 합니다.In the next drop-down menu, verify that it is set with the value of is.
  8. 텍스트 필드에 앱의 프로세스 이름을 입력 합니다 (예: PSFSample.exe).In the text field type the process name of your App (Example: PSFSample.exe). 앱 이름을 사용 하는 프로세스 모니터 필터 창의 예
  9. 추가 단추를 선택합니다.Select the Add button.
  10. 프로세스 모니터 필터 창에서 프로세스 이름 레이블이 지정 된 첫 번째 드롭다운 메뉴를 선택 합니다.In the Process Monitor Filter Window, select the first drop-down menu labeled Process Name.
  11. 드롭다운 메뉴에서 결과 를 선택 합니다.Select Result from the drop-down menu.
  12. 다음 드롭다운 메뉴에서이를 선택 하 고 드롭다운 메뉴에서 다음 을 선택 합니다 .In the next drop-down menu, select it, and select is not from the drop-down menu.
  13. 텍스트 필드 형식: SUCCESS.In the text field type: SUCCESS. 프로세스 모니터 필터 창의 예 (결과 포함)
  14. 추가 단추를 선택합니다.Select the Add button.
  15. 확인 단추를 선택 합니다.Select the Ok button.
  16. Windows 앱을 시작 하 고 오류를 트리거하고 Windows 앱을 닫습니다.launch the Windows App, trigger the error, and close the Windows App.

Windows 앱 오류 로그 검토Review the Windows App Failure Logs

Windows 앱 프로세스를 캡처한 후에는 오류가 작업 디렉터리와 관련 되어 있는지 여부를 확인 하기 위해 결과를 조사 해야 합니다.After capturing the Windows App processes, the results will need to be investigated to identify if the failure is related to the working directory.

  1. 위의 표에 설명 된 오류를 검색 하 여 SysInternals Process Monitor results를 검토 합니다.Review the SysInternals Process Monitor results, searching for failures outlined in the above table.
  2. " C:\Program Files\WindowsApps \ ... \ " 외부의 디렉터리를 대상으로 하는 특정 앱에 대 한 " Desired Access: ..." 라는 세부 정보가 결과에 표시 되 면 " 이름 없음" 결과가 표시 됩니다. (아래 그림에 표시 된 것 처럼) 작업 디렉터리와 관련 된 오류를 성공적으로 식별 했습니다. 앱에 PSF 수정 사항을 적용 하는 방법에 대 한 지침을 보려면 PSF 지원-파일 시스템 액세스 문서를 사용 합니다.If the results show an "Name Not Found" result, with the details "Desired Access: ..." for your specific app targeting a directory outside of the "C:\Program Files\WindowsApps\...\" (as seen in the below image), then you have successfully identified a failure related with the working directory, use the PSF Support - Filesystem Access article for guidance on how to apply the PSF correction to your app. SysInternals 프로세스 모니터에 담당자 오류 메시지를 표시 하 여 디렉터리에 쓰지 못했습니다.

해결 방법Resolution

Windows 앱은 응용 프로그램과 관련 된 특정 디렉터리를 Windows 앱 컨테이너 폴더로 리디렉션합니다.Windows Apps will redirect specific directories that are related to the application to the Windows App container folder. 응용 프로그램이 Windows 앱 컨테이너에 쓰려고 하면 오류가 트리거되고 쓰기가 실패 합니다.If an application attempts to write to the Windows App container, an error will trigger, and the write will fail.

Windows 앱 컨테이너에 쓰지 못하는 Windows 앱과 관련 된 문제를 해결 하려면 다음 네 단계를 수행 해야 합니다.To resolve the issue related to the Windows App failing to write to the Windows App container, we must follow the following four steps:

  1. 로컬 디렉터리에 Windows 앱 준비Stage the Windows App to a local directory
  2. Config.js만들기 및 필수 PSF 파일 삽입Create the Config.json and inject required PSF Files
  3. Windows 앱 Appxmanifest.xml 파일 업데이트Update the Windows App AppxManifest file
  4. Windows 앱 다시 패키징 및 서명Repackage and sign the Windows App

위의 단계에서는 로컬의 준비 된 디렉터리에 Windows 앱의 콘텐츠를 추출 하 고, PSF 픽스업 파일을 준비 된 Windows 앱 디렉터리에 삽입 하 고, 응용 프로그램 시작 관리자가 PSF 시작 관리자를 가리키도록 구성 하 고, PSF config.js를 구성 하 여 작업 디렉터리를 지정 하는 앱으로 PSF 시작 관리자를 리디렉션하도록 지침을 제공 합니다.The above steps provide guidance through extracting the content of the Windows App to a local staged directory, injecting the PSF fixup files into the staged Windows App directory, configuring the Application Launcher to point to the PSF launcher, then configuring the PSF config.json file to redirect the PSF launcher to the app specifying the working directory.

필수 도구 다운로드 및 설치Download and Install Required Tools

이 프로세스는 다음 도구를 검색 하 고 사용 하는 과정을 안내 합니다.This process will guide you through the retrieval of, and usage of the following tools:

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

다음은 필요한 도구를 다운로드 하 고 설치 하는 방법에 대 한 단계별 지침을 제공 합니다.The following will provide step-by-step guidance on downloading and installing the required tools.

  1. 최신 (미리 보기 아님) 버전의 NuGet 클라이언트 도구를 다운로드 하 고 폴더에 nuget.exe 을 저장 합니다 C:\PSF\nuget .Download the latest (non-preview) version of the NuGet client tool, and save the nuget.exe in the C:\PSF\nuget folder.

  2. 관리 PowerShell 창에서 다음을 실행 하 여 Nuget 을 통해 패키지 지원 프레임 워크를 다운로드 합니다.Download the Package Support Framework using Nuget by running the following from an Administrative PowerShell window:

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

    1. Win 10 SDK를 다운로드 합니다.Download the Win 10 SDK.
    2. 이전 단계에서 다운로드 한 winsdksetup.exe 를 실행 합니다.Run the winsdksetup.exe that was downloaded in the previous step.
    3. 다음 단추를 선택합니다.Select the Next button.
    4. 다음 세 가지 기능만 설치 하도록 선택 합니다.Select only the following three features for install:
      • 데스크톱 앱용 Windows SDK 서명 도구Windows SDK Signing Tools for Desktop Apps
      • UWP C++ 앱용 Windows SDKWindows SDK for UWP C++ Apps
      • UWP 앱 용 windwos SDK 지역화Windwos SDK for UWP Apps Localization
    5. 설치 단추를 선택합니다.Select the Install button.
    6. 확인 단추를 선택 합니다.Select the Ok button.

Windows 앱 준비Stage the Windows App

Windows 앱을 준비 하면 Windows 앱의 내용을 로컬 디렉터리에 추출/unpackaging 하 게 됩니다.By staging the Windows App, we will be extracting / unpackaging the contents of the Windows App to a local directory. Windows 앱이 준비 위치로 압축을 푼 후에는 PSF 픽스업 파일을 삽입 하 여 원치 않는 환경을 수정할 수 있습니다.Once the Windows App has been unpacked to the staging location, PSF fixup files can be injected correcting any unwanted experiences.

  1. 관리 PowerShell 창을 엽니다.Open an Administrative PowerShell window.

  2. 특정 응용 프로그램 파일을 대상으로 하는 다음 변수 및 Windows 10 SDK 버전을 설정 합니다.Set the following variables targeting your specific app file, and Windows 10 SDK version:

    $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 앱을 준비 폴더에 압축을 풉니다.Unpack the Windows App to the staging folder by running the following PowerShell cmdlet:

    ## 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 파일 만들기 및 삽입Create and inject required PSF Files

Windows 앱에 정정 작업을 적용 하려면 파일 의config.js 를 만들고 실패 한 Windows 앱 시작 관리자에 대 한 정보를 제공 해야 합니다.To apply corrective actions to the Windows App the a config.json file must be created, and supplied with information about the Windows App Launcher that is failing. 여러 Windows 앱 시작 관리자에서 문제가 발생 하는 경우 파일 에 대 한config.js 를 여러 항목으로 업데이트할 수 있습니다.If there are multiple Windows App Launchers that are experiencing issues, the config.json file can be updated with multiple entries.

파일 의config.js 를 업데이트 한 후 파일 의config.js 및 지원 PSF 픽스업 파일을 Windows 앱 패키지의 루트로 이동 해야 합니다.After updating the config.json file, the config.json file and supporting PSF fixup files must then be moved into the root of the Windows App package.

  1. Visual Studio Code (VS Code) 또는 다른 텍스트 편집기를 엽니다.Open Visual Studio Code (VS Code), or any other text editor.

  2. VS Code 맨 위에 있는 파일 메뉴를 선택 하 고 드롭다운 메뉴에서 새 파일 을 선택 하 여 새 파일을 만듭니다.Create a new file, by selecting the File menu at the top of the VS Code, selecting New File from the drop-down menu.

  3. VS Code 창의 맨 위에 있는 파일 메뉴를 선택 하 고 드롭다운 메뉴에서 저장 을 선택 하 여 파일을 config.js 로 저장 합니다.Save the file as config.json, by select the File menu at the top of the VS Code window, selecting Save from the drop-down menu. 다른 이름으로 저장 창에서 Windows 앱 준비 디렉터리 (C:\PSF\Staging\PSFSampleApp)로 이동 하 고 파일 이름을 로 설정 config.json 합니다.In the Save As window, navigate to the Windows App Staging directory (C:\PSF\Staging\PSFSampleApp) and set the File Name as config.json. 저장 단추를 선택합니다.Select the Save button.

  4. 다음 코드를 새로 만든 config.js 파일에 복사 합니다.Copy the following code to the newly created config.json file.

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

    <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.id config.js 의 값을 AppxManifest.xml 파일의 Applications.Application.ID 필드에 있는 것과 동일한 값으로 설정 합니다.Set the applications.id value in the config.json to be the same value as found in the Applications.Application.ID field of the AppxManifest.xml file. 이미지가 Appxmanifest.xml 파일 내에서 ID의 위치를 벗어났습니다.

  7. config.js의 applications.executable 값을 설정 하 여 AppxManifest.xml 파일의Applications.Application.Exe를 찾을 있는 위치에 있는 응용 프로그램에 대 한 상대 경로를 대상으로 설정 합니다.Set the applications.executable value in the config.json to target the relative path to the application located in Applications.Application.Executable field of the AppxManifest.xml file. 이미지가 Appxmanifest.xml 파일 내에서 실행 파일의 위치를 벗어났습니다.

  8. applications.workingdirectory 에config.js 의 값을 설정 하 여 AppxManifest.xml 파일의 Applications.Application.Exe 를 찾을 수 있는 필드에 있는 상대 폴더 경로를 대상으로 설정 합니다.Set the applications.workingdirectory value in the config.json to target the relative folder path found in the Applications.Application.Executable field of the AppxManifest.xml file. 이미지가 Appxmanifest.xml 파일 내에서 작업 디렉터리의 위치를 벗어났습니다.

  9. process.executable 에config.js 의 값을 설정 하 여 AppxManifest.xml 파일의 Applications.Application.Exe사용 가능 필드에 있는 파일 이름 (경로 및 확장명 없음)을 대상으로 설정 합니다.Set the process.executable value in the config.json to target the file name (without path and extensions) found in the Applications.Application.Executable field of the AppxManifest.xml file. 이미지가 Appxmanifest.xml 파일 내에서 프로세스 실행 파일의 위치를 벗어났습니다.

  10. processes.fixups.dll 에서config.js 값을 설정 하 여 아키텍처 관련 FileRedirectionFixup.dll 를 대상으로 지정 합니다.Set the processes.fixups.dll value in the config.json to target the architecture specific FileRedirectionFixup.dll. X64 아키텍처에 대 한 수정 인 경우 값을 FileRedirectionFixup64.dll 로 설정 합니다.If correction is for x64 architecture, set the value to be FileRedirectionFixup64.dll. 아키텍처가 x86 이거나 알 수 없는 경우 값을 FileRedirectionFixup86.dll 설정 합니다.If the architecture is x86, or is unknown, set the value to be FileRedirectionFixup86.dll

  11. processes.fixups.config.redirectedPaths.packageRelative.base config.js 의 값을 AppxManifest.xml 파일 Applications.Application.Exe 의 끝에 있는 패키지 상대 폴더 경로로 설정 합니다.Set the processes.fixups.config.redirectedPaths.packageRelative.base value in the config.json to the package relative folder path as found in the Applications.Application.Executable of the AppxManifest.xml file. 이미지가 Appxmanifest.xml 파일 내에서 작업 디렉터리의 위치를 벗어났습니다.

  12. processes.fixups.config.redirectedPaths.packageRelative.patterns응용 프로그램에서 생성 되는 파일 형식과 일치 하도록 파일 의config.js 값을 설정 합니다.Set the processes.fixups.config.redirectedPaths.packageRelative.patterns value in the config.json file to match the file type being created by the application. PSF는 ". * \ .log" 를 사용 하 여processes.fixups.config에서 식별 된 디렉터리에 있는 모든 로그 파일에 대 한 쓰기를 리디렉션 합니다. packageRelative 경로 및 자식 디렉터리.By using ".*\.log" the PSF will redirect writes for all log files that are in the directory identified in the processes.fixups.config.redirectedPaths.packageRelative.base path, as well as child directories.

  13. 업데이트 된 config.js파일에 저장 합니다.Save the updated config.json file.

    {
        "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 앱의 루트에 복사 합니다.Copy the following four files from the Package Support Framework based on the application executable architecture to the root of the staged Windows App. 다음 파일은 .\Microsoft.PackageSupportFramework. 내에 있습니다. \bin.The following files are located within the .\Microsoft.PackageSupportFramework.\bin.

    응용 프로그램 (x64)Application (x64) 응용 프로그램 (x86)Application (x86)
    PSFLauncher64.exePSFLauncher64.exe PSFLauncher32.exePSFLauncher32.exe
    PSFRuntime64.dllPSFRuntime64.dll PSFRuntime32.dllPSFRuntime32.dll
    PSFRunDll64.exePSFRunDll64.exe PSFRunDll32.exePSFRunDll32.exe
    FileRedirectionFixup64.dllFileRedirectionFixup64.dll FileRedirectionFixup64.dllFileRedirectionFixup64.dll

Appxmanifest.xml 업데이트Update AppxManifest

파일 에config.js 를 만들고 업데이트 한 후 에는config.js 에 포함 된 각 windows 앱 시작 관리자에 대해 windows 앱의 AppxManifest.xml 업데이트 해야 합니다.After creating and updating the config.json file, the Windows App's AppxManifest.xml must be updated for each Windows App Launcher that was included in the config.json. Appxmanifest.xml 의 응용 프로그램은 이제 응용 프로그램 아키텍처와 관련 된 PSFLauncher.exe 를 대상으로 해야 합니다.The AppxManifest's Applications must now target the PSFLauncher.exe associated with the applications architecture.

  1. 파일 탐색기를 열고 준비 된 MSIX 앱 폴더 (C:\PSF\Staging\PSFSampleApp)로 이동 합니다.Open File Explorer, and navigate to the Staged MSIX App folder (C:\PSF\Staging\PSFSampleApp).

  2. AppxManifest.xml 를 마우스 오른쪽 단추로 클릭 하 고 드롭다운 메뉴에서 코드로 열기 를 선택 합니다. 필요에 따라 다른 텍스트 편집기를 사용 하 여 열 수 있습니다.Right-click on AppxManifest.xml, and select Open with Code from the drop-down menu (Optionally, you can open with another text editor).

  3. 다음 정보를 사용 하 여 AppxManifest.xml 파일을 업데이트 합니다.Update the AppxManifest.xml file with the following information:

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

응용 프로그램을 다시 패키지 합니다.Re-package the application

모든 수정 사항이 적용 되었으므로 이제 Windows 앱을 MSIX으로 다시 패키지 하 고 코드 서명 인증서를 사용 하 여 서명할 수 있습니다.All of the corrections have been applied, now the Windows App can be re-packaged into an MSIX and signed using a code signing certificate.

  1. 관리 PowerShell 창을 엽니다.Open an Administrative PowerShell Window.

  2. 다음 변수를 설정 합니다.Set the following variables:

    $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 앱을 다시 압축 합니다.Repack the Windows App from the staging folder by running the following PowerShell cmdlet:

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

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