Estrutura de Suporte a Pacotes - Correção do Diretório de Trabalho

Investigação

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

Usando o PSF (Package Support Framework), aprimoramentos podem ser feitos no pacote de aplicativos do Windows 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 do Windows

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

  1. Baixe e extraia o SysInternals Process Monitor para o diretório C:\PSF\ProcessMonitor.
  2. Abra o Windows Explorer e navegue até a pasta extraída do SysInternals Process Monitor
  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 Filtro do Monitor de 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 seu Aplicativo (Exemplo: PSFSample.exe). Example of the Process Monitor Filter Windows with App Name
  9. Selecione o botão Adicionar.
  10. Na janela Filtro do Monitor de 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 não está no menu suspenso.
  13. No campo de texto, digite: 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 do Windows, dispare o erro e feche o aplicativo do Windows.

Revisar os logs de falha de aplicativos do Windows

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

  1. Revise os resultados do SysInternals Process Monitor procurando 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ção 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

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

Para resolver o problema relacionado ao aplicativo do Windows fazendo referência a um diretório de trabalho incorreto, devemos seguir as quatro etapas a seguir:

  1. Preparar o aplicativo do Windows para um diretório local
  2. Crie o Config.json e injete os arquivos PSF necessários
  3. Atualizar o arquivo AppxManifest do aplicativo do Windows
  4. Reempacotar e assinar o aplicativo do Windows

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

Baixar e instalar as ferramentas necessárias

Esse processo irá guiá-lo através da recuperação e uso das seguintes ferramentas:

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

O seguinte fornecerá orientações passo a passo sobre como baixar e instalar as ferramentas necessárias.

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

  2. Baixe a Estrutura de Suporte a Pacotes usando o Nuget executando o seguinte em uma janela do PowerShell Administrativo:

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

    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 de área de trabalho
      • SDK do Windows para aplicativos UWP C++
      • SDK do Windwos para localização de aplicativos UWP
    5. Selecione o botão Instalar.
    6. Selecione o botão OK.

Preparar a aplicação Windows

Ao preparar o aplicativo do Windows, estaremos extraindo/desempacotando o conteúdo do aplicativo do Windows em um diretório local. Depois que o aplicativo do Windows for descompactado no local de preparo, os arquivos de correção do PSF poderão ser injetados corrigindo quaisquer experiências indesejadas.

  1. Abra uma janela do PowerShell Administrativo.

  2. Defina as seguintes variáveis direcionadas ao seu arquivo de aplicativo específico e à versão do SDK do 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. Descompacte o aplicativo do 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 do Windows, você deve criar um arquivo config.json e fornecê-lo com informações sobre o inicializador de aplicativos do Windows que está falhando. Se houver vários inicializadores de aplicativos do Windows que estão enfrentando problemas, o arquivo config.json pode 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 de aplicativo do Windows.

  1. Abra o 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 de preparo do aplicativo do Windows (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 AppxManifest do aplicativo do Windows em estágios localizado na pasta de preparo do aplicativo do Windows (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) usando o 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 campo ID de aplicativos no Package.Applications.Application 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 campo Executável de aplicativos no Package.Applications.Application 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 para o campo Applications WorkingDirectory no Package.Applications.Application arquivo config.json. Image circling the location of the working directory within the AppxManifest file.

  9. Copie o nome do executável do campo Executável localizado no arquivo AppxManifest.xml localizado no campo Executável de processos no Package.Applications.Application 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 da Estrutura de Suporte a Pacotes com base na arquitetura executável do aplicativo para a raiz do aplicativo do Windows em estágios. Os arquivos a seguir estão localizados no .\Microsoft.PackageSupportFramework.<Versão>\bin.

    Aplicação (x64) Aplicação (x86)
    PSFLauncher64.exe PSFLauncher32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe

Atualizar AppxManifest

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

  1. Abra o Explorador de Arquivos e navegue até a pasta Aplicativo MSIX Encenado (C:\PSF\Staging\PSFSampleApp).

  2. Clique com o botão direito do mouse em AppxManifest.xml e 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>
    

Reempacotar o aplicativo

Todas as correções foram aplicadas, agora o aplicativo do Windows pode ser reempacotado 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 do 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 do 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