Marco de soporte de paquete: corrección de permiso de escritura de sistema de archivosPackage Support Framework - Filesystem Write Permission fixup

InvestigaciónInvestigation

Las aplicaciones de Windows redirigirán los directorios específicos que están relacionados con la aplicación a la carpeta del contenedor de la aplicación Windows.Windows Apps will redirect specific directories that are related to the application to the Windows App container folder. Si una aplicación intenta escribir en el contenedor de aplicaciones de Windows, se desencadenará un error y se producirá un error en la escritura.If an application attempts to write to the Windows App container, an error will trigger, and the write will fail.

Con el marco de soporte de paquetes (PSF), se pueden realizar mejoras en el paquete de aplicación de Windows para resolver este problema.Using the Package Support Framework (PSF), enhancements can be made to the Windows App package to resolve this issue. En primer lugar, es necesario identificar el error y las rutas de acceso de directorio que la aplicación solicita.First, we must identify the failure, and directory paths that are being requested by the app.

Captura del error de aplicación de WindowsCapture the Windows App Failure

Filtrar los resultados es un paso opcional que facilitará la visualización de errores relacionados con la aplicación.Filtering the results is an optional step, that will make viewing application related failures easier. Para ello, se crearán dos reglas de filtro.To do this, we will create two filter rules. El primero es un filtro de inclusión para el nombre del proceso de la aplicación y el segundo es una inclusión de los resultados que no son correctos.The first an include filter for the application process name, and the second is an inclusion of any results that are not successful.

  1. Descargue y extraiga el monitor de proceso de Sysinternals en el directorio C:\PSF\ProcessMonitorDownload and extract the SysInternals Process Monitor to the C:\PSF\ProcessMonitor directory.
  2. Abra el explorador de Windows y navegue hasta la carpeta de monitor de proceso de SysInternals extraída.Open Windows Explorer and navigate to the extracted SysInternals Process Monitor Folder
  3. Haga doble clic en el archivo del monitor de procesos de SysInternals (procmon.exe) e inicie la aplicación.Double-click the SysInternals Process Monitor (procmon.exe) file, launching the app.
  4. Si UAC lo solicita, seleccione el botón .If prompted by UAC, select the Yes button.
  5. En la ventana filtro del monitor de proceso, seleccione el primer menú desplegable con la etiqueta arquitectura.In the Process Monitor Filter Window, select the first drop-down menu labeled with Architecture.
  6. Seleccione nombre del proceso en el menú desplegable.Select Process Name from the drop-down menu.
  7. En el menú desplegable siguiente, compruebe que está establecido con el valor de es.In the next drop-down menu, verify that it is set with the value of is.
  8. En el campo de texto, escriba el nombre de proceso de la aplicación (por ejemplo: PSFSample.exe).In the text field type the process name of your App (Example: PSFSample.exe). Ejemplo de ventanas del filtro del monitor del proceso con el nombre de la aplicación
  9. Seleccione el botón Agregar.Select the Add button.
  10. En la ventana filtro del monitor de proceso, seleccione el primer menú desplegable con la etiqueta nombre del proceso.In the Process Monitor Filter Window, select the first drop-down menu labeled Process Name.
  11. Seleccione resultado en el menú desplegable.Select Result from the drop-down menu.
  12. En el menú desplegable siguiente, selecciónelo y seleccione no en el menú desplegable.In the next drop-down menu, select it, and select is not from the drop-down menu.
  13. En el campo tipo de texto: correcto.In the text field type: SUCCESS. Ejemplo de ventanas de filtro del monitor de procesos con resultado
  14. Seleccione el botón Agregar.Select the Add button.
  15. Seleccione el botón Aceptar .Select the Ok button.
  16. Inicie la aplicación de Windows, desencadene el error y cierre la aplicación de Windows.launch the Windows App, trigger the error, and close the Windows App.

Revisar los registros de errores de la aplicación WindowsReview the Windows App Failure Logs

