Marco de compatibilidad de paquetes: corrección de permisos de escritura del sistema de archivos

Investigación

Windows Apps redirigirá directorios específicos relacionados con la aplicación a la carpeta Windows contenedor de aplicaciones. Si una aplicación intenta escribir en el contenedor Windows app, se desencadenará un error y se producirá un error en la escritura.

Con el marco de compatibilidad de paquetes (PSF), se pueden realizar mejoras en el paquete Windows app para resolver este problema. En primer lugar, debemos identificar el error y las rutas de acceso de directorio solicitadas por la aplicación.

Captura del error Windows aplicación

Filtrar los resultados es un paso opcional, que facilitará la visualización de los errores relacionados con la aplicación. Para ello, crearemos dos reglas de filtro. El primero es un filtro de inclusión para el nombre del proceso de aplicación y el segundo es una inclusión de los resultados que no se han realizado correctamente.

  1. Descargue y extraiga el Monitor de procesos SysInternals en el directorio C:\PSF\ProcessMonitor.
  2. Abra Windows explorador de procesos y vaya a la carpeta del Monitor de procesos sysinternals extraída.
  3. Haga doble clic en el archivo SysInternals Process Monitor (procmon.exe) e inicie la aplicación.
  4. Si UAC lo solicita, seleccione el botón Sí.
  5. En la ventana Filtro del Monitor de procesos, seleccione el primer menú desplegable con la etiqueta Arquitectura.
  6. Seleccione Nombre del proceso en el menú desplegable.
  7. En el siguiente menú desplegable, compruebe que está establecido con el valor de es.
  8. En el campo de texto, escriba el nombre del proceso de la aplicación (ejemplo: PSFSample.exe). Ejemplo del filtro del Monitor de Windows con el nombre de la aplicación
  9. Seleccione el botón Agregar.
  10. En la ventana Filtro del Monitor de procesos, seleccione el primer menú desplegable con la etiqueta Nombre del proceso.
  11. Seleccione Resultado en el menú desplegable.
  12. En el siguiente menú desplegable, selecciónelo y seleccione no en el menú desplegable.
  13. En el campo de texto, escriba: SUCCESS. Ejemplo del filtro del Monitor de procesos Windows con resultado
  14. Seleccione el botón Agregar.
  15. Seleccione el botón Aceptar.
  16. inicie la Windows, desencadene el error y cierre la Windows aplicación.

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

Después de capturar los Windows app, los resultados se deben investigar para identificar si el error está relacionado con el directorio de trabajo.

  1. Revise los resultados del Monitor de procesos sysinternals y busque los errores descritos en la tabla anterior.
  2. Si los resultados muestran un resultado "Nombre no encontrado", con los detalles "Acceso deseado: ..." para la aplicación específica destinada a un directorio fuera del "C:\Archivos de programa\WindowsApps\...\" (como se muestra en la imagen siguiente), ha identificado correctamente un error relacionado con el directorio de trabajo, use el artículo Soporte técnico de PSF- Acceso al sistema de archivos para obtener instrucciones sobre cómo aplicar la corrección de PSF a la aplicación. Muestra el mensaje de error que aparece en el Monitor de procesos de SysInternals en caso de error al escribir en el directorio.

Solución

Windows Apps redirigirá directorios específicos relacionados con la aplicación a la carpeta Windows contenedor de aplicaciones. Si una aplicación intenta escribir en el contenedor Windows app, se desencadenará un error y se producirá un error en la escritura.

Para resolver el problema relacionado con el error de escritura de Windows App en el contenedor Windows App, debemos seguir los cuatro pasos siguientes:

  1. Almacenamiento por fases Windows aplicación en un directorio local
  2. Cree el archivo Config.json e inyecte los archivos PSF necesarios.
  3. Actualización del Windows app appxManifest
  4. Volver a empaquetar y firmar la Windows aplicación

Los pasos anteriores proporcionan instrucciones a través de la extracción del contenido de la aplicación de Windows en un directorio de almacenamiento temporal local, la inserción de los archivos de corrección de PSF en el directorio de aplicación Windows de almacenamiento temporal, la configuración de Application Selector para que apunte al iniciador de PSF y, a continuación, la configuración del archivo PSF config.json para redirigir el iniciador de PSF a la aplicación que especifica el directorio de trabajo.

Descargar e instalar las herramientas necesarias

Este proceso le guiará a través de la recuperación y el uso de las siguientes herramientas:

  • NuGet Client Tool
  • Marco de compatibilidad de paquete
  • Windows 10 SDK (versión más reciente)
  • Monitor de procesos sysinternals

A continuación se proporcionan instrucciones paso a paso sobre cómo descargar e instalar las herramientas necesarias.

  1. Descargue la versión más reciente (no preliminar) de la herramienta clienteNuGet y guarde elnuget.exeen la carpeta .

  2. Descargue el marco de compatibilidad de paquetes con Nuget mediante la ejecución de lo siguiente desde una ventana de PowerShell administrativa:

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

    1. Descargue el SDK de Win 10.
    2. Ejecute el winsdksetup.exe que se descargó en el paso anterior.
    3. Haga clic en el botón Siguiente.
    4. Seleccione solo las tres características siguientes para la instalación:
      • 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 el botón Instalar.
    6. Seleccione el botón Aceptar.

Fase de la Windows aplicación

