Cómo funciona la compatibilidad de aplicaciones en Windows — modo de compatibilidad, shims y Compatibility Administrator para prolongar aplicaciones antiguas

· Actualizado el: · · Windows, Modo de compatibilidad, Shims, Compatibilidad de aplicaciones, Compatibility Administrator, Activos heredados, Desarrollo en Windows, Sistemas existentes

Historial de revisiones (primera versión, publicada el 20 Aug 2026)
Primera publicación
Citar este artículo(DOI (archivo registrado): 10.5281/zenodo.22176294)

Los DOI siguientes remiten a versiones ya archivadas y pueden diferir del texto actual. Para citar el texto actual, utilice la URL de esta página.

Go Komura (2026). Cómo funciona la compatibilidad de aplicaciones en Windows — modo de compatibilidad, shims y Compatibility Administrator para prolongar aplicaciones antiguas. KomuraSoft LLC. https://comcomponent.com/es/blog/windows-appcompat-shims-compatibility-mode/

DOI (archivo registrado)
10.5281/zenodo.22176294
DOI (última versión registrada)
10.5281/zenodo.22176295

«Una aplicación de negocio de hace diez años, de la que ya no queda el código fuente, no arranca en un PC nuevo con Windows 11. Sin embargo, al elegir “Windows XP” en la pestaña de compatibilidad, funcionó. ¿Se puede seguir usándola así?». En los equipos que custodian aplicaciones antiguas hay consultas de este tipo.

El modo de compatibilidad no es una función que devuelva todo el SO a un Windows antiguo. Es un mecanismo que, solo para esa aplicación, complementa el comportamiento que asume un Windows antiguo. En el centro están las pequeñas correcciones de compatibilidad que se interponen entre la aplicación y la API de Windows: el shim.1

Este artículo, dirigido a responsables de sistemas de pequeñas y medianas empresas y a desarrolladores de aplicaciones de Windows, se organiza en el orden qué se puede corregir → por qué funciona → cómo aplicarlo y distribuirlo → cómo decidir entre prolongar o migrar. A partir de fuentes primarias de Microsoft Learn, confirma lo que ocurre más allá de la casilla.

1. Primero la conclusión — el modo de compatibilidad se puede usar. Como prolongación, hay que gestionarlo

Seguir el negocio de momento con el modo de compatibilidad es, en sí, una elección razonable que usa un mecanismo previsto oficialmente por Windows. El propio Windows aplica correcciones de compatibilidad a aplicaciones conocidas.1 La aplicación, sin embargo, no se ha corregido. El camino de fondo es, al final, dejarla en una forma que funcione sin shims.

Si usarlo o no se ordena mejor en este orden.

Orden de decisión Qué comprobar Dónde leerlo
1. Acotar el ámbito de aplicación ¿El problema es cómo usa la API la aplicación? ¿O es un problema de controlador, de 16 bits o de hardware dedicado? Capítulos 2 y 3
2. Elegir la corrección necesaria Qué hay que complementar para que funcione: comprobación de versión, rutas, petición de privilegios, etc. Capítulos 4 y 5. La configuración ya hecha, capítulo 6; RunAsInvoker, capítulo 7; la distribución de shims individuales, capítulo 8
3. Decidir la operación una vez que funciona ¿Se puede registrar la configuración y verificarla en cada actualización de Windows? ¿Hasta cuándo se prolonga? Capítulo 9

En particular, «devolver éxito a la comprobación de si es administrador» y «conceder privilegios de administrador» son cosas distintas. El shim está sujeto a las mismas restricciones de seguridad que la aplicación y no elude las protecciones del SO.12 RunAsInvoker, igual, suprime la solicitud de elevación y arranca con los mismos privilegios que quien lo invoca; no es una función que aumente privilegios.3

Si se entiende el mecanismo, se puede pasar de una prolongación de «no se toca porque nadie sabe por qué funciona» a una en la que se puede explicar hasta dónde se puede confiar, en qué condiciones se rompe y cuándo rehacerla.

Entender el mecanismo cambia la calidad de la prolongaciónUsar el modo de compatibilidad sin conocer el mecanismo lleva a una prolongación inestable que nadie toca; si se entiende el mecanismo, se puede decidir con fundamento hasta dónde se puede confiar, qué lo romperá y cuándo rehacerlaUsarlo sin conocer el mecanismoProlongación inestable que no se tocaUsarlo entendiendo el mecanismoDecisión con fundamentoHasta dónde se puede confiarQué lo romperáCuándo rehacerla

Figura 1: Aunque sea la misma prolongación, la calidad cambia entre la inquietud de no conocer el mecanismo y una decisión basada en entenderlo.

En el diagrama, una línea continua marca una relación que siempre se cumple y una línea discontinua una relación condicional (las condiciones están en la explicación de cada relación en la página de detalle). La lista completa de relaciones (16 en total, con evidencia y grado de certeza) y las definiciones de los conceptos principales están reunidas en la página de detalle del mapa de conocimiento (en japonés). Datos: JSON-LD / Turtle

2. El primer aislamiento — ¿es un problema que un shim puede corregir?

2.1. Lo que se puede corregir es un problema del lado de la aplicación en modo usuario

Lo que un shim puede hacer cabe en el alcance de lo que también se puede hacer corrigiendo el código de la aplicación. Es un medio alternativo cuando no hay código fuente, el soporte del proveedor ha terminado o no se puede corregir ahora mismo, no algo más potente que corregir el código.1

Por ejemplo, entran en el ámbito problemas como rechazar el arranque según la versión del SO, asumir un destino de escritura antiguo, o pedir privilegios de administrador que en realidad no hacen falta. Los shims concretos se confirman en el capítulo 5.

2.2. Casos que no se resuelven por más que se pruebe la configuración

Los problemas siguientes necesitan una medida distinta del modo de compatibilidad.

Problema Por qué el shim no lo resuelve
Incompatibilidad de modo kernel El shim se ejecuta dentro de un proceso en modo usuario, así que no puede corregir un controlador de dispositivo. Igual ocurre con un controlador no compatible de un instrumento de medida, un dongle USB o una impresora, o con parte de un antivirus que se ejecuta en el kernel
Aplicación de 16 bits en Windows de 64 bits El SO no admite ejecutar aplicaciones de 16 bits y el propio arranque falla
Acceso directo al hardware La premisa de tocar puertos de E/S o memoria física desde modo usuario supera lo que un shim puede falsificar
Eludir un mecanismo de seguridad El shim no puede convertir una operación no permitida a la aplicación en una operación permitida

Los problemas de modo kernel y las restricciones de seguridad vienen del lugar en el que se ejecuta el shim.1 ForceAdminAccess y WRPMitigation solo falsifican el éxito de una comprobación o de una escritura para que la aplicación siga adelante; no reescriben de verdad un recurso protegido.2