Después de capturar los procesos de aplicación de Windows, será necesario investigar los resultados para identificar si el error está relacionado con el directorio de trabajo.After capturing the Windows App processes, the results will need to be investigated to identify if the failure is related to the working directory.

  1. Revise los resultados del monitor de procesos de SysInternals y busque los errores descritos en la tabla anterior.Review the SysInternals Process Monitor results, searching for failures outlined in the above table.
  2. Si los resultados muestran el resultado "nombre no encontrado" , con los detalles "acceso deseado:..." para la aplicación específica que tiene como destino un directorio fuera del "c:\Archivos de Files\WindowsApps \ ... \ " (como se muestra en la imagen siguiente), ha identificado correctamente un error relacionado con el directorio de trabajo. Use el artículo compatibilidad con PSF: acceso al sistema de archivos para obtener instrucciones sobre cómo aplicar la corrección de PSF a la aplicación.If the results show an "Name Not Found" result, with the details "Desired Access: ..." for your specific app targeting a directory outside of the "C:\Program Files\WindowsApps\...\" (as seen in the below image), then you have successfully identified a failure related with the working directory, use the PSF Support - Filesystem Access article for guidance on how to apply the PSF correction to your app. Muestra el mensaje de error testigo en el monitor de proceso de SysInternals para error de escritura en el directorio.

SoluciónResolution

Las aplicaciones de Windows redirigirán los directorios específicos que están relacionados con la aplicación a la carpeta del contenedor de la aplicación Windows.Windows Apps will redirect specific directories that are related to the application to the Windows App container folder. Si una aplicación intenta escribir en el contenedor de aplicaciones de Windows, se desencadenará un error y se producirá un error en la escritura.If an application attempts to write to the Windows App container, an error will trigger, and the write will fail.

Para resolver el problema relacionado con la aplicación de Windows que no puede escribir en el contenedor de aplicaciones de Windows, debemos seguir los cuatro pasos siguientes:To resolve the issue related to the Windows App failing to write to the Windows App container, we must follow the following four steps:

  1. Organizar la aplicación de Windows en un directorio localStage the Windows App to a local directory
  2. Cree el Config.jsen e inserte los archivos PSF necesarios.Create the Config.json and inject required PSF Files
  3. Actualización del archivo AppxManifest de aplicación de WindowsUpdate the Windows App AppxManifest file
  4. Volver a empaquetar y firmar la aplicación de WindowsRepackage and sign the Windows App

En los pasos anteriores se proporcionan instrucciones para extraer el contenido de la aplicación de Windows en un directorio local almacenado provisionalmente, inyectando los archivos de corrección PSF en el directorio de aplicaciones de Windows preconfiguradas, configurando el iniciador de la aplicación para que apunte al iniciador PSF y, a continuación, configurando el config.jsPSF en el archivo para redirigir el iniciador PSF aThe above steps provide guidance through extracting the content of the Windows App to a local staged directory, injecting the PSF fixup files into the staged Windows App directory, configuring the Application Launcher to point to the PSF launcher, then configuring the PSF config.json file to redirect the PSF launcher to the app specifying the working directory.

Descargar e instalar las herramientas necesariasDownload and Install Required Tools

Este proceso le guiará a través de la recuperación y el uso de las siguientes herramientas:This process will guide you through the retrieval of, and usage of the following tools:

  • Herramienta de cliente de NuGetNuGet Client Tool
  • Marco de compatibilidad de paquetePackage Support Framework
  • SDK de Windows 10 (versión más reciente)Windows 10 SDK (latest version)
  • Monitor de procesos de SysInternalsSysInternals Process Monitor

