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

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

Windows приложения будут перенаправлять определенные каталоги, связанные с приложением, в папку контейнера Windows приложения. Если приложение создает вложенную папку ( C:\Program Files\Vendor\subfolder ) в составе установки и позже вызывает эту вложенную папку, не удается найти каталог, так как он не существует.

с помощью платформы поддержки пакетов (псф) можно внести улучшения в пакет приложения Windows, чтобы устранить эту проблему. Сначала необходимо задать сбой и пути к каталогам, запрашиваемые приложением.

сбор данных о сбое приложения Windows

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

  1. Скачайте и извлеките Монитор процессов Sysinternals в каталог к:\псф\процессмонитор .
  2. откройте обозреватель Windows и перейдите к папке извлеченных мониторов процессов SysInternals.
  3. Дважды щелкните файл "монитор процессов SysInternals" (procmon.exe), чтобы запустить приложение.
  4. При появлении запроса UAC нажмите кнопку Да .
  5. В окне Обработка фильтра монитора выберите первое раскрывающееся меню с именем архитектура.
  6. В раскрывающемся меню выберите пункт имя процесса .
  7. В следующем раскрывающемся меню убедитесь, что для него задано значение равно.
  8. В текстовом поле введите имя процесса приложения (например: PSFSample.exe). пример Windows фильтра монитора процессов с именем приложения
  9. Нажмите кнопку Добавить.
  10. В окне Обработка фильтра монитора выберите первое раскрывающееся меню имя процесса.
  11. Выберите результат в раскрывающемся меню.
  12. В следующем раскрывающемся меню выберите его и выберите пункт не из раскрывающегося меню.
  13. В текстовом поле введите: Success. пример фильтра монитора процессов Windows с результатом
  14. Нажмите кнопку Добавить.
  15. Нажмите кнопку OK.
  16. запустите приложение Windows, активируйте ошибку и закройте приложение Windows.

проверка журналов сбоев приложений Windows

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

  1. Проверьте результаты в мониторе процесса SysInternals, выполнив поиск ошибок, описанных в приведенной выше таблице.
  2. Если в результатах отображается результат "имя не найдено" , отображаются сведения "требуемый доступ:..." для конкретного приложения, предназначенного для каталога за пределами "C:\Program филес\виндовсаппс \ ... \ " (как показано на рисунке ниже), вы успешно определили сбой, связанный с рабочим каталогом, используйте статью ПСФ support-FileSystem для получения инструкций по применению исправления ПСФ к приложению. Отображает сообщение об ошибке, следящий в мониторе процессов SysInternals, для сбоя записи в каталог.

Решение

Windows приложения будут перенаправлять определенные каталоги, связанные с приложением, в папку контейнера Windows приложения. Если приложение создает вложенную папку ( C:\Program Files\Vendor\subfolder ) в составе установки и позже вызывает эту вложенную папку, не удается найти каталог, так как он не существует.

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

  1. размещение Windows приложения в локальном каталоге
  2. Создание Config.jsи вставка необходимых файлов ПСФ
  3. обновление файла AppxManifest приложения Windows
  4. переупаковка и подпись приложения Windows

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

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

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

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

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

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

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

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

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

размещение приложения Windows

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

  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"
    

Создание и вставка необходимых файлов ПСФ

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

после обновления config.js в файле config.jsв файле и вспомогательные файлы адресной привязки псф должны быть перемещены в корневую папку пакета приложения Windows.

  1. откройте Visual Studio Code (VS Code) или любой другой текстовый редактор.

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

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

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

    {
        "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 поле Application ID (идентификатор приложения) в файле config.js . Image изогнутыми расположение идентификатора в файле AppxManifest.

  7. Скопируйте путь, относительный от пакета, из поля исполняемый файл, расположенного в файле AppxManifest.xml , расположенном в, в Package.Applications.Application поле исполняемый файл приложения в config.js . Image изогнутыми расположение исполняемого файла в файле AppxManifest.

  8. Скопируйте связанный с пакетом родительский путь из поля исполняемого файла, расположенного в файле AppxManifest.xml , расположенном в, в Package.Applications.Application поле Application WorkingDirectory (приложения) в файле config.js . Image изогнутыми расположение рабочего каталога в файле AppxManifest.

  9. Скопируйте имя исполняемого файла из поля исполняемого файла, расположенного в файле AppxManifest.xml , расположенном в, в Package.Applications.Application поле процессы исполняемого файла в config.js . Image изогнутыми расположение исполняемого файла процесса в файле AppxManifest.

  10. Сохраните обновленный config.jsв файле.

    {
        "applications": [
            {
            "id": "PSFSample",
            "executable": "VFS/ProgramFilesX64/PS Sample App/PSFSample.exe",
            "workingDirectory": "VFS/ProgramFilesX64/PS Sample App/"
            }
        ],
        "processes": [
            {
            "executable": "PSFSample"
            }
        ]
    }
    
  11. скопируйте следующие три файла из платформы поддержки пакетов, основанной на исполняемой архитектуре приложения, в корневую папку промежуточного Windows приложения. Следующие файлы находятся в папке .\микрософт.паккажесуппортфрамеворк. \bin.

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

Обновление AppxManifest

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

  1. Откройте проводник и перейдите к папке промежуточного MSIX приложения (к:\псф\стагинг\псфсамплеапп).

  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