En el problema de 16 bits, compruebe no solo la aplicación, sino también el instalador. Aunque el cuerpo sea de 32 bits, un paquete antiguo cuyo arranque (el stub) es de 16 bits da «la aplicación funciona, pero no se puede instalar». En Windows de 64 bits, el identificador tiene bits válidos de 32 bits y no se puede recortar a 16 para pasarlo, entre otras razones por las que las aplicaciones de 16 bits no se admiten y el arranque falla con ERROR_BAD_EXE_FORMAT.4

Casos en los que el shim no funcionaEl shim se ejecuta dentro de un proceso en modo usuario, así que no funciona en un problema de controlador de modo kernel, una aplicación de 16 bits, el acceso directo al hardware ni eludir un mecanismo de seguridadno funcionano funcionano funcionano funcionaShim (se ejecuta en modo usuario)Controlador de kernelAplicación de 16 bitsAcceso directo al hardwareEludir un mecanismo de seguridadEn 64 bits falla el propio arranqueSolo falsifica el éxito para seguir adelante

Figura 2: El shim se limita al modo usuario y no llega al kernel, a 16 bits, al acceso directo al hardware ni a eludir la seguridad.

Además, una aplicación con comprobación de integridad propia, como una protección anticopia antigua o una detección de alteración, a veces trata el propio hook de API como anomalía. Tampoco es cierto que cualquier aplicación de modo usuario se pueda salvar con un shim.

3. Separar funciones parecidas — shim, virtualización de UAC, WOW64 y virtualización de PPP

El mecanismo que está trabajando cuando «una aplicación antigua funcionó» no es solo el shim. Conviene separar las capas de compatibilidad hacia atrás que tiene Windows. En la práctica, a veces se combinan varias.

Capa Qué hace Destino principal
Shim (modo de compatibilidad) Se interpone en la llamada a la API y falsifica la misma respuesta que un Windows antiguo Aplicaciones escritas asumiendo un SO antiguo, en general
Virtualización de UAC (archivos/Registro) Transfiere las escrituras sin privilegios a HKLM\Software o Program Files al VirtualStore por usuario Aplicaciones de 32 bits escritas asumiendo privilegios de administrador
WOW64 Ejecuta tal cual una aplicación de 32 bits en Windows de 64 bits (ofrece las vistas de 32 bits del Registro y de los archivos) Aplicaciones de 32 bits en general
Virtualización de PPP Hace que una aplicación no compatible con PPP se dibuje a 96 PPP y la muestra ampliando el mapa de bits Aplicaciones antiguas en pantallas de PPP alto

3.1. Virtualización de UAC: desviar el destino de escritura por usuario

La virtualización de UAC es una medida transitoria que actúa sobre procesos interactivos de 32 bits sin manifiesto. Microsoft misma la sitúa como técnica provisional que tiene intención de quitar de Windows en el futuro.5 WOW64, que ejecuta aplicaciones de 32 bits, y la virtualización de UAC, que transfiere el destino de escritura por usuario, son mecanismos distintos.

La redirección a Wow6432Node y los daños reales de VirtualStore, con su tratamiento, se cubren en Redirección y virtualización de 32/64 bits en el registro de Windows. Este artículo se queda en el alcance necesario para distinguirlos del shim.

Situación de la virtualización de UACLa virtualización de UAC es una medida transitoria que actúa sobre procesos interactivos de 32 bits sin manifiesto, transfiere la escritura al VirtualStore por usuario, y Microsoft misma declara que es una técnica provisional con intención de quitarla de Windows en el futuroProceso interactivo de 32 bits sin manifiestoActúa la virtualización de UACTransferencia al VirtualStore por usuarioTécnica provisional con intención de quitarla en el futuro

Figura 3: La virtualización de UAC es una medida transitoria para procesos de 32 bits sin manifiesto y no se puede confiar en ella de forma permanente.

3.2. Virtualización de PPP: estirar un dibujo antiguo

Una aplicación que no declara compatibilidad con PPP se trata como si se dibujara a 96 PPP (100 %). Windows estira ese mapa de bits, de modo que en un monitor de PPP alto la imagen se ve borrosa. «Invalidar la configuración de PPP alto» de la pestaña de compatibilidad es el interruptor que cambia este comportamiento de virtualización.6

Mecanismo de la virtualización de PPPUna aplicación que no declara compatibilidad con PPP se trata como dibujada a 96 PPP; Windows estira el mapa de bits y se ve borrosa, y la invalidación de PPP alto de la pestaña de compatibilidad cambia este comportamiento de virtualizacióncambia el comportamiento de virtualizaciónAplicación que no declara compatibilidad con PPPSe trata como dibujada a 96 PPPSe muestra estirando el mapa de bitsSe ve borrosa en un monitor de PPP altoInvalidar la configuración de PPP alto

Figura 4: Una aplicación no compatible con PPP se estira tratándola como 96 PPP, y la invalidación de la pestaña de compatibilidad es el interruptor de esta virtualización.

4. Por qué funciona el modo de compatibilidad — el shim y su aplicación al arrancar

4.1. Sustituir el destino de la llamada a la API

En la ruta por la que un archivo ejecutable de Windows (formato PE) llama a una API de una DLL externa está la tabla de direcciones de importación (IAT). En una llamada a GetVersionEx, por ejemplo, el control pasa a la dirección escrita en la IAT.

El shim, al cargar la aplicación, reescribe esa entrada de la IAT con la dirección del código del shim. Eso es un hook de API. Las API que se obtienen de forma dinámica con GetProcAddress se cubren enganchando el propio GetProcAddress.1

El shim que se interpone devuelve una versión antigua del SO o cambia el destino de acceso a archivos y, si hace falta, llama a la API real. Muestra a la aplicación «el comportamiento de Windows que espera» y pasa al SO una llamada que encaja con el mecanismo actual: un intérprete, en cierto sentido.

Ruta por la que el shim se interpone en la llamada a la APILa llamada a la API de la aplicación pasa por la IAT; al cargar se reescribe la entrada de la IAT hacia el shim, el shim se interpone, falsifica la misma respuesta que un Windows antiguo y, si hace falta, llama a la API realllamada a la APIal cargar, se reescribe hacia el shimsi hace faltase cubre con un hookAplicaciónEntrada de la IATShim (intérprete)API real de WindowsFalsifica la misma respuesta que un Windows antiguoLlamada vía GetProcAddress

Figura 5: El shim se interpone entre la aplicación y la API de Windows. Lo que se reescribe es la IAT del lado de la aplicación; el SO en sí no cambia.

Lo que cambia es la ruta de llamada del lado de la aplicación, no el SO en sí. Como el shim se ejecuta bajo las mismas restricciones de seguridad que la aplicación, tampoco hace falta relajar la configuración de seguridad del SO para usarlo.1