A continuación se proporcionan instrucciones paso a paso para descargar e instalar las herramientas necesarias.The following will provide step-by-step guidance on downloading and installing the required tools.

  1. Descargue la versión más reciente (no vista previa) de la herramienta cliente de NuGety guarde el nuget.exe en la C:\PSF\nuget carpeta.Download the latest (non-preview) version of the NuGet client tool, and save the nuget.exe in the C:\PSF\nuget folder.

  2. Descargue el marco de soporte de paquetes mediante Nuget mediante la ejecución de lo siguiente desde una ventana administrativa de PowerShell:Download the Package Support Framework using Nuget by running the following from an Administrative PowerShell window:

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    
  3. Descargue e instale el Kit de herramientas de desarrollo de software de Windows 10 (SDK de Win 10).Download and install the Windows 10 Software Development Toolkit (Win 10 SDK).

    1. Descargue el SDK de Win 10.Download the Win 10 SDK.
    2. Ejecute el winsdksetup.exe que se descargó en el paso anterior.Run the winsdksetup.exe that was downloaded in the previous step.
    3. Haga clic en el botón Siguiente.Select the Next button.
    4. Seleccione solo las tres características siguientes para instalar:Select only the following three features for install:
      • Herramientas de firma de Windows SDK para aplicaciones de escritorioWindows SDK Signing Tools for Desktop Apps
      • Windows SDK para aplicaciones de C++ para UWPWindows SDK for UWP C++ Apps
      • Microsoft SDK para la localización de aplicaciones para UWPWindwos SDK for UWP Apps Localization
    5. Seleccione el botón Instalar.Select the Install button.
    6. Seleccione el botón Aceptar .Select the Ok button.

Almacenar provisionalmente la aplicación de WindowsStage the Windows App

Al almacenar provisionalmente la aplicación de Windows, se extraerá/desempaquetará el contenido de la aplicación de Windows en un directorio local.By staging the Windows App, we will be extracting / unpackaging the contents of the Windows App to a local directory. Una vez que la aplicación de Windows se ha desempaquetado en la ubicación de almacenamiento provisional, los archivos de corrección PSF se pueden insertar corrigiendo cualquier experiencia no deseada.Once the Windows App has been unpacked to the staging location, PSF fixup files can be injected correcting any unwanted experiences.

  1. Abra una ventana administrativa de PowerShell.Open an Administrative PowerShell window.

  2. Establezca las siguientes variables que tienen como destino el archivo de aplicación específico y la versión del SDK de Windows 10:Set the following variables targeting your specific app file, and Windows 10 SDK version:

    $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. Desempaquete la aplicación de Windows en la carpeta de almacenamiento provisional mediante la ejecución del siguiente cmdlet de PowerShell:Unpack the Windows App to the staging folder by running the following PowerShell cmdlet:

    ## 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"
    

Crear e insertar archivos PSF necesariosCreate and inject required PSF Files

Para aplicar las acciones correctivas a la aplicación de Windows, se debe crear un config.jsen el archivo y se proporcionará con información sobre el iniciador de aplicaciones de Windows con errores.To apply corrective actions to the Windows App the a config.json file must be created, and supplied with information about the Windows App Launcher that is failing. Si hay varios iniciadores de aplicaciones de Windows que experimentan problemas, el config.jsen el archivo se puede actualizar con varias entradas.If there are multiple Windows App Launchers that are experiencing issues, the config.json file can be updated with multiple entries.

