Mitigando problemas en compatibilidad de aplicaciones con ACT: El Shim de CorrectFilePaths

Como ya lo he mencionado en buena cantidad de artículos anteriores, una de las principales causas por la que una compañía detiene la migración a un nuevo sistema operativo es la compatibilidad de aplicaciones. Generalmente, las empresas tienen una dependencia fuerte por una cantidad pequeña de soluciones que fueron desarrolladas a medida y realizan procesos demasiado importantes como para prescindir de ellas.

Microsoft dispone, desde los tiempos de Windows Vista, de una cantidad de herramientas gratuitas para ayudar a mitigar la gran cantidad de problemas de compatibilidad existentes. Lamentablemente, en LATAM son poco conocidas estas herramientas, así que muchas veces las organizaciones optan por permanecer en una versión x de Windows.

Una de las mejores herramientas, es el Application Compatibility Toolkit (ACT); solución que entre muchas cosas más, nos permite crear Shims o arreglos que interceptan el llamado que hace la aplicación a Windows por algún recurso, y modifica el comportamiento para entregar lo que el software estaba buscando. En otros artículos he documentado el proceso para crear estos arreglos con problemas específicos como Canal+ Yomvi u Oracle 10g, pero hoy empezaré a concentrarme específicamente en la manipulación de los arreglos más comunes a utilizar.

Dicho esto, en este post hablaré lo que más pueda sobre el arreglo de CorrectFilePaths.

Escenario

Supongamos que tenemos una aplicación que intentará escribir unos archivos y te notifica:

image

Sin embargo, después de aceptar proceder, sucede un típico error inesperado y confuso:

image

Por supuesto, esta es solo una aplicación que escribí, así que solo muestra un mensaje y su error, pero en aplicaciones de línea de negocio, suele ocurrir algo similar en diferentes facetas, como durante la instalación, su ejecución o en algún módulo. Aún así, en esencia es el mismo problema: No poder crear o abrir archivos en determinado directorio de Windows.

Volviendo a este caso ficticio, mi aplicación está intentado crear el archivo DemoFile.txt pero recibe un error poco descriptivo, y que no sirve para nada. Es trabajo de la persona empezar a lidiar con este problema.

El shim de CorrectFilePaths

Este arreglo, que hace parte de los cientos disponibles en ACT, permite básicamente modificar una ruta existente de archivos y re direccionarla a otra ubicación sin tener que manipular el código de la aplicación de ninguna forma. Así pues, se mantiene la integridad sobre la aplicación, pero se manipula el comportamiento de los archivos que se escriben.

Predeterminadamente, el arreglo contiene varias correcciones predeterminadas; es decir, diferentes rutas que son direccionadas a otra ubicación una vez se aplica, pero además permite agregar nuevas rutas personalizadas así que es bastante flexible.

Consideremos la siguiente ilustración como el comportamiento predeterminado que debería existir entre la aplicación y Windows en este caso:

clip_image001[9]

*Nota: Aquí no estoy detallando dónde escribe la aplicación, porque aunque es importante, el comportamiento general es el mismo.

Ahora, en la siguiente gráfica muestro cuál es el cambio cuando intercede el arreglo (shim):

clip_image001[11]

Como ven, la aplicación pasa a tener un contacto indirecto y no directo con el sistema operativo cuando realiza esta operación. Aquí no se toca código ni nada por el estilo, solo se direcciona a las mismas funciones en un lugar diferente.

*Nota: Si quieren saber un poco más a fondo sobre los Shims, pueden ver este post.

¿Cómo utilizar CorrectFilePaths?

Para poder aplicar esta, o cualquier otra corrección, es necesario instalar el Application Compatibility Toolkit (ACT), que hace parte del ADK disponible desde el sitio Microsoft:
http://www.microsoft.com/en-US/download/details.aspx?id=39982

Una vez descargado, basta con ejecutar el adksetup.exe y en el asistente seleccionar ACT:

image

De nuevo en el escenario, lo primero que hay que identificar, es dónde está intentando escribir la aplicación que provoca el error. Para esto, no hay otra herramienta mejor que Process Monitor de Sysinternals.

Identificar este tipo de rutas es relativamente sencillo, basta con abrir ProcMon antes de la ejecución de la aplicación, reproducir el problema, presionar las teclas CTRL + F para abrir el cuadro de búsqueda y referenciar el archivo en cuestión; en este caso: DemoFile.txt.

image

