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

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

Windows Приложения перенаправляют определенные каталоги, связанные с приложением, в папку контейнера приложений Windows. Если приложение создает вложенную папку (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. В следующем раскрывающемся меню убедитесь, что оно задано со значением is.
  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 Приложения перенаправляют определенные каталоги, связанные с приложением, в папку контейнера приложений Windows. Если приложение создает вложенную папку (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 , выполнив следующую команду в окне администрирования 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. Откройте окно администрирования 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. Распакуте приложение 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 поле Applications 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.< Version>\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 (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. Перепакуть приложение 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