4.2. El .sdb decide «qué se aplica a qué EXE»

La base de datos de shims es un archivo binario con extensión .sdb. Identifica el archivo ejecutable con atributos de coincidencia como el nombre, el tamaño, la suma de comprobación y la versión, y los coteja al arrancar el proceso. Los términos que se usan aquí se separan así.7

Término Papel
Appfix (shim) Aplica una corrección de compatibilidad como un hook de API
Apphelp Muestra un mensaje del tipo «esta aplicación tiene un problema de compatibilidad»
Capa de compatibilidad (modo de compatibilidad) Aplica un conjunto de varios shims y marcas

No se coteja solo la aplicación a la que el usuario ha configurado el modo de compatibilidad. En el arranque de todos los procesos se coteja con la base de datos estándar del SO. Windows incluye correcciones de miles de aplicaciones conocidas; el contenido está bajo %WINDIR%\AppPatch. Las correcciones de compatibilidad que proporciona Microsoft se envían como parte de Windows y se actualizan con Windows Update.1

Cotejo con la base de datos de shims al arrancar el procesoEn el arranque de todos los procesos se coteja con la base de datos de shims; si hay un registro que coincide por atributos, se inyecta un shim con Appfix o se muestra un mensaje de Apphelp; si no, arranca tal cualsísínoconjunto de varios shims y marcasArranque del procesoCotejo con la base de datos de shims (.sdb)Cotejo por nombre de archivo, tamaño, etc.¿Hay registro?Appfix (inyecta el shim)Apphelp (muestra un mensaje)Arranca tal cualCapa de compatibilidad (modo de compatibilidad)

Figura 6: El cotejo no es solo de las aplicaciones con modo de compatibilidad configurado: se hace en el arranque de todos los procesos.

La capa de compatibilidad incluye no solo hooks de API, sino también marcas de arranque. El RunAsInvoker del capítulo 7 no intercepta la API: es una corrección de compatibilidad que actúa sobre el nivel de ejecución al arrancar, como marca del cargador.3

4.3. PCA a veces encuentra el problema y lo aplica

Aunque el administrador no lo configure a mano, PCA (Program Compatibility Assistant) a veces aplica una configuración de compatibilidad. PCA vigila la ejecución de la aplicación y, si detecta indicios de un problema conocido, propone una corrección o, en algunos casos, la aplica de forma automática.8

Por ejemplo, a una aplicación que se bloquea al llamar código dentro de una DLL ya liberada se le usa un modo de compatibilidad como PINDLL; a una que falla al escribir en un archivo de Windows protegido, WRPMITIGATION.8

Flujo por el que PCA aplica de forma automática una configuración de compatibilidadPCA vigila la ejecución de la aplicación y, si detecta indicios de un problema de compatibilidad conocido, propone al usuario aplicar la corrección o, en algunos casos, aplica de forma automática la configuración de compatibilidadsíse responde con una propuestaalgunos casosnoEjecución de la aplicaciónPCA vigila¿Indicios de un problema conocido?¿Qué caso?Propone aplicar la correcciónAplica de forma automática la configuración de compatibilidadSe ejecuta tal cualEjemplo: PINDLL o WRPMITIGATION

Figura 7: PCA vigila la ejecución de la aplicación y, si detecta indicios de un problema conocido, propone la corrección o la aplica de forma automática.

El fenómeno de «el modo de compatibilidad estaba marcado sin haberlo configurado» es, en muchos casos, esta ruta. No tiene por qué ser un fallo o un error de operación: también es el resultado de que Windows ha respondido al problema.

5. Elegir la corrección a partir del síntoma — shims representativos y la comprobación de versión

5.1. Lo que cubren los shims ya hechos

De los shims ya hechos que publica Microsoft, estos son los que se usan a menudo para prolongar una aplicación de negocio.2

Shim Lo que puede hacer (resumen)
WinXPSP3VersionLie y la familia VersionLie Devuelve a la consulta de versión del SO una versión antigua indicada (falsificación de versión)
CorrectFilePaths Desvía el acceso a una ruta de archivo en la que no se puede escribir o que no existe hacia otro lugar
VirtualRegistry Redirige o falsifica la lectura y escritura del Registro (incluye falsificación de versión y simulación de claves inexistentes)
ForceAdminAccess Devuelve temporalmente True a la comprobación de «¿pertenece al grupo de administradores?»
RunAsAdmin / RunAsHighest / RunAsInvoker Da desde fuera un nivel de ejecución equivalente a requireAdministrator / highestAvailable / asInvoker del manifiesto
WRPMitigation Falsifica el éxito de una escritura en un archivo o una clave del Registro del SO protegidos y deja seguir a la aplicación
EmulateGetDiskFreeSpace Devuelve el espacio libre en disco como máximo 2 GB (contra aplicaciones que desbordan el dígito en discos grandes)
GlobalMemoryStatusLie Falsifica el valor informado del estado de la memoria (contra aplicaciones que fallan en la comprobación de memoria al arrancar)
LoadLibraryRedirect Hace cargar la DLL más reciente del lado de Windows en lugar de una DLL de sistema antigua incluida con la aplicación

Lo que hacen muchos shims es devolver la respuesta que espera una aplicación antigua. Reproducen, solo dentro de ese proceso, las premisas de la época en que se hizo la aplicación: «el disco llega hasta 2 GB», «el SO es XP», «la comprobación de administrador tiene éxito». Como se vio en el capítulo 2, falsificar la respuesta y cambiar de verdad los privilegios o los recursos son cosas distintas.

5.2. El valor de GetVersionEx cambia aunque no se elija el modo de compatibilidad

La falsificación de versión no es solo cosa de haber elegido a mano el modo de compatibilidad. A partir de Windows 8.1, el valor que devuelve GetVersionEx depende del manifiesto de la aplicación. Si en <compatibility> no hay declaración <supportedOS>, aunque esté en un Windows nuevo devuelve 6.2, equivalente a Windows 8. Si hay declaración, devuelve el valor hasta el SO más alto declarado. Por ejemplo, una aplicación que declara el GUID de Windows 8.1, incluso en Windows 11, es 6.3.910

Si además se aplica un shim de la familia VersionLie, informa la versión del SO elegido en el modo de compatibilidad. Hay que mirar en orden la respuesta predeterminada por el manifiesto y la sustitución de respuesta por el shim.9