El resultado para esta clase de problemas, sobre todo con aplicaciones hechas a la medida y con cierta antigüedad, es Acceso Denegado (ACCESS DENIED):

image

La razón de este tipo de resultados, es por los niveles de integridad que existen desde Windows Vista. No entraré en detalle, porque ese tema requiere un artículo completo.

El problema aquí es que el archivo DemoFile.txt está intentando escribir en un directorio protegido por Windows y que un usuario estándar no tiene privilegios, así que esto requeriría elevación, es decir, ser administrador. Como no queremos eso, procedemos a implementar la corrección de CorrectFilePaths para que la aplicación crea que sigue escribiendo en la raíz del disco, pero realmente escriba en un directorio por usuario.

Implementando el shim

Desde el equipo donde está instalado ACT, buscamos en la Pantalla de Inicio el Compatibility Administrator de acuerdo a la arquitectura de la aplicación y lo ejecutamos:

image

*Nota: Esta consola requiere ejecutarse como administrador, así que pedirá elevación.

Así luce la consola de administración del ACT:

image

Hacemos clic en el botón Fix de la barra de comandos, o bien clic derecho sobre la base de datos predeterminada, Create New > Application Fix:

image

En la página de Program Information, rellenamos los datos correspondientes a la aplicación y clic en Next:

image

En la página de Compatibility Modes, dejamos sin seleccionar nada –no sirven- y clic en Next:

image

En la página de Compatibility Fixes, buscamos CorrectFilePaths, lo seleccionamos y hacemos clic en Parameters para personalizarlo a nuestra medida:

image

En la ventana de Options for CorrectFilePaths es donde sale la magia; aquí personalizamos para cada nuevo shim sus respectivas opciones en línea de comandos.

Para el arreglo de CorrectFilePaths, debemos seguir el patrón descrito en las primeras imágenes:

<RutaOriginal>;<NuevaRuta>

Donde <RutaOriginal> es la ubicación en la que la aplicación intenta escribir de forma predeterminada, y <NuevaRuta> es la nueva ubicación por usuario donde queremos que siga escribiendo después de aplicar el arreglo.

Si tenemos en cuenta mi aplicación de ejemplo, trata de escribir en C: según mostró Process Monitor; si yo quiero que escriba en Documentos, el comando quedaría así:

%SYSTEMDRIVE%;%USERPROFILE%Documents

image

Es muy recomendable utilizar variables de entorno como mostré en el comando anterior, aunque no estrictamente necesario porque también podría haberse referido así:

C:;C:UsersChechoDocuments

Sin embargo, esto quedaría asociado al usuario “Checho” y a letras de unidades específicas. Grave error.

*Nota: El punto y coma (;) es de vital importancia, y debe ir todo pegado.

Como dato adicional, podríamos cambiar incluso el nombre del archivo a escribir; solo es cuestión de referenciar el nombre original y el nuevo nombre, así:

image

Primero se especifica DemoFile.txt (original) y luego el nuevo nombre, para mi caso: File.txt.

Al hacer clic en OK, la página de Compatibility Fixes debería verse así:

image

Ya referenciado el arreglo, clic en Next.

*Nota: Con el botón Test Run… podemos probar si el arreglo va a funcionar antes de ser aplicado.

En la página de Matching Information, podemos dejar las opciones predeterminadas y clic en Finish para terminar:

image

De vuelta en la consola principal, hacemos clic en el botón Save y le asignamos un nombre a la base de datos creada:

image

Después, indicamos la ruta donde se guardará la base de datos:

image

*Nota: Lo ideal es que se guarde en una ruta compartida si es que se planea implementar masivamente después.

Para terminar, clic derecho en la base de datos y seleccionamos Install:

image

Aceptamos el cuadro de confirmación sobre la instalación:

image

Comprobando resultados

Si todo sale bien, la corrección debería hacer que la aplicación funcione, por supuesto, si este era el único error:

image

Si volvemos a monitorear con Process Monitor, la aplicación nunca se dará cuenta de lo sucedido:

image

Una aplicación puede tener múltiples arreglos para mitigar diferentes problemas; este es uno de los más comunes y como ven, funciona muy bien.

Por supuesto, no es necesario tener el ACT instalado en todas las máquinas donde se quiera implementar, basta con lanzar un script local o remoto que llame al proceso sdbinst.exe con el parámetro –q y el directorio del arreglo para que se instale.

Por ejemplo, si este arreglo lo fuese a instalar en un equipo, y lo tuviese en el directorio C:, ejecutaría:

