Ejecutar scripts de PowerShell desde un paquete de Advanced Installer

Aunque este fue creado principalmente para hablar de temas alrededor de Windows, me gusta compartir cosas que comparto y que me gustan con tecnologías o productos que utilizo. En esta ocasión, quiero hablar nuevamente de Advanced Installer, pues suelo utilizarlo bastante y cada vez me parece más indispensable tenerlo (junto con Snagit).

Muchas veces en los proyectos en los que estoy necesitamos realizar alguna tarea que implica hacer configuraciones, no siempre complejas, pero que sí requieren varios pasos, así que trato siempre de de automatizar todo creando un paquete de instalación con Advanced Installer, pues me permite agregar archivos, claves/valores de registro, configuración de permisos, entre muchas otras.

En este caso en particular, necesitaba instalar unos módulos de PowerShell  después de instalar algunos componentes de Microsoft, y aunque ejecutando el script de por sí es sencillo, no quería complicar a la persona que despliega con pasos manuales que requiere la ejecución de scripts, así que opté por utilizar Advanced Installer para facilitar un poco la tarea.

Cabe aclarar que en este artículo no explicaré cómo crear y configurar paquetes de Advanced Installer, solo me enfocaré en las acciones personalizadas.  

Custom Actions en Advanced Installer

Las Acciones personalizadas (Custom Actions) nos permiten ejecutar tareas o acciones que se lanzan en varias partes del proceso de instalación, casi siempre en la mitad o al final. Estas acciones son manejadas por el proceso de instalación, así que todo se mantiene en una sola ventana y la mayoría de veces permite automatización completa para que no haya demasiada interacción por parte del usuario, todo depende de qué se quiera hacer dentro de la lista disponible.

image

Hay una lista bastante grande debajo del cuadro de Add Custom Action. Cada acción tiene una leve descripción en la parte inferior del cuadro y todas están un poco más documentadas en la página oficial de Advanced Installer. Para agregar alguna basta con hacer clic en los botones de la derecha; la primera opción es la más sencilla pues se agrega al proceso natural de instalación:

image

Existen dos tareas que son particulamente útiles para el caso de este artículo:

Run PowerShell inline script: esta es una acción personalizada que me permite agregar un script completo de PowerShell dentro del ambiente de Advanced Installer, probarlo antes de compilar y agregarlo al proceso normal de instalación.

image

Run PowerShell script file: a diferencia del anterior, esta tarea me permite agregar el archivo de PowerShell completo para ser ejecutado. Puede ser desde una ubicación en disco o adjunto al paquete de instalación.

image

Ambas opciones permiten probar el script antes de compilar y guardar, así que es cuestión de qué tan completo sea el script.

En la experiencia personal, me ha funcionado mejor utilizar la primera opción y ejecutar todo el script desde el editor integrado. Para mi caso, quise instalar unos módulos de PowerShell para administración de diferentes componentes de Office 365.

Consideraciones a la hora de ejecutar scripts de PowerShell con Advanced Installer

A continuación les listaré, basados en lo que tuve que pasar, todo lo que es necesario tener en cuenta a la hora de ejecutar un script de PowerShell:

  1. Indispensable: cada línea debe de poderse ejecutar sin ninguna interacción del usuario, pues predeterminadamente la respuesta de Advanced Installer es rechazar la petición. Es muy común ver esto en algunos algunos cmdlets como Install-Module, así que siempre es necesario agregar el parámetro de –Force al final, por ejemplo:

    Install-Module -Name AzureAD –Force

  2. Es muy importante probar toda la ejecución del script aparte, pues muchas veces algún módulo, como el de AzureAD, requiere instalar previamente un Nuget y esto debemos garantizaro igualmente de forma automatizada

  3. En caso de ir a ejecutar el paquete en un equipo de 64 bits, debemos marcar la opción de 64 bit script en la parte superior derecha, pues de lo contrario el script no funcionará

SNAGHTML2315f52a

Lo que sigue de aquí es solamente compilar el paquete, desplegarlo y listo. Advanced Installer se encarga de configurar la ejecución de scripts remota (Set-ExecutionPolicy) para no tener ese tipo de problemas.

En caso de tener problemas, la mejor opción es habilitar los logs detallados del Advanced Installer y analizar la respuesta de PowerShell: https://www.advancedinstaller.com/user-guide/faq-ca.html#question98

