Поделиться через


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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Пример окна фильтра монитора процессов с именем приложения.

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

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

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

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

    Пример окна фильтра монитора процессов с результатом.

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

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

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

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

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

Отображает сообщение об ошибке, засвидетельствованное в мониторе процессов SysInternals для сбоя записи в каталог.

Если вы определите эту ошибку, примените к приложению следующую коррекцию 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 (пакет SDK для Win 10), последняя версия
  • Монитор процессов 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.

      Изображение, показывающее расположение идентификатора в файле AppxManifest.

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

      Изображение, показывающее расположение исполняемого файла в файле *AppxManifest.xml*.

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

      Изображение, показывающее расположение рабочего каталога в файле AppxManifest.

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

      Изображение, показывающее расположение исполняемого файла процесса в файле AppxManifest.

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

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

      Изображение, показывающее расположение рабочего каталога в файле AppxManifest.

    • Задайте значение, соответствующее 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.xml Applications должна быть нацелена на 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