Compartir a través de


Cómo corregir errores de permisos de escritura del sistema de archivos del marco de compatibilidad de paquetes

En este artículo se describe cómo usar el marco de soporte técnico de paquetes (PSF) para resolver un error de permiso de escritura del sistema de archivos.

Las aplicaciones de Windows redirigen directorios específicos relacionados con la aplicación a la carpeta C:\Program Files\WindowsApps. Si la aplicación intenta escribir en el contenedor de aplicaciones de Windows, se desencadena un error y se produce un error en la escritura. Puede realizar mejoras en el paquete de aplicaciones de Windows para resolver este problema.

Investigación

En primer lugar, identifique el error y las rutas de acceso del directorio que solicita la aplicación.

Captura del error de la aplicación de Windows

El filtrado de los resultados es opcional, pero facilita la visualización de errores relacionados con la aplicación. Para filtrar los resultados, cree dos reglas de filtro. El primer filtro incluye el nombre del proceso de la aplicación, y el segundo filtro incluye cualquier resultado que no sea exitoso.

  1. Descargue y extraiga el Monitor de procesos de SysInternals en el directorio C:\PSF\ProcessMonitor .

  2. Abra el Explorador de Windows y vaya a la carpeta SysInternals ProcessMonitor extraída.

  3. Seleccione el archivo procmon.exe SysInternals Process Monitor para iniciar la aplicación.

  4. Si UAC lo solicita, seleccione .

  5. En la ventana Filtro del Monitor de procesos, seleccione Nombre del proceso en el menú desplegable del primer campo.

  6. Compruebe que aparece en el campo siguiente.

  7. En el campo siguiente, escriba el nombre del proceso de la aplicación, por ejemplo ,PSFSample.exe.

    Ejemplo de la ventana Filtro del Monitor de procesos con el nombre de la aplicación.

  8. Selecciona Agregar.

  9. En la ventana Filtro del Monitor de procesos, seleccione Resultado en el menú desplegable del primer campo.

  10. En el campo siguiente, seleccione no es en el menú desplegable.

  11. En el campo de texto, escriba SUCCESS.

    Ejemplo de la ventana Filtro del Monitor de procesos con Resultado.

  12. Seleccione Agregar y luego Aceptar.

  13. Inicie la aplicación de Windows, desencadene el error y cierre la aplicación de Windows.

Revisión de los registros de errores de la aplicación de Windows

Después de capturar los procesos de la aplicación de Windows, investigue los resultados para determinar si el error está relacionado con el directorio de trabajo.

Revise los resultados del error de SysInternals Process Monitor. Si los resultados incluyen Acceso denegado, con un detalle Acceso Deseado: Escritura Genérica, para su aplicación dirigida a C:\Program Files\WindowsApps\...\, ha identificado un error de permiso de escritura relacionado con el directorio de trabajo.

Muestra el mensaje de error observado en el Monitor de procesos de SysInternals por fallo al escribir en el directorio.

Si identifica este error, aplique la siguiente corrección de PSF a la aplicación.

Resolución

Para resolver el problema de la aplicación de Windows que no puede escribir en el contenedor de aplicaciones de Windows, siga estos pasos:

  1. Extraiga el contenido de la aplicación de Windows en un directorio de almacenamiento provisional local.
  2. Cree un config.json e inyecte los archivos de corrección de PSF en el directorio de las aplicaciones de Windows en almacenamiento provisional.
  3. Configure el iniciador de aplicaciones para que apunte al iniciador de PSF y configure el archivo config.json PSF para redirigir el iniciador de PSF, especificando el directorio de trabajo.
  4. Actualice el archivo AppxManifest de la aplicación de Windows.
  5. Vuelva a empaquetar y firme la aplicación de Windows.

Descarga e instalación de las herramientas necesarias

Este proceso requiere las siguientes herramientas:

  • Herramienta de cliente de NuGet
  • Framework de soporte de paquetes (PSF)
  • Kit de herramientas de desarrollo de software de Windows 10 (SDK de Win 10), versión más reciente
  • Monitor de procesos de SysInternals

Para descargar e instalar NuGet y PSF:

  1. Descargue la versión no preliminar más reciente de la herramienta cliente NuGet y guarde nuget.exe en C:\PSF\nuget.

  2. Descargue e instale el marco de soporte técnico de paquetes con NuGet mediante la ejecución del siguiente comando desde una ventana administrativa de PowerShell:

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    

Para descargar e instalar el SDK de Windows 10:

  1. Descargue el SDK de Win 10.
  2. Ejecute winsdksetup.exe .
  3. Seleccione Siguiente.
  4. Seleccione solo las tres características siguientes:
    • Herramientas de firma de Windows SDK para aplicaciones de escritorio
    • Windows SDK para aplicaciones de C++ para UWP
    • Localización del SDK de Windwos para aplicaciones para UWP
  5. Seleccione Instalar y, a continuación, seleccione Aceptar.

Almacenar provisionalmente la aplicación de Windows

El almacenamiento provisional de la aplicación de Windows extrae y desempaqueta el contenido de la aplicación en un directorio local. Una vez que la aplicación de Windows está desempaquetada en la ubicación de almacenamiento provisional, puede insertar archivos de corrección de PSF para corregir cualquier experiencia no deseada.

  1. En una ventana de PowerShell administrativa, establezca las siguientes variables para establecer como destino el archivo de aplicación específico y la versión del SDK de 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
    
  2. Desempaquete la aplicación de Windows en la carpeta de almacenamiento provisional mediante la ejecución del siguiente cmdlet de 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"
    