Cómo se decide la versión del SO que ve la aplicaciónEl valor que devuelve GetVersionEx lo decide si hay declaración supportedOS en el manifiesto; si no hay, devuelve 6.2 equivalente a Windows 8; si hay, el valor hasta el SO más alto declarado; si se aplica un shim VersionLie, se sobrescribe con la versión del SO elegido en el modo de compatibilidadnosísínoConsulta de GetVersionEx¿Hay declaración supportedOS?Devuelve el equivalente a Windows 8 (6.2)Valor hasta el SO más alto declarado¿Shim de la familia VersionLie aplicado?Valor del SO elegido en el modo de compatibilidadSe devuelve el valor tal cual

Figura 8: La versión de Windows que ve la aplicación se decide en varios escalones, manifiesto y shim.

Por tanto, el lugar que hay que comprobar también se divide por el síntoma. Si una aplicación propia está tratando Windows 11 como Windows 8, primero compruebe la declaración supportedOS. Si una aplicación antigua rechaza el arranque solo con la comprobación de versión, vale la pena probar VersionLie. A menudo el comportamiento real no tiene problema en un SO nuevo, y este tipo tiene alta probabilidad de que el shim elimine el rechazo del arranque.

Dos síntomas causados por la versión y su tratamientoSi una aplicación propia trata Windows 11 como 8, sospeche la declaración supportedOS del manifiesto; una aplicación antigua que rechaza el arranque por la comprobación de versión se puede superar con alta probabilidad con un shim VersionLieTrata Windows 11 como 8Sospechar la declaración supportedOSRechazo de arranque por comprobación de versiónIntentar superarlo con VersionLieA menudo el comportamiento en sí no tiene problema en un SO nuevo

Figura 9: Si el síntoma es que el juicio se queda antiguo, sospeche el manifiesto; si es rechazo de arranque, VersionLie.

6. Confirmar primero en un equipo — la pestaña de compatibilidad y la clave Layers

6.1. Ver dónde se guarda la casilla

La configuración que se guarda en la pestaña de compatibilidad de las propiedades se escribe en la clave del Registro AppCompatFlags\Layers. Es el destino de especificación de la capa de compatibilidad que también usa la configuración de compatibilidad de aplicaciones de DXGI.11

reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"

En un EXE al que se ha configurado «Windows XP (Service Pack 3)», «Ejecutar este programa como administrador» e «Invalidar la configuración de PPP alto», se ve por ejemplo un valor como el siguiente.

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
    C:\LegacyApp\Gyomu.exe    REG_SZ    ~ WINXPSP3 RUNASADMIN HIGHDPIAWARE

La correspondencia representativa entre cada elemento y el valor es la siguiente. Es un ejemplo de Windows 11; el nombre del elemento y el valor pueden cambiar según la versión del SO.

Elemento de la pestaña de compatibilidad Valor que se escribe (ejemplo) Realidad
Modo de compatibilidad: Windows XP (Service Pack 3) WINXPSP3 Capa de compatibilidad que reúne varios shims, entre ellos la falsificación de versión
Usar 256 colores (color de 8 bits) 256COLOR Mitigación del modo de color antiguo
Ejecutar en resolución 640 × 480 640X480 Ejecución a baja resolución
Deshabilitar las optimizaciones de pantalla completa DISABLEDXMAXIMIZEDWINDOWEDMODE Deshabilita la optimización de dibujo en pantalla completa
Invalidar la configuración de PPP alto (aplicación) HIGHDPIAWARE Deja de aplicar la virtualización de PPP (estirado del mapa de bits)6
Ejecutar este programa como administrador RUNASADMIN Pide elevación al arrancar

6.2. Separar el usuario al que se aplica y el momento de la aplicación

El lado HKCU es configuración solo de ese usuario. Si se guarda desde «Cambiar la configuración para todos los usuarios», se escribe en la clave del mismo nombre de HKLM y se aplica a todos los usuarios. En el kit de equipos, compruebe en cuál se está guardando.

Además, la configuración se aplica al proceso la siguiente vez que se arranca ese EXE. El cargador lee el valor guardado y aplica la capa de compatibilidad correspondiente.

Flujo hasta que surte efecto la configuración de la pestaña de compatibilidadLa configuración de la pestaña de compatibilidad se guarda en la clave Layers de AppCompatFlags como ruta del EXE y valor; la siguiente vez que se arranca ese EXE, el cargador lee el valor y aplica al proceso la capa de compatibilidad correspondienteConfigurar en la pestaña de compatibilidadGuardar la ruta del EXE y el valor en la clave LayersSiguiente arranque del EXEEl cargador lee el valorAplica la capa de compatibilidad al procesoHKCU es solo ese usuarioHKLM surte efecto para todos los usuarios

Figura 10: La realidad de la casilla es una escritura en la clave Layers, y la aplicación ocurre en el siguiente arranque.

6.3. No confunda el modo de compatibilidad con la especificación de elevación

RUNASADMIN convive en la misma clave Layers que WINXPSP3. Si parece que «al configurar el modo de compatibilidad también se añadió o se quitó la elevación», comprobar el valor de forma directa permite separar la especificación de la capa de compatibilidad de la de elevación.

La pestaña de compatibilidad es la entrada a capas ya hechas representativas. La tarea de elegir shims individuales y combinarlos la asume Compatibility Administrator, en el capítulo 8. Antes, veamos RunAsInvoker, que tiene mucho uso en la operación cotidiana.

7. RunAsInvoker — suprimir solo la solicitud de elevación innecesaria

7.1. Separar «pide administrador» de «necesita privilegios de administrador»

Hay aplicaciones de negocio antiguas que, por requireAdministrator en el manifiesto o por una detección errónea de instalador según el nombre o el contenido del EXE, piden elevación de UAC en cada arranque. Sin embargo, muchas solo lo piden por un diseño heredado de la era de XP y en realidad no usan privilegios de administrador.

RunAsInvoker sobrescribe tanto la detección de instalador como el tratamiento del manifiesto y arranca con el token heredado del proceso padre. Si quien lo invoca tiene privilegios de usuario estándar, se queda con esos privilegios.3

Cómo RunAsInvoker suprime la solicitud de elevaciónLa declaración requireAdministrator del manifiesto o una detección errónea de instalador son la causa de la solicitud de elevación de UAC al arrancar; si se aplica RunAsInvoker se sobrescriben ambas y arranca con el token heredado del proceso padrenosíDeclaración requireAdministrator¿RunAsInvoker aplicado?Detección errónea como instaladorSolicitud de elevación de UAC en cada arranqueArranca con el token del padreUna operación que exige administrador falla dentro de la aplicación

Figura 11: RunAsInvoker solo sobrescribe la causa de la solicitud de elevación; los privilegios no aumentan.

7.2. Probarlo de forma temporal con una variable de entorno

Sin crear un .sdb, se puede aplicar de forma temporal la misma capa con la variable de entorno __COMPAT_LAYER. Lo siguiente es un ejemplo que se aplica a los procesos hijo que se arrancan desde ese símbolo del sistema o PowerShell.

