Платформа поддержки пакетов — исправление рабочего каталога

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

Приложения Windows перенаправляют определенные каталоги, связанные с приложением в папку C:\Program Files\WindowsApps . Если приложение создает вложенную папку (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. В следующем раскрывающемся меню убедитесь, что он задан со значением.
  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. Нажмите кнопку OK.
  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 перенаправляют определенные каталоги, связанные с приложением в папку C:\Program Files\WindowsApps . Если приложение создает вложенную папку (C:\Program Files\Vendor\subfolder) как часть установки, а затем вызывает эту вложенную папку, она не сможет найти каталог, так как он не существует.

Чтобы устранить проблему, связанную с приложением Windows, ссылающимся на неправильный рабочий каталог, необходимо выполнить следующие четыре действия:

  1. Этап приложения Windows в локальный каталог
  2. Создание файла Config.json и внедрение необходимых файлов PSF
  3. Обновление файла AppxManifest приложения Windows
  4. Перепаковка и регистрация приложения Для Windows

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

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

Этот процесс поможет вам получить и использовать следующие средства:

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

Ниже приведены пошаговые инструкции по загрузке и установке необходимых средств.

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

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

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    
  3. Скачайте и установите набор средств разработки программного обеспечения Windows 10 (пакет SDK для Win 10).

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

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

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

  1. Откройте окно Администратор istrative 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. Распакуите приложение 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 (VS Code) или любой другой текстовый редактор.

  2. Создайте файл, выбрав меню "Файл " в верхней части VS Code, выбрав новый файл в раскрывающемся меню.

  3. Сохраните файл как config.json, выбрав меню "Файл " в верхней части окна VS Code, выбрав "Сохранить " в раскрывающемся меню. В окне "Сохранить как" перейдите в промежуточный каталог приложения Windows (C:\PSF\Staging\PSFSampleApp) и задайте имя файла как config.json. Выберите кнопку Сохранить.

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

    {
        "applications": [
            {
                "id": "",
                "executable": "",
                "workingDirectory": ""
            }
        ],
        "processes": [
            {
                "executable": ""
            }
        ]
    }
    
  5. Откройте промежуточный файл приложения Windows AppxManifest , расположенный в промежуточной папке приложения Windows (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) с помощью VS Code или другого текстового редактора.

    <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. Скопируйте значение в поле идентификатора, расположенном в файле AppxManifest.xml, расположенном в Package.Applications.Application поле идентификатора приложений в файле config.json. Image circling the location of the ID within the AppxManifest file.

  7. Скопируйте относительный путь пакета из поля исполняемого файла, расположенного в файле AppxManifest.xml, расположенном в Package.Applications.Application поле "Исполняемые приложения" в файле config.json. Image circling the location of the executable within the AppxManifest file.

  8. Скопируйте относительный родительский путь пакета из поля исполняемого файла, расположенного в файле AppxManifest.xml, расположенном в Package.Applications.Application поле Application WorkingDirectory в файле config.json. Image circling the location of the working directory within the AppxManifest file.

  9. Скопируйте имя исполняемого файла из поля исполняемого файла, расположенного в файле AppxManifest.xml, расположенном в Package.Applications.Application поле Исполняемые процессы в файле config.json. 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.<Версия>\bin.

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

Обновление AppxManifest

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

  1. Откройте проводник и перейдите в папку приложения MSIX staged (C:\PSF\Staging\PSFSampleApp).

  2. Щелкните правой кнопкой мыши AppxManifest.xml и выберите "Открыть с кодом " в раскрывающемся меню (при необходимости можно открыть с помощью другого текстового редактора).

  3. Обновите xml-файл AppxManifest.xml со следующими сведениями:

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

Повторно упаковав приложение

Все исправления были применены, теперь приложение Windows может быть повторно упаковано в MSIX и подписано с помощью сертификата подписи кода.

  1. Откройте окно PowerShell Администратор istrative.

  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