sdbinst.exe –q C:FileExampleShim.sdb

image

Claro está, lo ideal, como dije antes, es que el Shim esté en una ruta de red si se quiere hacer una distribución masiva y centralizada.

Conforme mi conocimiento lo permita, documentaré otros arreglos y temas más complejos de ACT aquí en el blog. Empecé por uno de los que consideré puede ser más útil.

Como nota final, el ACT está disponible desde versiones anteriores.

Espero sea de utilidad.

Saludos.

Checho

Crear y capturar imagen maestra de Windows 8.1 con System Center Configuration Manager 2012 R2

En el pasado mes de julio, escribí por primera vez un artículo donde referencié a System Center Configuration Manager, explicando cómo realizar una implementación básica de Windows 8.1 y prometí escribir un poco más de lo que iría aprendiendo con esta formidable solución.

Aunque lo ideal es unir SCCM con MDT y mostrarles escenarios, quiero tocar primero algunos básicos utilizando Configuration Manager; es por esto que en este artículo explicaré cómo podemos instalar y generar nuestra propia imagen maestra de Windows 8.1, haciendo uso de una secuencia de tareas que está incluida de forma predeterminada.

Requerimientos

1. Naturalmente, tener un escenario implementado de System Center Configuration Manager 2012 R2. Personalmente, me apoyé en este artículo.

2. Copiar los archivos de instalación de Windows 8.1 en una ruta compartida. Para este artículo, los copié en una carpeta compartida llamada 81 en mi servidor de Config Manager.

3. Crear una ruta compartida donde se guarden todas las aplicaciones a desplegar.

4. Crear una carpeta compartida por cada aplicación que se vaya a instalar, copiando los archivos de instalación allí.

*Nota: En el primer post que referencié, indiqué cómo se podía desplegar un .MSI; esta vez lo haré con un .EXE. Utilizaré WinRAR como referencia.

Agregando aplicación

En la consola de administración de System Center Configuration Manager (SCCM), pasamos al nodo inferior de Software Library, expandimos la carpeta de Applications Management en la parte superior, clic derecho en Applications y seleccionamos Create Application:

image

En la página de General, seleccionamos Manually specify the application information y clic en el botón Next:

image

En la página de General Information, solo digitamos el nombre de la aplicación y clic en Next:

image

En la página de Application Catalog, clic en Next:

image

En la página de Deployment Types, clic en el botón Add:

image

Se volverá a abrir un asistente y página similar a la primera; seleccionamos Manually specify the deployment type information y clic en Next:

image

En la página de General Information, indicamos nuevamente nombre y clic en Next:

image

En la página de Content, es necesario indicar la ruta compartida donde está el archivo de instalación en el cuadro de texto seguido de Content Location, y en el cuadro de Install program, especificamos el nombre del ejecutable, seguido de la bandera que permita una instalación automatizada (Por ejemplo: WinRAR /S en mi caso):

image

En la página de Detection Method, es necesario decirle a Configuration Manager cómo darse cuenta si la aplicación ya está instalada en un dispositivo; para esto, hacemos clic en el botón Add Clause…

image

En la ventana de Detection Rule, indicamos como Type que sea File (archivo), la ruta completa donde normalmente quedaría la aplicación instalada en Path y el nombre del ejecutable en File or folder name:

image

*Nota: Marcamos “This file or folder is associated with a 32-bit application on 64-bit system”, solo si estamos referenciando una aplicación de 32 bits, que se vayan a instalar en equipos de 64 bits.

Clic en OK para volver a la página de Detection Method y clic en Next.

En la página de User Experience, escogemos Install for system para que se aprovisione a todos los usuarios y Whether or not a user is logged on. Clic en Next:

image

De aquí en adelante, hacemos clic en Next hasta y terminar y Close. Debemos estar de vuelta en la página de Deployment Types, pero esta vez con la aplicación listada:

image

Clic en Next hasta terminar y Close.

Clic derecho en la aplicación y seleccionamos Distribute Content:

image

En la página de General, dejamos la configuración predeterminada y clic en Next:

image

En la página de Content, clic en Next:

image

En la página de Content Destination, clic en el botón Add, luego Distribution Point, seleccionamos el punto de distribución y clic en OK:

image

Clic en el botón OK.

En la página de Summary, clic en Next.

En la página de Completion, clic en Close.

Agregando sistema operativo