:: Aplicar RunAsInvoker a los procesos hijo que se arranquen desde este símbolo del sistema
set __COMPAT_LAYER=RunAsInvoker
start "" "C:\LegacyApp\Gyomu.exe"
# En el caso de PowerShell
$env:__COMPAT_LAYER = 'RunAsInvoker'
Start-Process 'C:\LegacyApp\Gyomu.exe'

Adóptelo después de confirmar que, con los mismos privilegios estándar que el usuario real, funcionan hasta las operaciones que el negocio necesita.2 Si la aplicación no necesita privilegios de administrador, empaquetar el comando en un archivo por lotes y distribuirlo como atajo reduce la distribución de privilegios de administrador local y las llamadas a informática cada vez que UAC pide la contraseña. Es una técnica de compatibilidad en la dirección del principio de privilegio mínimo.

Efecto de distribuir un lote de RunAsInvokerSi se distribuye como atajo un archivo por lotes de 2 líneas que configura RunAsInvoker, no hace falta dar privilegios de administrador local a los usuarios estándar, informática deja de ser llamada por la contraseña de UAC, y la operación se alinea con el principio de privilegio mínimoDistribuir un lote de 2 líneasNo hace falta dar privilegios de administradorInformática no es llamada por UACOperación alineada con el privilegio mínimo

Figura 12: Solo con distribuir el lote se reducen tanto la distribución de privilegios de administrador como las llamadas por UAC.

7.3. Distinguir el alcance que funciona de la aplicación permanente y de la corrección

RunAsInvoker no aumenta los privilegios. Una escritura en HKLM o una actualización bajo Program Files que realmente necesita privilegios de administrador falla dentro de la aplicación. Si se cumplen las condiciones, a veces la virtualización de UAC la transfiere a VirtualStore. Si parece que «guardar la configuración ha dejado de funcionar», sospeche la virtualización.5

El método de la variable de entorno solo funciona en los procesos hijo que arrancan heredando ese entorno. Para una aplicación permanente, use la configuración directa en la clave Layers o la distribución de un .sdb. En la pestaña de compatibilidad no hay un elemento para elegir RUNASINVOKER.

Aplicación temporal y permanente de RunAsInvokerLa aplicación mediante la variable de entorno COMPAT_LAYER solo funciona en los procesos hijo arrancados desde ahí; para aplicarlo de forma permanente se usa la configuración directa en la clave Layers o la distribución con .sdbConfigurar con variable de entornoSolo funciona en el proceso hijoAplicación temporalConfigurar de forma directa en la clave LayersAplicación permanenteDistribuir con sdb

Figura 13: El método de la variable de entorno es una aplicación temporal limitada al proceso hijo; para hacerlo permanente se usa la clave Layers o un .sdb.

Si se puede corregir la aplicación, más que añadir configuración de compatibilidad, el arreglo de fondo es mover el destino de guardado de la configuración bajo %APPDATA% y declarar asInvoker en el manifiesto.3

8. Desplegarlo en la organización — Compatibility Administrator y sdbinst

8.1. Alinear los 32/64 bits de la aplicación y de la herramienta

Compatibility Administrator está incluido en el Windows ADK (Windows Assessment and Deployment Kit).12 Se instalan la versión de 32 bits y la de 64 bits; para corregir una aplicación de 32 bits se usa la de 32 bits, y para una de 64 bits, la de 64 bits.13

Otra precaución: no decida que «está corregido» tras probarlo como administrador. En estado elevado, la virtualización de UAC y la redirección no actúan como de costumbre y se puede juzgar mal el resultado. Confirme el efecto de la corrección con la misma cuenta y los mismos privilegios que el usuario real.2

Dos precauciones al usar Compatibility AdministratorPara corregir una aplicación de 32 bits se usa la versión de 32 bits, y para una de 64 bits la de 64 bits; el efecto de la corrección se confirma no en estado elevado, sino con la misma cuenta y privilegios que el usuario realAplicación de 32 bitsCorregir con la versión de 32 bitsAplicación de 64 bitsCorregir con la versión de 64 bitsProbar en estado elevadoRiesgo de juzgar mal que está corregidoProbar con los mismos privilegios que el usuario realConfirmar el efecto correctamente

Figura 14: El uso diferenciado de las versiones de 32 y 64 bits y la confirmación con los mismos privilegios que el usuario real son las precauciones de entrada.

8.2. Probar primero con una capa y reducir a los shims necesarios y al EXE de destino

La creación de una base de datos de compatibilidad personalizada avanza en este orden.14

  1. En el panel izquierdo, cree una base de datos nueva en «Custom Databases» y elija «Create New» → «Application Fix».
  2. Introduzca el nombre de la aplicación y del proveedor y especifique el archivo EXE de destino.
  3. Elija un modo de compatibilidad (capa) como «compatible con Windows XP» y pruébelo primero con el conjunto de shims.
  4. Si hace falta, elija correcciones de compatibilidad individuales. Se puede reducir a una configuración mínima, solo VersionLie o solo CorrectFilePaths.
  5. Confirme las condiciones de coincidencia —tamaño de archivo, suma de comprobación, versión, etc.— y guarde.

Tanto «elegir el shim que funciona» como «hacerlo funcionar solo en el EXE correcto» son necesarios. La coincidencia suele bastar con las condiciones básicas predeterminadas, pero deje una condición que identifique la versión de la aplicación. Así, cuando el proveedor saque una versión corregida, no se seguirá aplicando la corrección antigua también a esa versión nueva.1415

Procedimiento para crear una base de datos de compatibilidad personalizadaCrear un Application Fix en una base de datos nueva, especificar el nombre de la aplicación y el EXE de destino, probar con el conjunto del modo de compatibilidad, reducir si hace falta a shims individuales, confirmar las condiciones de coincidencia y guardarCrear una base de datos nuevaElegir Application FixEspecificar el nombre de la aplicación y el EXE de destinoProbar con el conjunto del modo de compatibilidadSi hace falta, reducir a shims individualesConfirmar las condiciones de coincidencia y guardarDejar una condición que identifique la versión

Figura 15: Application Fix se prueba primero con el conjunto del modo de compatibilidad, se reduce a la configuración mínima y se limita el destino con las condiciones de coincidencia.

Pruebe el .sdb creado en una máquina de verificación, confirme que funciona como se pretendía y después pase a la distribución.

8.3. Aplicar y quitar con sdbinst, y gestionar las actualizaciones por GUID

La aplicación en cada PC se hace ejecutando sdbinst.exe con privilegios de administrador. Además de instalar, se puede desinstalar especificando el archivo o el GUID de la base de datos.15

:: Instalar (-q es silencioso, sin confirmación)
sdbinst -q "C:\Deploy\MyCorpFixes.sdb"

