Estrutura de Suporte ao Pacote – Correção do Diretório de Trabalho

Investigação

Windows Apps redirecionará diretórios específicos relacionados ao aplicativo para a pasta de contêiner do aplicativo Windows. Se um aplicativo criar uma subpasta (C:\Program Files\Vendor\subfolder) como parte da instalação e, posteriormente, chamar essa subpasta, ele não encontrará o diretório, pois ele não existe.

Usando o PSF (Package Support Framework), aprimoramentos podem ser feitos no pacote Windows Aplicativo para resolver esse problema. Primeiro, devemos identificar a falha e os caminhos de diretório que estão sendo solicitados pelo aplicativo.

Capturar a falha do aplicativo Windows

Filtrar os resultados é uma etapa opcional, o que facilitará a exibição de falhas relacionadas ao aplicativo. Para fazer isso, criaremos duas regras de filtro. O primeiro um filtro de inclusão para o nome do processo do aplicativo e o segundo é uma inclusão de quaisquer resultados que não sejam bem-sucedidos.

  1. Baixe e extraia o Monitor de Processo SysInternals para o diretório C:\PSF\ProcessMonitor .
  2. Abra Windows Explorer e navegue até a pasta do Monitor de Processo do SysInternals extraída
  3. Clique duas vezes no arquivo SysInternals Process Monitor (procmon.exe), iniciando o aplicativo.
  4. Se solicitado pelo UAC, selecione o botão Sim .
  5. Na Janela de Filtro do Monitor do Processo, selecione o primeiro menu suspenso rotulado com Arquitetura.
  6. Selecione Nome do Processo no menu suspenso.
  7. No próximo menu suspenso, verifique se ele está definido com o valor de is.
  8. No campo de texto, digite o nome do processo do aplicativo (exemplo: PSFSample.exe). Example of the Process Monitor Filter Windows with App Name
  9. Selecione o botão Adicionar.
  10. Na Janela de Filtro do Monitor do Processo, selecione o primeiro menu suspenso rotulado Nome do Processo.
  11. Selecione Resultado no menu suspenso.
  12. No próximo menu suspenso, selecione-o e selecione-o no menu suspenso.
  13. No tipo de campo de texto: SUCCESS. Example of the Process Monitor Filter Windows with Result
  14. Selecione o botão Adicionar.
  15. Selecione o botão Ok .
  16. inicie o aplicativo Windows, dispare o erro e feche o aplicativo Windows.

Examinar os logs de falha do aplicativo Windows

Depois de capturar os processos do aplicativo Windows, os resultados precisarão ser investigados para identificar se a falha está relacionada ao diretório de trabalho.

  1. Examine os resultados do SysInternals Process Monitor, pesquisando falhas descritas na tabela acima.
  2. Se os resultados mostrarem um resultado "Nome Não Encontrado", com os detalhes "Acesso Desejado: ..." para seu aplicativo específico direcionado a um diretório fora do "C:\Arquivos de Programas\WindowsApps\...\\" (como visto na imagem abaixo), você identificou com êxito uma falha relacionada ao diretório de trabalho, use o artigo Suporte PSF – Acesso ao Sistema de Arquivos para obter orientações sobre como aplicar a correção PSF ao seu aplicativo. Displays the error message witnessed in the SysInternals Process Monitor for failure to write to directory.

Resolução

Windows Apps redirecionará diretórios específicos relacionados ao aplicativo para a pasta de contêiner do aplicativo Windows. Se um aplicativo criar uma subpasta (C:\Program Files\Vendor\subfolder) como parte da instalação e, posteriormente, chamar essa subpasta, ele não encontrará o diretório, pois ele não existe.

Para resolver o problema relacionado ao aplicativo Windows referenciando um Diretório de Trabalho incorreto, devemos seguir as quatro etapas a seguir:

  1. Preparar o aplicativo Windows para um diretório local
  2. Criar o Config.json e injetar arquivos PSF necessários
  3. Atualizar o arquivo appxManifest Windows
  4. Reempacotar e assinar o aplicativo Windows

As etapas acima fornecem orientação por meio da extração do conteúdo do aplicativo Windows para um diretório local em etapas, injetando os arquivos de correção PSF no diretório do aplicativo Windows em etapas, configurando o Inicializador de Aplicativos para apontar para o inicializador PSF e configurando o arquivo PSF config.json para redirecionar o inicializador PSF para o aplicativo que especifica o diretório de trabalho.

Baixar e instalar ferramentas necessárias

Esse processo orientará você na recuperação e no uso das seguintes ferramentas:

  • Ferramenta cliente do NuGet
  • PSF (estrutura de suporte do pacote)
  • SDK do Windows 10 (versão mais recente)
  • Monitor de Processo do SysInternals

A seguir, fornecerá orientações passo a passo sobre como baixar e instalar as ferramentas necessárias.

  1. Baixe a versão mais recente (não prévia) da ferramenta de cliente NuGet e salve o nuget.exe na C:\PSF\nuget pasta.

  2. Baixe o Package Support Framework usando o Nuget executando o seguinte em uma janela administrativa do PowerShell:

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    
  3. Baixe e instale o Windows 10 Toolkit de Desenvolvimento de Software (SDK do Win 10).

    1. Baixe o SDK do Win 10.
    2. Execute o winsdksetup.exe que foi baixado na etapa anterior.
    3. Selecione o botão Avançar.
    4. Selecione apenas os três recursos a seguir para instalação:
      • ferramentas de assinatura do SDK do Windows para aplicativos da área de trabalho
      • Windows SDK para aplicativos C++ UWP
      • SDK do Windwos para Localização de Aplicativos UWP
    5. Selecione o botão Instalar.
    6. Selecione o botão Ok .