Mediante el almacenamiento provisional Windows aplicación, extraeremos o desempaquetaremos el contenido de la aplicación Windows en un directorio local. Una vez que Windows aplicación se ha desempaquetar en la ubicación de almacenamiento provisional, se pueden insertar archivos de corrección de PSF que corrija las experiencias no deseadas.

  1. Abra una ventana administrativa de PowerShell.

  2. Establezca las siguientes variables destinadas a su archivo de aplicación específico y Windows 10 versión del 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. Desempaquete Windows app 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"
    

Creación e inyección de archivos PSF necesarios

Para aplicar acciones correctivas a Windows App, se debe crear un archivo config.json y proporcionar información sobre el Windows app Selector que está fallando. Si hay varios Windows iniciadores de aplicaciones que están experimentando problemas, el archivo config.json se puede actualizar con varias entradas.

Después de actualizar el archivo config.json, el archivo config.json y los archivos de corrección de PSF compatibles se deben mover a la raíz del paquete Windows App.

  1. Abra Visual Studio Code (VS Code) o cualquier otro editor de texto.

  2. Cree un nuevo archivo; para ello, seleccione el menú Archivo en la parte superior de la VS Code y seleccione Nuevo archivo en el menú desplegable.

  3. Guarde el archivo como config.json;para ello, seleccione el menú Archivo en la parte superior de la ventana VS Code y seleccione Guardar en el menú desplegable. En la ventana Guardar como, vaya al directorio Windows App Staging(C:\PSF\Staging\PSFSampleApp)y establezca el nombre de archivo como . Seleccione el botón Guardar.

  4. 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": [
                                        ""
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
            }
        ]
    }
    
  5. Abra el archivo Windows App App AppxManifest que se encuentra en la carpeta de almacenamiento provisional de Windows App (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) mediante VS Code u otro 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. Establezca el applications.id valor de applications.id en el mismo valor que se encuentra en el campo Applications.Application.ID del archivoAppxManifest.xml configuración. Imagen que rodea la ubicación del identificador en el archivo AppxManifest.

  7. Establezca el valor de config.json como destino de la ruta de acceso relativa a la aplicación ubicada en el campo applications.executableApplications.Application.ExecutabledelAppxManifest.xml archivo. applications.executable Imagen que rodea la ubicación del ejecutable dentro del archivo AppxManifest.

  8. Establezca el valor de config.json como destino de la ruta de acceso de carpeta relativa que se encuentra en el campo applications.workingdirectoryApplications.Application.ExecutabledelAppxManifest.xml archivo. applications.workingdirectory Imagen que rodea la ubicación del directorio de trabajo dentro del archivo AppxManifest.

  9. Establezca el valor de config.json como destino del nombre de archivo (sin ruta de acceso ni extensiones) que se encuentra en el campo process.executableApplications.Application.ExecutabledelAppxManifest.xml archivo. process.executable Imagen que rodea la ubicación del archivo ejecutable del proceso en el archivo AppxManifest.

  10. Establezca el processes.fixups.dll valor de processes.fixups.dll destino de la arquitectura específica FileRedirectionFixup.dll. Si la corrección es para la arquitectura x64, establezca el valor para que FileRedirectionFixup64.dll. Si la arquitectura es x86 o es desconocida, establezca el valor para que se FileRedirectionFixup86.dll

  11. Establezca el valor de config.json en la ruta de acceso de la carpeta relativa del paquete, tal como se encuentra en processes.fixups.config.redirectedPaths.packageRelative.baseel archivo Applications.Application.ExecutabledelAppxManifest.xml paquete. processes.fixups.config.redirectedPaths.packageRelative.base Imagen que rodea la ubicación del directorio de trabajo dentro del archivo AppxManifest.

  12. Establezca el processes.fixups.config.redirectedPaths.packageRelative.patterns valor del archivo processes.fixups.config.redirectedPaths.packageRelative.patterns para que coincida con el tipo de archivo creado por la aplicación. Mediante ".*\.log", la PSF redirigirá las escrituras de todos los archivos de registro que se encuentran en el directorio identificado en la ruta de acceso processes.fixups.config.redirectedPaths.packageRelative.base, así como los directorios secundarios.

  13. Guarde el 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"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }
    
  14. Copie los cuatro archivos siguientes del marco de compatibilidad de paquetes en función de la arquitectura ejecutable de la aplicación en la raíz del archivo Windows aplicación. Los archivos siguientes se encuentran en .\Microsoft.PackageSupportFramework. Versión > \bin.

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

Actualización de AppxManifest

Después de crear y actualizar el archivo config.json, elAppxManifest.xmlde la aplicación de Windows debe actualizarse para cada Windows App Selector que se incluyó en config.json. Las aplicaciones de AppxManifestahora deben tener como destino laPSFLauncher.exe asociada a la arquitectura de aplicaciones.

  1. Abra Explorador de archivos y vaya a la carpeta Staged MSIX App(C:\PSF\Staging\PSFSampleApp).

  2. Haga clic con el botón derecho enAppxManifest.xmly seleccione Abrir con Código en el menú desplegable (opcionalmente, puede abrir con otro editor de texto).

  3. Actualice el AppxManifest.xml con la siguiente información:

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

Volver a empaquetar la aplicación

Se han aplicado todas las correcciones, ahora la aplicación de Windows se puede volver a empaquetar en un MSIX y firmarse mediante un certificado de firma de código.

  1. Abra una ventana administrativa de PowerShell.

  2. Establezca 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 Windows app 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. Firme la Windows aplicación mediante la ejecución del 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