Устранение ошибок разрешений на запись файловой системы поддержки пакетов

В этой статье описывается, как использовать платформу поддержки пакетов (PSF) для устранения ошибки разрешения на запись файловой системы.

Приложения Windows перенаправляют определенные каталоги, связанные с приложениями, в папку контейнера приложений Windows. Если приложение пытается выполнить запись в контейнер приложений Windows, возникает ошибка и происходит сбой записи. Чтобы устранить эту проблему, можно внести улучшения в пакет приложения Для Windows.

Исследование

Сначала определите сбой и пути к каталогу, запрашиваемые приложением.

Запись сбоя приложения Для Windows

Фильтрация результатов является необязательным, но упрощает просмотр сбоев, связанных с приложениями. Чтобы отфильтровать результаты, создайте два правила фильтрации. Первый фильтр включает имя процесса приложения, а второй фильтр содержит результаты, которые не являются успешными.

  1. Скачайте и извлеките монитор процессов SysInternals в каталог C:\PSF\ProcessMonitor .

  2. Откройте проводник Windows и перейдите к извлеченной папке SysInternals ProcessMonitor .

  3. Выберите файлprocmon.exe монитора процессов SysInternals, чтобы запустить приложение.

  4. Если появится запрос UAC, нажмите кнопку "Да".

  5. В окне фильтра монитора процессов выберите "Имя процесса " в раскрывающемся меню первого поля.

  6. Убедитесь, что отображается в следующем поле.

  7. В следующем поле введите имя процесса приложения, например PSFSample.exe.

    Example of the Process Monitor Filter window with app name.

  8. Выберите Добавить.

  9. В окне фильтра монитора процессов выберите "Результат " в раскрывающемся меню первого поля.

  10. В следующем поле выберите пункт не из раскрывающегося меню.

  11. В текстовом поле введите SUCCESS.

    Example of the Process Monitor Filter window with Result.

  12. Выберите Добавить, а затем нажмите кнопку ОК.

  13. Запустите приложение Для Windows, активируете ошибку и закройте приложение Для Windows.

Просмотр журналов сбоев приложений Для Windows

После записи процессов приложения Для Windows изучите результаты, чтобы определить, связан ли сбой с рабочим каталогом.

Просмотрите результаты сбоя монитора процессов SysInternals. Если результаты включают отказ в доступе с требуемым доступом: общие сведения о записи для приложения, ориентированного на C:\Program Files\WindowsApps\......\, вы определили сбой разрешения на запись, связанный с рабочим каталогом.

Displays the error message witnessed in the SysInternals Process Monitor for failure to write to directory.

Если вы определите эту ошибку, примените следующую исправление PSF к приложению.

Решение

Чтобы устранить проблему, связанную с ошибкой записи приложения Windows в контейнер приложений Для Windows, выполните следующие действия.

  1. Извлеките содержимое приложения Windows в локальный промежуточный каталог.
  2. Создайте файл config.json и вставьте файлы исправления PSF в каталог промежуточного приложения Для Windows.
  3. Настройте средство запуска приложений, чтобы указать средство запуска PSF и настроить файл PSF config.json для перенаправления средства запуска PSF, указав рабочий каталог.
  4. Обновите файл AppxManifest приложения Для Windows.
  5. Перепакуть и подписать приложение для Windows.

Скачивание и установка необходимых средств

Для этого процесса требуются следующие средства:

  • Клиентское средство NuGet
  • Платформа поддержки пакетов (PSF)
  • Windows 10 Software Development Toolkit (Win 10 SDK), последняя версия
  • Монитор процессов SysInternals

Чтобы скачать и установить NuGet и PSF, выполните приведенные ниже действия.

  1. Скачайте последнюю не предварительную версию клиентского средства NuGet и сохраните nuget.exe в C:\PSF\nuget.

  2. Скачайте и установите платформу поддержки пакетов с помощью NuGet, выполнив следующую команду из административного окна PowerShell:

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    

Чтобы скачать и установить пакет SDK для Windows 10, выполните указанные ниже действия.

  1. Скачайте пакет SDK для Win 10.
  2. Запустите winsdksetup.exe .
  3. Выберите Далее.
  4. Выберите только следующие три компонента:
    • Средства подписывания Windows SDK для классических приложений;
    • Windows SDK для приложений UWP C++;
    • Пакет SDK Windwos для локализации приложений UWP
  5. Нажмите кнопку "Установить", а затем нажмите кнопку "ОК".