:: Desinstalar (especificación por archivo)
sdbinst -q -u "C:\Deploy\MyCorpFixes.sdb"

:: Desinstalar (especificación por GUID de la base de datos)
sdbinst -q -u -g {GUID de la base de datos}

En una organización donde crecen las correcciones de compatibilidad, más que un .sdb individual por cada instalador de aplicación, se recomienda un modo de gestión centralizada, reuniéndolas en una base de datos personalizada de la empresa o por departamento. Es más fácil de gestionar actualizar y redistribuir una base de datos reunida que seguir muchas bases de datos de una sola línea.15

Una base de datos personalizada tiene un GUID propio. Si se instala una versión nueva con el mismo GUID, la versión antigua se sustituye de forma automática. La distribución se carga en una vía existente que se pueda ejecutar con privilegios de administrador, como un paquete MSI o un script de inicio.15

Flujo desde la creación del .sdb personalizado hasta la distribuciónCrear la base de datos de compatibilidad personalizada con Compatibility Administrator, probarla en una máquina de verificación, aplicarla en cada PC con sdbinst y, al actualizar, instalar una versión nueva con el mismo GUID para que la antigua se sustituya de forma automáticaCrear con Compatibility AdministratorProbar en la máquina de verificaciónAplicar en cada PC con sdbinstInstalar una versión nueva con el mismo GUIDLa versión antigua se sustituye de forma automáticaSe registra en Programas y características

Figura 16: El .sdb personalizado se despliega en el flujo creación, verificación y distribución con sdbinst, y las actualizaciones se gestionan por GUID.

La base de datos personalizada instalada también se registra en «Programas y características (aplicaciones instaladas)» y sirve para el inventario y para confirmar la eliminación. Deje también en el inventario de activos qué .sdb se ha puesto en qué PC.

9. Decidir después de que funciona — el mantenimiento de la prolongación y el plazo de migración

9.1. Separar la corrección que proporciona el SO de la decisión de aplicación de la propia organización

Aunque funcione con un shim, no se ha corregido el problema de la aplicación en sí. El shim es un remedio provisional ajustado a un uso concreto de la API, y si cambia la implementación del SO las premisas pueden romperse.

El shim que proporciona Microsoft se mantiene, como parte de Windows, con Windows Update.1 En cambio, gestionar qué se ha aplicado con una base de datos personalizada y si esa combinación permite seguir el negocio es de la propia organización. Incluya en el coste de la prolongación la verificación en cada actualización de características.

El shim como remedio provisional y la responsabilidad de mantenimientoEl shim es una mentira ajustada a un uso concreto de la API y si cambia la implementación del SO las premisas se rompen; el shim que proporciona Microsoft se mantiene con Windows Update, pero ocuparse de la mentira aplicada con una base de datos personalizada es de la propia organización, y la verificación en cada actualización de características es el coste de la prolongaciónEl shim es una mentira de remedio provisionalSi cambia la implementación del SO, las premisas se rompenShim que proporciona MicrosoftSe mantiene con Windows UpdateMentira de la base de datos personalizadaQuien se ocupa es la propia organizaciónLa verificación en cada actualización de características es el coste de la prolongación

Figura 17: La responsabilidad de mantener esa mentira que es el shim se divide entre la parte que proporciona Microsoft y la personalizada de la propia organización.

9.2. Decidir por el tiempo de uso restante, la profundidad de la dependencia y el régimen de verificación

Es importante no decidir un uso a largo plazo solo por el hecho de que «funcionó con el modo de compatibilidad». Que funcione con un shim significa que ha cabido en el recipiente que Windows ha preparado. Decida alineando los ejes siguientes.

Eje de decisión Condiciones más hacia la prolongación (shim) Condiciones más hacia la migración o el rehacer
Tiempo de uso restante Previsto abandonar el negocio en 1 o 2 años Premisa de seguir usándola 5 años o más
Código fuente No hay (el proveedor desapareció o se perdió) Hay, o se puede recuperar el activo
Profundidad de la dependencia Solo un problema de compatibilidad de API en modo usuario Depende de un controlador, de 16 bits o de hardware dedicado
Medio alternativo No existe un producto empaquetado ni una versión nueva El producto o la técnica de destino de la migración está claro
Impacto si falla Aunque se detenga, el negocio sigue con un procedimiento alternativo El negocio troncal recibe el golpe de lleno
Régimen de verificación Se puede confirmar el funcionamiento en cada actualización de características No hay recursos de verificación y tiende a quedar en conserva

9.3. Si se prolonga, reunir registro, verificación y plazo en un conjunto

  1. Registrar. Deje qué shim o capa se aplicó a qué EXE y por qué. Incluya también en el inventario el valor de la clave Layers y el GUID del .sdb. La idea de no pasar al siguiente responsable un estado de «nadie sabe por qué funciona» es la misma conservación que se trató en Cuando hereda un sistema sin código fuente ni documentación.
  2. Verificar. En cada actualización de características de Windows, confirme el arranque y las operaciones principales de las aplicaciones en prolongación. Enlácelo también con el plan de cambio de SO que se trata en La salida realista tras el fin de soporte de Windows 10.
  3. Poner un plazo. Fije el final de la prolongación, por ejemplo «hasta el siguiente cambio del sistema troncal» o «hasta marzo de 2028», y haga correr en paralelo el estudio de la migración.
Conjunto de 3 puntos de operación si se decide prolongarRegistrar en un inventario con qué shim funciona, verificar el funcionamiento de las aplicaciones en prolongación con shim en cada actualización de características, fijar el final de la prolongación y hacer correr en paralelo el estudio de la migraciónDecidir prolongarRegistrar: qué shim la hace funcionar, al inventarioVerificar: confirmar el funcionamiento en cada actualización de característicasPlazo: fijar el final de la prolongaciónHacer correr en paralelo el estudio de la migración

Figura 18: La prolongación se opera como un conjunto de registro, verificación y plazo, hasta hacer correr en paralelo el estudio de la migración.

9.4. Usar el shim para ganar el período de estudio y preparación de la migración

Las opciones de migración cambian según la técnica de la aplicación. Si es de VB6, el punto de partida son las tres opciones —reescritura completa, conversión automática y migración por etapas— organizadas en ¿Hasta cuándo seguirán funcionando las aplicaciones VB6?. Si depende de ActiveX/OCX, se puede usar la tabla de decisión «mantener, envolver o reemplazar» de ActiveX / OCX: cómo tratarlos hoy.

Lo sano es situar el shim como un medio para ganar con seguridad el período de estudio y preparación de ese proyecto de migración.

