Hola a todos,
Realmente me da alegría volver a escribir por aquí después de algunos días, especialmente cuando tengo algo que me haya ayudado a mi aprendizaje y que quiero compartir.
En este caso, como en muchas ocasiones, se trata de un problema reportado con una aplicación llamada DLTCAD 2010 desde los estupendos Foros de Microsoft Answers en Español, me tomé el trabajo entonces de descargar un trial de la aplicación en cuestión y probar yo mismo, afortunádamente, también me dio un error y pude solucionarlo.
A continuación, como siempre divido en: El problema, La causa y su Solución.
El problema
Cuando se instala la aplicación en Windows 7, después de tratar de ejecutarla por primera vez, estaba recibiendo un Crash de la aplicación, es decir, que dejaba de responder sin ni siquiera haber iniciado:
“dlt2010D.exe dejó de funcionar”
Al intentar cerrar la aplicación, inmediátamente recibía un mensaje de error bastante extraño:
Estaba ocurriendo una Excepción y, según el mensaje, no se podía encontrar el archivo Config.tmp en la ruta de instalación: “C:Program Files (x86)DLTCAD2010 DEMO”
Al aceptar el mensaje (OK), la aplicación no terminaba de iniciar. Sin importar cuántas veces la tratar de ejecutar, siempre era el mismo procedimiento, crash y posterior mensaje de error para finalmente cerrar el proceso y no abrir nada.
La causa
Lo primero que intenté hacer fue buscar el archivo Config.tmp pero por supuesto, no apareció por ningún lado, a juzgar por su extensión y nombre además, parecer ser algún tipo de archivo temporal que se ejecuta antes de iniciar la aplicación y que tal vez, pueda contener la configuración o los parámetros iniciales necesarios para que la aplicación arranque correctamente.
*Nota: Claro está, sólo estoy suponiendo porque la verdadera respuesta, la tiene sólo el fabricante implicado en el desarrollo.
En la compatibilidad de aplicaciones con Windows 7, suele ser práctico como primera instancia, intentar con dos alternativas, pestaña de compatibilidad que hará una “Mentira sobre la versión” haciéndole creer a la aplicación que está en una versión anterior de Windows o bien Ejecutarla como administrador elevando los permisos por el cambio en materia de seguridad que sufrió Windows desde XP a Windows 7 ya que todos los usuarios en Vista y 7 trabajan predeterminádamente como usuarios estándar.
Sin embargo, aplicando el modo de compatibilidad con Windows XP Service Pack 3 o inferior, de una vez el ejecutable pasa a pedir elevación de privilegios para que se cambie el token de acceso y sí se esté ejecutando realmente como un administrador (Tal cual se hacía en Windows XP).
Esto fue lo que hice con el ejecutable, fui a las propiedades (clic derecho, propiedades), pestaña de Compatibilidad y seleccioné Ejecutar este programa en modo de compatibilidad para Windows XP (Service Pack 3):
A continuación, ejecuté el programa, elevé los privilegios y de sorpresa, la aplicación estaba corriendo perfectamente:
Aquí había una gran incógnita, realmente la aplicación sí era compatible con Windows 7, pero pudo haberla hecho funcionar o la mentira sobre versión o la elevación de privilegios.
En un escenario emergente, ésta solución podría bastar, pero no en todas las empresas están dispuestas a dejar que se eleven permisos aunque sea para un proceso porque entonces tendrían que garantizar una cuenta que lo haga, además de que si la aplicación originalmente no pide elevación de privilegios es porque parece estar hecha con el fin de funcionar bajo un token estándar.
Cambié nuevamente el modo de compatibilidad a como estaba presentando el problema, y llamé a la mejor herramienta que me podía ayudar en ese momento, me refiero a Process Monitor de Sysinternals.
El proceso es el mismo de siempre, ejecutarlo, limpiar el primer log que genera, ponerlo a correr nuevamente y ejeacutar la aplicación hasta recibir el mensaje de error.
El siguiente paso es buscar qué puede darnos Process Monitor, de nuevo, como siempre, la recomendación es hacerlo de abajo hacia arriba y utilizando primero palabras que estén relacionadas con el problema, para este caso por supuesto, la primera sería: Config.tmp
Para activar el filtro de búsqueda, basta con ir al menú Edit y seleccionar Find, ejecutarlo desde la barra de comandos de Procmon o bien presionar CTRL + F
Para mi fortuna, bastó con los primeros y únicos resultados para encontrar tal vez la clave del problema:
Si vamos más a fondo, Windows está utilizando la función CreateFile para tratar de crear el archivo Config.tmp en la ruta: C:Program Files (x86)DLTCAD2010 DEMO, pero como resultado está obteniendo un ACCESS DENIED; esto significa que la ruta existe, que se intenta hacer la operación pero que no se consiguen los permisos necesarios sobre la ubicación en este caso para escribir y que el archivo quede.
Lo interesante está en que en Windows XP, la aplicación funciona perfectamente, y si hago lo mismo con Process Monitor, veré que el trabajo con el archivo Config.tmp se comporta diferente:
Como ven, es exactamente la misma operación, pero esta vez con un resultado de SUCCESS, lo que difiere de que tuvo los permisos necesarios para escribir.
Esto es apenas lógico y es donde está la raíz del problema, los permisos NTFS cambian completamente junto con todo el esquema de seguridad como había comentado antes, la aplicación en Windows XP, tiene todos los privilegios para escribir sobre cualquier ruta porque la cuenta predeterminada es de Administrador. En Windows 7 por otro lado, aunque la cuenta esté dentro del grupo de administradores en modo de aprobación, desde que esté el Control de Cuentas de Usuario (UAC) activo, todo lo que se corra se hará bajo el mismo token que el Explorer.exe (Proceso padre), es decir, como si se estuviera corriendo sobre un usuario limitado.
Al yo elevar los permisos en la ejecución dentro de Windows 7, le está diciendo al proceso que cambie de token de usuario estándar a usuario administrador, por lo que los permisos pasarán hacer idénticos a como si se estuviera ejecutando en Windows XP, por eso sigue sin problemas.
La solución
Como el problema estaba en los permisos, es decir, acceso denegado para escribir en la carpeta DLTCAD2010 DEMO, tenía que revisar cómo estaban establecidos de forma predeterminada para el usuario actual, para esto, basta con ir al directorio implicado, hacer clic derecho, Propiedades, ir a la pestaña de Seguridad y hacer clic en el botón Editar:
En la edición de Seguridad sobre los permisos NTFS en Vista y en 7, se puede ver cada usuario implicado en los directorios o unidades que hayamos seleccionado, así como cada permiso que tienen sobre los objetos.
En este caso, me situé sobre mi usuario WinGuy del grupo Users (Usuarios) y esto fue lo que me mostró Windows:
Como ven, el permiso de Escritura (Write) no estaba seleccionado para Permitir (Allow), lo que quiere decir que mis usuarios estándar, no pueden crear nada en este directorio (DLTCAD2010 DEMO).
Hay una diferencia notable con respecto a los Administradores de la máquina:
Todos los permisos están habilitados, incluyendo los de escribir, ¡Aquí la clave de todo!
Esto resolvía el por qué elevando los privilegios que pasa de estar entre los Usuarios a los Administradores, la aplicación estaba funcionando bien.
Para finalizar entonces, sólo tuve que asignar el permiso de escritura sobre mi usuario y aplicar todos los cambios con sólo seleccionar el grupo de Users (Usuarios) y después habilitar Write (Escritura):
Por último y para confirmar la teoría, ejecuté la aplicación sin elevar los privilegios (Haciendo doble clic sobre el acceso directo) y .. ¡Aplicación funcionando!
Como hemos visto, no todos los problemas son culpa de Windows =)
Espero pueda ser de utilidad, sea por como en mi caso, aprender algo nuevo o bien porque tengan un problema similar con esta aplicación como es el caso que se planteó en los Foros y de donde surgió todo esto.
Saludos,
Checho