Этап приложения Для Windows

Промежуточное приложение Windows извлекает и распаковает содержимое приложения в локальный каталог. После распаковки приложения Windows в промежуточное расположение можно внедрить файлы исправления PSF, чтобы исправить любые нежелательные возможности.

  1. В окне администрирования PowerShell задайте следующие переменные для конкретного файла приложения и версии пакета 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
    
  2. Распакуть приложение Windows в промежуточную папку, выполнив следующий командлет PowerShell:

    ## 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, которое завершается сбоем. Если возникают проблемы с несколькими средствами запуска приложений Windows, можно настроить файл config.json с несколькими записями.

После создания файла config.json вы переместите файл config.json и вспомогательные файлы исправления PSF в корень пакета приложения Для Windows.

  1. Откройте Visual Studio Code или другой текстовый редактор.

  2. Создайте файл с именем config.json в промежуточном каталоге приложения Windows , C:\PSF\Staging\PSFSampleApp.

  3. Скопируйте следующий код в созданный файл config.json .

    {
        "applications": [
            {
                "id": "",
                "executable": ""
            }
        ],
        "processes": [
            {
                "executable": "",
                "fixups": [
                {
                    "dll": "",
                    "config": {
                        "redirectedPaths": {
                            "packageRelative": [
                                {
                                    "base": "",
                                    "patterns": [
                                        ""
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
            }
        ]
    }
    
  4. Откройте файлAppxManifest.xml в промежуточной папке приложения Windows. В следующем примере показан файл 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>
    
  5. Внесите следующие изменения в файл config.json :

    • applications.id Задайте для значения то же значение, что и в Applications.Application.ID поле файла AppxManifest.xml.

      Image showing the location of the ID within the AppxManifest file.

    • Задайте значение, указывающее относительный applications.executable путь к приложению, расположенному Applications.Application.Executable в поле файлаAppxManifest.xml .

      Image showing the location of the executable within the *AppxManifest.xml* file.

    • Задайте значение, указывающее applications.workingdirectory относительный путь к папке в Applications.Application.Executable поле файлаAppxManifest.xml .

      Image showing the location of the working directory within the AppxManifest file.

    • process.executable Задайте значение для имени файла без пути и расширения в Applications.Application.Executable поле файлаAppxManifest.xml.

      Image showing the location of the process executable within the AppxManifest file.

    • Задайте значение, предназначенное processes.fixups.dll для конкретной FileRedirectionFixup.dllархитектуры. Если исправление предназначено для архитектуры x64, задайте значение FileRedirectionFixup64.dll. Если архитектура x86 или неизвестна, задайте значение FileRedirectionFixup86.dll.

    • processes.fixups.config.redirectedPaths.packageRelative.base Задайте значение пути к папке относительно пакета в Applications.Application.Executable поле файлаAppxManifest.xml.

      Image showing the location of the working directory within the AppxManifest file.

    • Задайте значение, соответствующее processes.fixups.config.redirectedPaths.packageRelative.patterns типу файла, создаваемому приложением. При использовании .*\\.logPSF перенаправляет все файлы журнала, записываемые processes.fixups.config.redirectedPaths.packageRelative.base в каталог и дочерние каталоги.

  6. Сохраните обновленный файл config.json . В следующем примере показан обновленный файл config.json :

    {
        "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"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }
    
  7. Скопируйте следующие файлы из платформы поддержки пакетов для исполняемой архитектуры приложения в корень промежуточного приложения Для Windows. Файлы можно найти в файле .\Microsoft.PackageSupportFramework.\<Version>\bin.

    Приложение (x64) Приложение (x86)
    PSFLauncher64.exe PSFLauncher32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe
    FileRedirectionFixup64.dll FileRedirectionFixup64.dll

Обновление AppxManifest

После создания и обновления файла config.json обновите файл AppxManifest.xml приложения Для Windows для каждого средства запуска приложений Windows, включенного в файл config.json. Теперь AppxManifest.xmlApplications должна быть нацелена на PSFLauncher.exe , связанную с архитектурой приложения.

  1. Откройте AppxManifest.xml в папке промежуточного приложения MSIX C:\PSF\Staging\PSFSampleApp.
  2. Обновите 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. Перепакуть приложение Windows из промежуточной папки, выполнив следующий командлет PowerShell:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
    
  4. Подпишите приложение Для Windows, выполнив следующий командлет PowerShell:

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