Opciones del lado de la migración y situación del shimEl procedimiento habitual de migración cambia según la técnica de la aplicación; si es de VB6, las tres opciones son reescritura, conversión automática y migración por etapas; si depende de ActiveX, se usa la tabla de decisión mantener, envolver o reemplazar; el shim se sitúa como una ganancia de tiempo que gana con seguridad el período de estudio y preparación del proyecto de migraciónde VB6depende de ActiveXganar tiempo de estudio y preparación¿Cuál es la técnica de la aplicación?Reescritura, conversión automática, migración por etapasMantener, envolver o reemplazarProlongación con shim

Figura 19: El procedimiento habitual de migración lo decide la técnica de la aplicación, y el shim se sitúa como una ganancia de tiempo de ese período de estudio.

10. Resumen

El modo de compatibilidad es un mecanismo que, solo para la aplicación, complementa el comportamiento que asume un Windows antiguo. El shim, que está en el centro, se interpone en la llamada a la API sustituyendo la IAT y complementa la comprobación de versión o el destino de acceso. El propio Windows lo usa a través de la base de datos predeterminada y de PCA.

La respuesta se piensa en este orden: primero aislar si está en el ámbito de aplicación del shim, confirmar la configuración necesaria con la pestaña de compatibilidad o RunAsInvoker y, en un despliegue organizativo, gestionarla con Compatibility Administrator y sdbinst. Los puntos prácticos son la elección de la herramienta de 32/64 bits, la verificación con los privilegios del usuario real y la gestión del destino y de la versión mediante las condiciones de coincidencia y el GUID.

Sin embargo, se limita al modo usuario y no elude un mecanismo de seguridad. Un problema de controlador de kernel, de una aplicación de 16 bits en Windows de 64 bits o de acceso directo al hardware necesita otra medida. RunAsInvoker tampoco aumenta privilegios: solo suprime una solicitud de elevación innecesaria.

Después de que funciona, registrar la configuración, verificarla en cada actualización de características y poner un plazo para hacer correr en paralelo la migración. Hasta ahí llega la decisión de confiar en el modo de compatibilidad.

La próxima vez que una casilla haga funcionar una aplicación antigua, vuelva a preguntar esto. «¿Gracias a qué mentira funciona esta aplicación? ¿Hasta cuándo valdrá esa mentira?». Si se puede responder, la prolongación es una estrategia decente.

Artículos relacionados

Áreas de consultoría relacionadas

KomuraSoft LLC se ocupa de la investigación de funcionamiento y del diseño de prolongación de aplicaciones de negocio antiguas sin código fuente (selección de shims y modo de compatibilidad, creación y despliegue de un .sdb personalizado), de la verificación de compatibilidad de aplicaciones existentes con motivo de la migración a Windows 11, y de la planificación de un rehacer o una migración que corre en paralelo a la prolongación. Puede consultar ya desde la fase «funcionó con el modo de compatibilidad, ¿está bien dejarlo así?».

Referencias

  1. Microsoft Learn, Understanding and Using Compatibility Fixes. Que la corrección de compatibilidad (shim) redirige la llamada a la API reescribiendo la IAT (tabla de direcciones de importación), que el vínculo dinámico se cubre con un hook de GetProcAddress, que el shim está sujeto a las mismas restricciones de seguridad que la aplicación y no puede eludir los mecanismos de seguridad del SO, que se limita al modo usuario y no puede corregir un problema de controlador, que una corrección posible con un shim también es posible corrigiendo el código, los escenarios de uso en aplicaciones cuyo soporte del proveedor ha terminado, y que las correcciones de compatibilidad que proporciona Microsoft se envían como parte de Windows y se actualizan con Windows Update. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9

  2. Microsoft Learn, Compatibility Fixes for Windows 10, Windows 8, Windows 7, and Windows Vista. La lista y la explicación de correcciones de compatibilidad conocidas como CorrectFilePaths, VirtualRegistry, ForceAdminAccess, RunAsAdmin/RunAsHighest/RunAsInvoker, WRPMitigation, EmulateGetDiskFreeSpace, GlobalMemoryStatusLie, LoadLibraryRedirect y la familia VersionLie, el uso diferenciado de las versiones de 32 y 64 bits de Compatibility Administrator, y que al probar en estado elevado la virtualización y la redirección no actúan como se espera, de modo que hay que verificarlo con la cuenta de uso real. ↩ ↩2 ↩3 ↩4 ↩5

  3. Microsoft Learn, Using the RunAsInvoker Fix. Que la corrección de compatibilidad RunAsInvoker arranca la aplicación con el token heredado del proceso padre, que sobrescribe tanto la detección de instalador como el tratamiento del manifiesto, que no intercepta la API y se aplica como marca del cargador, y que si se puede corregir el código la corrección de fondo es declarar asInvoker en el manifiesto. ↩ ↩2 ↩3 ↩4

  4. Microsoft Learn, Running 32-bit Applications. Que WOW64 es la capa de emulación que ejecuta aplicaciones de 32 bits en Windows de 64 bits y aísla los conflictos de archivos y del Registro, y que Windows de 64 bits no admite ejecutar aplicaciones de 16 bits y el arranque falla con ERROR_BAD_EXE_FORMAT por el problema del número de bits válidos del identificador. ↩

  5. Microsoft Learn, Registry Virtualization. Que la virtualización del Registro es una técnica de compatibilidad que redirige de forma transparente las escrituras globales a HKLM\Software al VirtualStore por usuario, que solo son objeto los procesos interactivos de 32 bits y que está deshabilitada en un proceso que especifica requestedExecutionLevel en el manifiesto o en un proceso de 64 bits, y que se sitúa como técnica provisional con intención de quitarla de Windows en el futuro. ↩ ↩2

  6. Microsoft Learn, High DPI Desktop Application Development on Windows. Que una aplicación no compatible con PPP se trata como dibujada fija a 96 PPP y en una pantalla de PPP alto Windows estira el mapa de bits, de modo que se ve borrosa, y las diferencias de los modos de reconocimiento de PPP (Unaware/System/Per-Monitor). ↩ ↩2

  7. Microsoft Learn, Application Compatibility Database. Que la base de compatibilidad gestiona problemas y soluciones en una base de datos de formato .sdb, la coincidencia por atributos del archivo ejecutable, Apphelp (mostrar un mensaje) y Appfix (hook de API mediante shim), y la capa de compatibilidad (modo) que reúne varios shims y marcas. ↩

  8. Microsoft Learn, Program Compatibility Assistant scenarios for Windows 8. Que PCA vigila la ejecución de la aplicación, detecta indicios de un problema de compatibilidad conocido y propone o aplica de forma automática la corrección recomendada (PINDLL, DISABLEUSERCALLBACKEXCEPTION, VIRTUALIZEDELETE, WRPMITIGATION, etc.), y la aplicación de correcciones desde la pestaña de compatibilidad y la herramienta de solución de problemas de compatibilidad. ↩ ↩2

  9. Microsoft Learn, GetVersionExW function. Que a partir de Windows 8.1 el valor que devuelve GetVersionEx depende del manifiesto, que a una aplicación no manifestada para Windows 8.1/10 se le devuelve el valor de versión de Windows 8 (6.2), y que si el modo de compatibilidad está activado informa la versión del SO seleccionado. ↩ ↩2

  10. Microsoft Learn, Targeting your application for Windows. Cómo declarar el GUID del SO admitido con el elemento supportedOS en la sección compatibility del manifiesto de la aplicación, el comportamiento si no hay declaración, y que una aplicación x86 de 32 bits que no incluye trustInfo es objeto de la virtualización de archivos de UAC (redirección de escritura a VirtualStore). ↩

  11. Microsoft Learn, DXGI overview. Que la configuración de compatibilidad de aplicaciones se guarda en la clave del Registro HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers (tomando como ejemplo la configuración de compatibilidad de DXGI). ↩

  12. Microsoft Learn, Download and install the Windows ADK. Que el Windows ADK incluye Compatibility Administrator y Standard User Analyzer, el criterio para elegir la versión del ADK y el método de descarga e instalación. ↩

  13. Microsoft Learn, Compatibility Administrator User’s Guide. Que Compatibility Administrator ofrece la aplicación de correcciones de compatibilidad, modos de compatibilidad y mensajes AppHelp, y la creación de bases de datos personalizadas, y que se instalan la versión de 32 bits y la de 64 bits, debiendo usarse la de 32 bits para una aplicación de 32 bits y la de 64 bits para una de 64 bits. ↩

  14. Microsoft Learn, Creating a Custom Compatibility Fix in Compatibility Administrator. Que la corrección de compatibilidad (antes llamada shim) es un código pequeño que se interpone en la llamada a la API, el procedimiento para crear un Application Fix en una base de datos personalizada (especificar nombre de la aplicación, proveedor y EXE de destino, elegir el modo de compatibilidad, elegir shims adicionales, configurar las condiciones de coincidencia), y que hay que reducir la información de coincidencia dejando una condición que identifique correctamente la aplicación. ↩ ↩2

  15. Microsoft Learn, Compatibility Fix Database Management Strategies and Deployment. Que como estrategia de gestión de la base de datos de compatibilidad personalizada se recomienda una base de datos de gestión centralizada, que en la corrección de compatibilidad hay que incluir una comprobación de versión (condición de coincidencia) para que no se aplique a una versión nueva, la instalación local con Sdbinst.exe (opciones -q, -u, -g), que al instalar una versión nueva con el mismo GUID de la base de datos la versión antigua se desinstala de forma automática, y los métodos de distribución por MSI o script. ↩ ↩2 ↩3 ↩4