En la consola de SCCM, expandimos la carpeta de Operating System Images, clic derecho en la raíz o en la carpeta que tengamos creada y seleccionamos Add Operating System Image:

image

En la página de Data Source, indicams la ruta compartida donde copiamos nuestros archivos de instalación de Windows 8.1, específicamente el archivo install.wim y clic en Next:

image

*Nota: Lo importante de referenciar aquí es el .wim.

En la página de General, indicamos un nombre y opcionalmente versión y descripción; luego hacemos clic en Next:

image

En la página de Summary, clic en Next. En la página de Completion, clic en Close.

Sobre nuestro sistema operativo agregado, hacemos clic derecho y seleccionamos Distribute Content:

image

En la página de General, clic en Next.

En la página de Content Destination, hacemos clic en el botón Add y luego Distribution Point:

image

Seleccionamos nuestro punto de distribución y clic en OK:

image

De nuevo en la página de Content Destination, clic en Next.

En la página de Summary, clic en Next.

En la página de Completion, clic en Close.

Creando y desplegando Secuencia de Tareas

Pasamos al nodo de Task Sequences, hacemos clic derecho sobre la raíz o carpeta que tengamos creada y seleccionamos Create Task Sequence:

image

En la página de Create New Task Sequence, seleccionamos la segunda opción: Build and capture a reference operating system imagen y clic en Next.

image

En la página de Task Sequence Information, especificamos el nombre para la Secuencia de Tareas, luego hacemos clic en el botón Browse al lado de Boot Image para indicar una imagen de arranque y clic en Next:

image

En la página de Install Windows, clic en el botón Browse al lado de Image Package, indicamos la imagen de instalación que agregamos anteriormente y clic en Next:

image

En la página de Configure Network, indicamos los datos del dominio al que lo deseamos agregar y clic en Next:

D1

*Nota: Utilizando MDT, no sería necesario unirlo al dominio porque se va a realizar una captura, pero en SCCM es necesario, pues de lo contrario no se podrá comunicar con el punto de distribución y habrá un error en la secuencia de tareas mientras instala las aplicaciones.

En la página de Install Configuration Manager client, hacemos clic en Next:

image

En la página de Include Updates, indicamos la opción según nuestra preferencia y clic en Next:

image

En la página de Install Applications, clic en el icono del sol, escogemos nuestra aplicación del repositorio y clic en Next:

image

En la página de System Preparation, clic en Next:

image

En la página de Image Properties, escribimos los datos correspondientes al que está creando la Secuencia de Tareas y clic en Next:

image

En la página de Capture Image, debemos especificar primero la ruta compartida donde queremos guardar la imagen .WIM, incluyendo el nombre y extensión de la misma; así como la cuenta que tiene permisos para escribir en el repositorio:

image

*Nota: Hay que tener cuidado aquí, pues de estos datos depende que la imagen quede capturada. En mi caso, le puse REF1.wim, pero pueden llamarla como quieran, desde que mantengan la extensión.

En la página de Summary, clic en Next.

En la página de Completion, clic en Close.

Luego de esto, clic derecho sobre la Secuencia de Tareas creada y seleccionamos Deploy:

image

En la página de General, indicamos All unknown computers como Collection y clic en Next:

image

En la página de Deployment Settings, debajo de Make available to the following, nos asegurarmos que sea Configuration Manager client, media and PXE y clic en Next:

image

Clic en Next para el resto de las páginas hasta llegar a Completion y clic en Close.

Instalando y capturando

Nuestro último paso, es finalmente arrancar una máquina virtual o física para que inicie por red y podamos iniciar el asistente de instalación.

image

En la primera ventana, hacemos clic en Next:

image

*Nota: Aquí nos pedirá contraseña o no, de acuerdo a como lo hayamos configurado al momento de instalar SCCM.

En la página de Select a Task Sequence to run, escogemos la que recién creamos y Next:

image

Si todo sale bien, el proceso de instalación iniciará:

image

image

image

image

image

*Nota: Es normal que hayan un par de reinicios durante este proceso.

Al final de todo el proceso, la máquina cliente se reiniciará y arrancará en el OOBE, pero en nuestro recurso compartido quedará la imagen maestra lista para importar nuevamente:

image

¡Eso es todo! Relativamente sencillo, aunque MDT es quien realmente agrega valor a estos procedimientos dentro de SCCM, así que pronto lo veremos.

Espero sea de utilidad.

PD: No olviden seguirme en Twitter: www.twitter.com/secalderonr

Saludos.

Checho