Crear e insertar archivos PSF necesarios

Para corregir la aplicación de Windows, creas un archivo config.json con información sobre el iniciador de aplicaciones de Windows que produce un error. Si varios iniciadores de aplicaciones de Windows están experimentando problemas, puede configurar el archivo config.json con varias entradas.

Después de crear el archivo config.json, mueva el config.json y los archivos de corrección de PSF de soporte a la raíz del paquete de la aplicación de Windows.

  1. Abra Visual Studio Code u otro editor de texto.

  2. Cree un nuevo archivo denominado config.json en el directorio de almacenamiento provisional de la aplicación de Windows, C:\PSF\Staging\PSFSampleApp.

  3. Copie el código siguiente en el archivo config.json recién creado.

    {
        "applications": [
            {
                "id": "",
                "executable": ""
            }
        ],
        "processes": [
            {
                "executable": "",
                "fixups": [
                {
                    "dll": "",
                    "config": {
                        "redirectedPaths": {
                            "packageRelative": [
                                {
                                    "base": "",
                                    "patterns": [
                                        ""
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
            }
        ]
    }
    
  4. Abra el archivo AppxManifest.xml en la carpeta de almacenamiento provisional de la aplicación de Windows. En el ejemplo siguiente se muestra un archivo AppxManifest.xml :

    <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>
    
  5. Realice los siguientes cambios en el archivo config.json :

    • Establezca el applications.id valor como el mismo que en el Applications.Application.ID campo del archivo AppxManifest.xml .

      Imagen que muestra la ubicación del identificador dentro del archivo AppxManifest.

    • Configure el valor de applications.executable para dirigirse a la ruta de acceso relativa a la aplicación ubicada en el campo Applications.Application.Executable del archivo AppxManifest.xml.

      Imagen que muestra la ubicación del archivo ejecutable dentro del archivo *AppxManifest.xml*.

    • Establezca el valor de applications.workingdirectory como destino para la ruta de acceso relativa de la carpeta en el campo Applications.Application.Executable del archivo AppxManifest.xml.

      Imagen que muestra la ubicación del directorio de trabajo dentro del archivo AppxManifest.

    • Establezca el valor de process.executable para que sea el destino de nombre de archivo, sin ruta de acceso y extensión, en el campo Applications.Application.Executable del archivo AppxManifest.xml.

      Imagen que muestra la ubicación del archivo ejecutable del proceso dentro del archivo AppxManifest.

    • Establezca el valor processes.fixups.dll para dirigirse a la arquitectura específica FileRedirectionFixup.dll. Si la corrección es para la arquitectura x64, establezca el valor en FileRedirectionFixup64.dll. Si la arquitectura es x86 o es desconocida, establezca el valor en FileRedirectionFixup86.dll.

    • Establezca el valor del processes.fixups.config.redirectedPaths.packageRelative.base en la ruta de la carpeta relativa al paquete en el campo Applications.Application.Executable del archivo AppxManifest.xml.

      Imagen que muestra la ubicación del directorio de trabajo dentro del archivo AppxManifest.

    • Establezca el processes.fixups.config.redirectedPaths.packageRelative.patterns valor para que coincida con el tipo de archivo que crea la aplicación. Si usa .*\\.log, el PSF redirige todas las escrituras de archivos de registro en el directorio processes.fixups.config.redirectedPaths.packageRelative.base y los directorios secundarios.

  6. Guarde el archivo config.json actualizado. En el ejemplo siguiente se muestra un archivo config.json actualizado:

    {
        "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"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }
    
  7. Copie los siguientes archivos de Package Support Framework para la arquitectura ejecutable de la aplicación en la raíz de la aplicación de Windows preconfigurada. Puede encontrar los archivos en .\Microsoft.PackageSupportFramework.\<Version>\bin.

    Aplicación (x64) Aplicación (x86)
    PSFLauncher64.exe PSFLauncher32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe
    FileRedirectionFixup64.dll FileRedirectionFixup64.dll

Actualizar AppxManifest

Después de crear y actualizar el archivo config.json, actualice el archivo AppxManifest.xml de la aplicación de Windows para cada iniciador de aplicaciones de Windows que incluya en el config.json. El AppxManifest.xmlApplications ahora debe tener como destino el PSFLauncher.exe asociado a la arquitectura de la aplicación.

  1. Abra AppxManifest.xml en la carpeta de la aplicación MSIX almacenada provisionalmente, C:\PSF\Staging\PSFSampleApp.
  2. Actualice AppxManifest.xml con el código siguiente:
    <Package ...>
    ...
    <Applications>
        <Application Id="PSFSample"
                    Executable="PSFLauncher32.exe"
                    EntryPoint="Windows.FullTrustApplication">
        ...
        </Application>
    </Applications>
    </Package>
    

Volver a empaquetar la aplicación

Después de aplicar todas las correcciones, vuelva a empaquetar la aplicación de Windows en un MSIX e inicie sesión con un certificado de firma de código.

  1. Abra una ventana de PowerShell administrativa.

  2. Configure las siguientes 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. Vuelva a empaquetar la aplicación de Windows desde la carpeta de almacenamiento provisional mediante la ejecución del siguiente cmdlet de PowerShell:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
    
  4. Para firmar la aplicación de Windows, ejecute el siguiente cmdlet de PowerShell:

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