Espero sea de utilidad.

Saludos,

—Checho

Empaquetar una aplicación de 16 bits a 32 bits con Advanced Installer

Si alguno de ustedes trabaja con implementación masiva de sistemas operativos Windows o ha estado en algún proyecto de migración, seguramente se habrán topado con un escenario inevitable de compatibilidad de aplicaciones, pues suelen ser aplicaciones necesarias para el negocio pero demasiado viejas. Como además las migraciones se hacen a Windows en arquitectura de 64 bits por el aprovechamiento de recursos, se van a encontrar con aplicaciones que funcionan bien en 32 bits, pero que al momento de ejecutarlas en un sistema de 64 bits reciben este tipo de mensajes:

image

Como probablemente sepan, Windows en arquitectura de 32 bits puede ejecutar aplicaciones de 16 bits, pero un sistema a 64 bits solo puede llegar a ejecutar aplicaciones de 32 bits, por lo que las que estén en 16 bits no serán compatibles. Ahora, una aplicación puede tener sus binarios después de la instalación nativamente en 16 bits o bien pueden estar en 32 bits y solamente el paquete de instalación en 16 bits; en el primer caso la única solución es compilar toda la aplicación desde el código en una nueva arquitectura, aunque eso casi nunca se puede hacer por falta de tener el código original. Si es el segundo caso, el camino, como lo voy a mostrar aquí, es construir un nuevo paquete de instalación que esté en 32 bits y pueda ser ejecutado en un sistema de 64 bits con la ayuda de Advanced Installer.

Hay un proceso de mucho más nivel para hacer esto descrito por Aaron Margosis de Microsoft en este artículo, mas no lo seguiré aquí

Requerimientos

1. Tener instalado Advanced Installer en un equipo técnico

Nota: Advanced Installer es un producto licenciado, aunque tiene período de prueba.

2. Tener instalado VMWare Workstation. Se puede hacer con Hyper-V, pero la experiencia no es tan transparente, lamentablemente

3. Instalar una máquina virtual de Windows 10 a 32 bits desde Advanced Installer. Pueden ver el detalle en su página oficial

4. Crear un snapshot de la instalación de Windows de 32 bits en limpio. Si no saben hacerlo en VMWare, pueden ver el procedimiento oficial en su página

Nota: les recomiendo que antes de tomar el snapshot descarguen todas las actualizaciones, deshabiliten internet, notificaciones, antivirus, actualización de aplicaciones, notificaciones y cualquier otra interrupción en el proceso de empaquetamiento

3. Guardar el instalador de la aplicación de 16 bits en el equipo técnico

<

p align=”justify”>4. Descargar Sigcheck de Sysinternals en el equipo técnico

1.0. Instalación manual de la aplicación en equipo de 32 bits

¡Empecemos! Lo primero que tenemos que hacer es instalar la aplicación de 16 bits en el equipo virtual que creamos en el tercer requerimiento para asegurarnos de que el binario que se ejecuta en Windows es, efectivamente, de 32 bits. Como aquí la aplicación será diferente en cada escenario, no mostraré procedimiento de instalación.

1.1. Comprobación de arquitectura con Sigcheck

Una vez instalada, debemos ejecutar Sigcheck e indicarle como único parámetro la ruta completa del ejecutable. Sigcheck nos dirá el MachineType, que corresponde a la arquitectura en la que corre la aplicación:

image

En mi caso, el resultado es 32-bit, así que no es el binario el que está en 16 bits, sino el instalador, tal como lo puedo comprobar corriendo Sigheck con el nombre del instalador:

image

Noten que el MachineType es 16-bit.

Opcionalmente, pueden utilizar la función GetBinaryType de la API de Windows para obtener la misma información, por ejemplo:

SNAGHTML626df8a

Con esto confirmado, ya sabemos que simplemente debemos construir un nuevo instalador que soporte la arquitectura de 32 bits mínimamente para que funcione en ambos, 32 y 64 bits.

2.0. Empaquetamiento de la aplicación utilizando el Repackager de Advanced Installer

2.1. Sobre el Repackaging

El proceso de empaquetamiento es uno de los más interesantes de Advanced Installer: consiste básicamente en monitorear el proceso completo de instalación de una aplicación en conjunto con las configuraciones posteriores para luego empaquetar todos los cambios que hizo en el sistema operativo y, con base en eso, construir un nuevo instalador que hace las mismas operaciones.