Preparar o aplicativo Windows

Ao preparar o aplicativo Windows, extrairemos/desempacotaremos o conteúdo do aplicativo Windows para um diretório local. Depois que o aplicativo Windows tiver sido descompactado no local de preparo, os arquivos de correção PSF poderão ser injetados corrigindo quaisquer experiências indesejadas.

  1. Abra uma janela administrativa do PowerShell.

  2. Defina as seguintes variáveis direcionadas ao arquivo de aplicativo específico e Windows 10 versão do 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. Desempacotar o aplicativo Windows para a pasta de preparo executando o seguinte cmdlet do 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"
    

Criar e injetar arquivos PSF necessários

Para aplicar ações corretivas ao aplicativo Windows, o arquivo config.json deve ser criado e fornecido com informações sobre o inicializador de aplicativos Windows que está falhando. Se houver vários inicializadores de aplicativos Windows que estão enfrentando problemas, o arquivo config.json poderá ser atualizado com várias entradas.

Depois de atualizar o arquivo config.json, o arquivo config.json e os arquivos de correção PSF de suporte devem ser movidos para a raiz do pacote do aplicativo Windows.

  1. Abra Visual Studio Code (VS Code) ou qualquer outro editor de texto.

  2. Crie um novo arquivo selecionando o menu Arquivo na parte superior do VS Code, selecionando Novo Arquivo no menu suspenso.

  3. Salve o arquivo como config.json, selecionando o menu Arquivo na parte superior da janela VS Code, selecionando Salvar no menu suspenso. Na janela Salvar como, navegue até o diretório Windows App Staging (C:\PSF\Staging\PSFSampleApp) e defina o Nome do Arquivo como config.json. Selecione o botão Salvar.

  4. Copie o código a seguir para o arquivo config.json recém-criado.

    {
        "applications": [
            {
                "id": "",
                "executable": "",
                "workingDirectory": ""
            }
        ],
        "processes": [
            {
                "executable": ""
            }
        ]
    }
    
  5. Abra o arquivo Windows App AppxManifest em etapas localizado na pasta de preparo do aplicativo Windows (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) usando VS Code ou outro editor de texto.

    <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. Copie o valor no campo ID localizado no arquivo AppxManifest.xml localizado no Package.Applications.Application campo ID de Aplicativos no arquivo config.json . Image circling the location of the ID within the AppxManifest file.

  7. Copie o caminho relativo ao pacote do campo Executável localizado no arquivo AppxManifest.xml localizado no Package.Applications.Application campo Executável de Aplicativos no arquivo config.json . Image circling the location of the executable within the AppxManifest file.

  8. Copie o caminho pai relativo ao pacote do campo Executável localizado no arquivo AppxManifest.xml localizado no Package.Applications.Application campo Applications WorkingDirectory no arquivo config.json . Image circling the location of the working directory within the AppxManifest file.

  9. Copie o nome executável do campo Executável localizado no arquivo AppxManifest.xml localizado no Package.Applications.Application campo Processos Executáveis no arquivo config.json . Image circling the location of the process executable within the AppxManifest file.

  10. Salve o arquivo config.json atualizado.

    {
        "applications": [
            {
            "id": "PSFSample",
            "executable": "VFS/ProgramFilesX64/PS Sample App/PSFSample.exe",
            "workingDirectory": "VFS/ProgramFilesX64/PS Sample App/"
            }
        ],
        "processes": [
            {
            "executable": "PSFSample"
            }
        ]
    }
    
  11. Copie os três arquivos a seguir do Package Support Framework com base na arquitetura executável do aplicativo para a raiz do aplicativo de Windows em etapas. Os arquivos a seguir estão localizados no .\Microsoft.PackageSupportFramework.< Version>\bin.

    Aplicativo (x64) Aplicativo (x86)
    PSFLauncher64.exe PSFLauncher32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe

Atualizar AppxManifest

Depois de criar e atualizar o arquivo config.json, a AppxManifest.xml do aplicativo Windows deve ser atualizada para cada inicializador de aplicativos Windows incluído no config.json. Os Aplicativos do AppxManifest agora devem ter como destino o PSFLauncher.exe associado à arquitetura de aplicativos.

  1. Abra Explorador de Arquivos e navegue até a pasta aplicativo MSIX em etapas (C:\PSF\Staging\PSFSampleApp).

  2. Clique com o botão direito do mouse emAppxManifest.xmle selecione Abrir com Código no menu suspenso (opcionalmente, você pode abrir com outro editor de texto).

  3. Atualize o arquivo AppxManifest.xml com as seguintes informações:

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

Empacotar novamente o aplicativo

Todas as correções foram aplicadas, agora o aplicativo Windows pode ser empacotado novamente em um MSIX e assinado usando um certificado de assinatura de código.

  1. Abra uma janela administrativa do PowerShell.

  2. Defina as seguintes variáveis:

    $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. Reempacote o aplicativo Windows da pasta de preparo executando o seguinte cmdlet do PowerShell:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
    
  4. Assine o aplicativo Windows executando o seguinte cmdlet do PowerShell:

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