Artículos recientes con las mismas etiquetas para profundizar en temas cercanos.

Estas páginas sitúan el tema en un contexto más amplio de servicios y decisiones.

El artículo está directamente relacionado con los siguientes servicios.

Preguntas frecuentes

Preguntas habituales en las consultas sobre el tema del artículo.

¿Está bien seguir usando una aplicación que empezó a funcionar al marcar el modo de compatibilidad?
Para la continuidad del negocio en lo inmediato, no hay problema en seguir usándola. La realidad del modo de compatibilidad es un hook de API en modo usuario llamado shim, un mecanismo previsto oficialmente como configuración del sistema operativo. El shim es, no obstante, un remedio provisional para hacer funcionar la aplicación sin corregirla, y si una actualización del SO cambia las premisas puede volver a dejar de funcionar. Registre en un inventario el hecho de que funciona con el modo de compatibilidad y opérelo junto con la decisión de rehacerla o de prolongar su vida de forma planificada.
¿Qué hace exactamente la casilla del modo de compatibilidad?
Al guardar la configuración en la pestaña de compatibilidad de las propiedades, se escribe en la clave HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers la ruta del EXE de destino y un valor como «WINXPSP3» o «HIGHDPIAWARE». La siguiente vez que se inicia ese EXE, el cargador de Windows lee el valor y aplica al proceso la capa de compatibilidad correspondiente (un conjunto de shims). Por ejemplo, en el modo de compatibilidad con Windows XP entra en juego, entre otras, la falsificación de versión, que devuelve un valor antiguo a la API que consulta la versión del SO. No se cambia el comportamiento del sistema operativo en sí: solo a ese proceso se le muestra «la apariencia de un Windows antiguo».
¿Se puede ejecutar con el modo de compatibilidad de Windows de 64 bits una aplicación antigua de la era de 16 bits?
No. Windows de 64 bits ejecuta aplicaciones de 32 bits mediante WOW64, pero no admite la ejecución de aplicaciones de 16 bits, y al intentar iniciarlas falla con ERROR_BAD_EXE_FORMAT. Es una limitación de arquitectura que el shim no puede eludir. Los paquetes antiguos en los que solo la parte de arranque del instalador es de 16 bits fallan por el mismo motivo. Si hace falta de verdad, hay que considerar medios distintos del modo de compatibilidad, como una máquina virtual con una versión de 32 bits de Windows.
¿Se puede ejecutar con privilegios de usuario estándar una aplicación que «no arranca si no se ejecuta como administrador»?
Vale la pena probar RunAsInvoker. Si en el símbolo del sistema se ejecuta set __COMPAT_LAYER=RunAsInvoker y después se inicia la aplicación, se suprime la solicitud de elevación provocada por requireAdministrator del manifiesto o por la detección de instalador, y arranca con los mismos privilegios (de usuario estándar) que el proceso que la invocó. Si es una aplicación que «solo pide privilegios de administrador sin usarlos realmente», esto basta para quitar la elevación de la operación cotidiana. Los privilegios no aumentan, así que cualquier operación que realmente los necesite fallará dentro de la aplicación. Adóptelo después de confirmar el funcionamiento.
¿Dónde se consigue Compatibility Administrator?
Está incluido en el Windows ADK (Windows Assessment and Deployment Kit). Descargue el ADK desde el sitio de Microsoft y, en la instalación, seleccione las funciones de la familia Application Compatibility Tools. Se instalan la versión de 32 bits y la de 64 bits; hay que usar la de 32 bits para corregir aplicaciones de 32 bits y la de 64 bits para las de 64 bits. La base de datos de compatibilidad personalizada (.sdb) que cree se aplica en cada PC con el comando sdbinst.

Perfil del autor

Página de presentación del autor del artículo.

Go Komura

Representante de KomuraSoft LLC

Especializado en desarrollo de software para Windows, consultoría técnica e investigación de fallos, sobre todo en proyectos con sistemas existentes y errores difíciles de reproducir.

Volver al blog