Después de actualizar el config.jsen el archivo, el config.jsen el archivo y admitir los archivos de corrección de PSF deben moverse a la raíz del paquete de aplicación de Windows.After updating the config.json file, the config.json file and supporting PSF fixup files must then be moved into the root of the Windows App package.

  1. Abra Visual Studio Code (VS Code) o cualquier otro editor de texto.Open Visual Studio Code (VS Code), or any other text editor.

  2. Cree un nuevo archivo; para ello, seleccione el menú archivo en la parte superior de la vs Code, seleccione nuevo archivo en el menú desplegable.Create a new file, by selecting the File menu at the top of the VS Code, selecting New File from the drop-down menu.

  3. Guarde el archivo como config.jsen; para ello, seleccione el menú archivo en la parte superior de la ventana de vs Code y seleccione Guardar en el menú desplegable.Save the file as config.json, by select the File menu at the top of the VS Code window, selecting Save from the drop-down menu. En la ventana Guardar como, navegue hasta el directorio de almacenamiento provisional de la aplicación Windows (C:\PSF\Staging\PSFSampleApp) y establezca el nombre de archivo como config.json .In the Save As window, navigate to the Windows App Staging directory (C:\PSF\Staging\PSFSampleApp) and set the File Name as config.json. Seleccione el botón Guardar.Select the Save button.

  4. Copie el código siguiente en elconfig.jsrecién creado en el archivo.Copy the following code to the newly created config.json file.

    {
        "applications": [
            {
                "id": "",
                "executable": ""
            }
        ],
        "processes": [
            {
                "executable": "",
                "fixups": [
                {
                    "dll": "",
                    "config": {
                        "redirectedPaths": {
                            "packageRelative": [
                                {
                                    "base": "",
                                    "patterns": [
                                        ""
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
            }
        ]
    }
    
  5. Abra el archivo AppxManifest de aplicación de Windows preconfigurada que se encuentra en la carpeta de ensayo de la aplicación windows (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) mediante vs Code u otro editor de texto.Open the staged Windows App AppxManifest file located in the Windows App staging folder (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) using VS Code, or another text editor.

    <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. Establezca el applications.id valor de la config.jsen para que sea el mismo valor que se encuentra en el campo Applications.Application.ID del archivo de AppxManifest.xml .Set the applications.id value in the config.json to be the same value as found in the Applications.Application.ID field of the AppxManifest.xml file. Imagen en la que se rodea la ubicación del identificador dentro del archivo AppxManifest.

  7. Establezca el applications.executable valor de la config.jsen para establecer como destino la ruta de acceso relativa a la aplicación ubicada en Applications.Application.Execampo cutable del archivo de AppxManifest.xml .Set the applications.executable value in the config.json to target the relative path to the application located in Applications.Application.Executable field of the AppxManifest.xml file. Imagen en la que se rodea la ubicación del ejecutable dentro del archivo AppxManifest.

  8. Establezca el applications.workingdirectory valor de la config.jsen para establecer como destino la ruta de acceso de la carpeta relativa que se encuentra en el campo Applications.Application.Executable del archivo de AppxManifest.xml .Set the applications.workingdirectory value in the config.json to target the relative folder path found in the Applications.Application.Executable field of the AppxManifest.xml file. Imagen en la que se rodea la ubicación del directorio de trabajo dentro del archivo AppxManifest.

  9. Establezca el process.executable valor de la config.jsde destino en el nombre de archivo (sin ruta de acceso y extensiones) que se encuentra en el campo Applications.Application.Executable del archivo de AppxManifest.xml .Set the process.executable value in the config.json to target the file name (without path and extensions) found in the Applications.Application.Executable field of the AppxManifest.xml file. Imagen en la que se rodea la ubicación del ejecutable del proceso dentro del archivo AppxManifest.

  10. Establezca el processes.fixups.dll valor de la config.jsen para tener como destino la FileRedirectionFixup.dll específica de la arquitectura.Set the processes.fixups.dll value in the config.json to target the architecture specific FileRedirectionFixup.dll. Si la corrección es para la arquitectura x64, establezca el valor en FileRedirectionFixup64.dll.If correction is for x64 architecture, set the value to be FileRedirectionFixup64.dll. Si la arquitectura es x86 o es desconocida, establezca el valor en FileRedirectionFixup86.dllIf the architecture is x86, or is unknown, set the value to be FileRedirectionFixup86.dll

  11. Establezca el processes.fixups.config.redirectedPaths.packageRelative.base valor de la config.jsen la ruta de acceso de la carpeta relativa del paquete como se encuentra en la Applications.Application.Executable del archivo de AppxManifest.xml .Set the processes.fixups.config.redirectedPaths.packageRelative.base value in the config.json to the package relative folder path as found in the Applications.Application.Executable of the AppxManifest.xml file. Imagen en la que se rodea la ubicación del directorio de trabajo dentro del archivo AppxManifest.

  12. Establezca el processes.fixups.config.redirectedPaths.packageRelative.patterns valor de la config.jsen el archivo para que coincida con el tipo de archivo que va a crear la aplicación.Set the processes.fixups.config.redirectedPaths.packageRelative.patterns value in the config.json file to match the file type being created by the application. Mediante el uso de ". * \ . log" , el PSF redirigirá las escrituras de todos los archivos de registro que se encuentren en el directorio identificado en la ruta de acceso processes.fixups.config. redirectedPaths. packageRelative. base , así como los directorios secundarios.By using ".*\.log" the PSF will redirect writes for all log files that are in the directory identified in the processes.fixups.config.redirectedPaths.packageRelative.base path, as well as child directories.

  13. Guarde el config.jsactualizado en el archivo.Save the updated config.json file.

    {
        "applications": [
            {
            "id": "PSFSample",
            "executable": "VFS/ProgramFilesX64/PS Sample App/PSFSample.exe"
            }
        ],
        "processes": [
            {
                "executable": "PSFSample",
                "fixups": [
                    {
                        "dll": "FileRedirectionFixup64.dll",
                        "config": {
                            "redirectedPaths": {
                                "packageRelative": [
                                    {
                                        "base": "VFS/ProgramFilesX64/PS Sample App/",
                                        "patterns": [
                                            ".*\\.log"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }
    
  14. Copie los cuatro archivos siguientes del marco de soporte de paquetes en función de la arquitectura ejecutable de la aplicación en la raíz de la aplicación de Windows preconfigurada.Copy the following four files from the Package Support Framework based on the application executable architecture to the root of the staged Windows App. Los archivos siguientes se encuentran en .\Microsoft.PackageSupportFramework. \Bin.The following files are located within the .\Microsoft.PackageSupportFramework.\bin.

    Aplicación (x64)Application (x64) Aplicación (x86)Application (x86)
    PSFLauncher64.exePSFLauncher64.exe PSFLauncher32.exePSFLauncher32.exe
    PSFRuntime64.dllPSFRuntime64.dll PSFRuntime32.dllPSFRuntime32.dll
    PSFRunDll64.exePSFRunDll64.exe PSFRunDll32.exePSFRunDll32.exe
    FileRedirectionFixup64.dllFileRedirectionFixup64.dll FileRedirectionFixup64.dllFileRedirectionFixup64.dll

Actualizar AppxManifestUpdate AppxManifest

Después de crear y actualizar el config.jsen el archivo, el AppxManifest.xml de la aplicación Windows debe actualizarse para cada iniciador de aplicaciones de Windows que se haya incluido en el config.jsen.After creating and updating the config.json file, the Windows App's AppxManifest.xml must be updated for each Windows App Launcher that was included in the config.json. Ahora, las aplicaciones de AppxManifest deben tener como destino el PSFLauncher.exe asociado a la arquitectura de aplicaciones.The AppxManifest's Applications must now target the PSFLauncher.exe associated with the applications architecture.

  1. Abra el explorador de archivos y vaya a la carpeta de aplicación preconfigurada MSIX (C:\PSF\Staging\PSFSampleApp).Open File Explorer, and navigate to the Staged MSIX App folder (C:\PSF\Staging\PSFSampleApp).

  2. Haga clic con el botón derecho en AppxManifest.xml y seleccione abrir con código en el menú desplegable (opcionalmente, puede abrir con otro editor de texto).Right-click on AppxManifest.xml, and select Open with Code from the drop-down menu (Optionally, you can open with another text editor).

  3. Actualice el archivo de AppxManifest.xml con la siguiente información:Update the AppxManifest.xml file with the following information:

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

Volver a empaquetar la aplicaciónRe-package the application

Se han aplicado todas las correcciones, ya que la aplicación de Windows se puede volver a empaquetar en una MSIX y firmarse con un certificado de firma de código.All of the corrections have been applied, now the Windows App can be re-packaged into an MSIX and signed using a code signing certificate.

  1. Abra una ventana administrativa de PowerShell.Open an Administrative PowerShell Window.

  2. Establezca las siguientes variables:Set the following variables:

    $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. Para empaquetar la aplicación de Windows desde la carpeta de almacenamiento provisional, ejecute el siguiente cmdlet de PowerShell:Repack the Windows App from the staging folder by running the following PowerShell cmdlet:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
    
  4. Firme la aplicación de Windows mediante la ejecución del siguiente cmdlet de PowerShell:Sign the Windows App by running the following PowerShell cmdlet:

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