Esta característica no está pensada necesariamente para tema de compatibilidad de aplicaciones, sino más bien para mejorar el proceso de instalación de alguna aplicación; sin embargo, sirve muy bien para el propósito de pasar de instaladores de 16 bits a 32 bits sin tener que obtener acceso al código fuente, así que me parece perfecto.

Pueden obtener más información sobre el proceso técnico del Repackager en la web oficial de Advanced Installer.

2.2. Empaquetando

Para empaquetar nuestra aplicación, realizamos los siguientes pasos:

Para poder realizar estos pasos es necesario haber cumplido los requerimientos 3 y 4

Prendemos la máquina virtual que instalamos en el requerimiento 3:

image

Ejecutamos Advanced Installer con privilegios administrativos, vamos a NewConvert y luego doble clic en Repackage Installation:

image

En la ventana de Welcome to the Repackager Wizard, clic en Next

image

En la página de Repackaging Scenario, seleccionamos la segunda opción, Repackage an application in an existing virtual machine, nos aseguramos de que la máquina virtual sea la que creamos en el requerimiento 3 y hacemos clic en Next

image

En la página de Package Information, ubicamos el instalador de nuestra aplicación en el campo de Setup Path como obligatorio y, opcionalmente, modificamos los demás campos como el nombre, versión y empresa para luego dar clic en Next

image

En la página de Customize Settings, dejamos la selección predeterminada y clic en Next para iniciar el empaquetamiento.

image

En la ventana de alerta que nos informa que estamos a punto de empezar, le damos a OK.

image

Veremos que el asistente empieza a informar de varios pasos mientras en la máquina virtual se ejecuta el asistente de instalación de la aplicación con una consola en segundo plano:

SNAGHTML652bebe

Aquí lo único que debemos de hacer es instalar manualmente la aplicación y, si es necesario, ejecutarla para que todos los componentes que debe instalar y registrarse se apliquen correctamente. A parte de eso, si requerimos hacer cambios en Windows o en la aplicación, podemos hacerlos también, pues Advanced Installer capturará casi todo.

Cuando terminemos todo, volvemos al símbolo del sistema, nos aseguramos de que la consola esté capturando nuestro teclado (poniéndola en primer plano) y presionamos INTRO para que termine:

image

Al terminar, la máquina virtual se pausará y volveremos al asistente del Repackager. Ahí hacemos clic en Next para continuar.

image

En la pagína de You have successfully completed the Repackager Wizard, hacemos clic en Finish para abrir el proyecto en Advanced Installer.

image

En la ventana de Advanced Installer de Filter Repackager result, podemos modificar todos los recursos que el asistente capturó para luego darle Import.

image

En la ventana de Repackager, dejamos la primera opción y hacemos clic en Next para poder entrar al proyecto y hacer modificaciones adicionales, si es que lo necesitamos.

image

Nota: pueden darle a Build Package si ya están seguros, pero a mi personalmente me gusta siempre revisar y agregar cosas dentro del proyecto.

image

No entraré en detalles sobre todo lo que se puede hacer dentro de la herramienta porque no es el objetivo del artículo y se haría demasiado extenso (¡más de lo que está!), pero es importante saber que aquí se pueden modificar permisos NTFS, crear accesos directos, modificar archivos y registro, agregar scripts, aplicaciones adicionales a ejecutar antes, durante o después, entre otras.

Al terminar de hacer cualquier modificación, hacemos clic en el botón de Build en el panel superior de herramientas:

image

En el cuadro que nos aparece de Guardar como, escogemos el directorio en donde deseamos que se cree nuestro instalador y clic en Save.

image

En la ventana de Build Project podremos ver el log de la compilación y el acceso directo al .MSI que predeterminadamente se crea:

image

3.0. Prueba de instalación

¡Todo listo! Lo único que nos queda es pasar el instalador a un equipo de 64 bits y proceder a probar la instalación completa de la aplicación:

image

Habrá veces en que diferentes archivos no quedaron en el paquete de instalación, así que habrá que agregarlos (si se saben cuáles son) o bien hacer el proceso nuevamente teniendo cuidado con ejecutar todo lo que se necesite. Afortunadamente, Advanced Installe hace muy bien el trabajo, así que pocas veces tendremos que realizar cambios.

Espero que sea de ayuda.

Saludos,

—Checho