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

Crear directiva de cumplimiento para Windows 10 en Intune

Como indiqué en un artículo anterior, el procedimiento natural después de unir uno o múltiples dispositivos a Microsoft Intune es empezar a gestionarlos, es decir, aplicarle directivas de configuración o de seguridad, se a través de las que están preestablecidas o utilizando las que hacen parte del OMA-URI.

Ahora bien, por motivos de seguridad siempre es conveniente tener una base de cumplimiento para saber que cada dispositivo unido cumple con estándares definidos por la organización. Microsoft Intune nos permite crear algunas directivas de cumplimiento tanto para dispositivos móviles como para estaciones Windows de una forma muy sencilla, así que utilizaré el resto del artículo para describir el proceso, aunque solo me enfocaré en Windows 10 por ahora.

Requisitos

1. Es necesario contar con licencia de Intune y de Azure Active Directory Premium. Ambas están incluídas en los planes de Enterprise Mobility + Security (EMS)

2. Utilizar una plataforma soportada:

  • Android
  • iOS
  • macOS
  • Windows 8.1
  • Windows 10

3. El dispositivo tiene que estar inscrito en Microsoft Intune

4. Para Conditional Access: no están soportados los equipos unidos con la inscripción múltiple de dispositivos, tiene que ser individual

Crear directiva de cumplimiento

1. Iniciamos sesión en el portal de Azure con la cuenta administrativa: https://portal.azure.com

2. En la barra de búsqueda de arriba, digitamos Intune y seleccionamos Intune:

image

3. En la página de Microsoft Intune, seleccionamos Device Compliance en el panel izquierdo:

image

4. En la página de Device Compliance, hacemos clic en Policies y luego en Create Policy

image

5. En la página de Create Policy, indicamos un nombre, descripción y como plataforma escogemos Windows 10 and later:

image

6. Hacemos clic en Settings, luego en Device Health, activamos como Require la opción de Require BitLocker y hacemos clic en OK en la parte inferior:

image

7. En la página de Windows 10 complicance policy, hacemos clic en System Settings para expandir otras configuraciones, activamos Firewall y Antivirus y luego clic en OK:

image

En este artículo solo referencié algunas directivas, pero cada organización debe acomodarse a sus necesidades.

8. En la página de Windows 10 compliance policy, hacemos clic en OK

9. En la página de Create policy, hacemos clic en el botón de Create en la parte inferior:

image

10. En la página de la directiva creada, en mi caso Windows Compliance, hacemos clic en el botón izquierdo de Assignments, luego en el botón central de Select groups to include y agregamos el grupo al que pertenezcan los usuarios que están iniciando sesión en los dispositivos a evaluar. Después de esto, hacemos clic en el botón de Save para guardar:

image

Intune hará la evaluación cada 8 horas aproximadamente después de los primeros 30 minutos de haberlo unido al MDM. Mientras eso pasa, es probable que vean los dispositivos en la categoría de Not Evaluated:

image

Lamentablemente, el cuadro anterior es de los que más se demora para actualizarse, así que yo diría que es poco confiable, a menos que se le de el tiempo adecuado.

Si queremos ver el detalle de lo que cumple, no cumple o no aplica, basta con ir a la consola de Intune y hacemos clic en Setting compliance, debajo de la categoría de Monitor. En  el panel central veremos un desglozado de lo que aplicamos como cumplimiento y sus resultados:

image

Aunque personalmente las directivas de cumplimiento en Intune creo que les falta mucho, se pueden utilizar para hacer cosas mucho más interesantes si se unen con el Acceso condicional, pero eso será probablemente para otras entradas del blog.

Espero les sea de utilidad.

—Checho

Inscribir múltiples dispositivos Windows 10 a Microsoft Intune con un paquete de aprovisionamiento

Con la fuerte apuesta de Microsoft a la seguridad y la nube, Microsoft Intune, su plataforma de administración de dispositivos, ha tomado mucha más fuerza, al punto de entrar en el grupo que lidera el cuadrante de Gartner en temas de Unified Endpoint Management, así que se vuelve bastante conveniente empezar a profundizar en todo lo que la plataforma brinda.

Como cualquier otra plataforma de administración, es necesario registrar o inscribir el dispositivo (PC, tablet o móvil) de alguna forma, Intune no es la excepción. Hablando específicamente de Windows, se puede hacer desde el OOBE (manual o a través de Autopilot) o ya en Windows; sin embargo, con el fin de optimizar el proceso para escenarios de muchos dispositivos, es posible configurar un paquete de aprovisionamiento que sirva para unir múltiples dispositivos utilizando un solo token; es decir, sin necesidad de depender de cada cuenta de usuario.

A continuación, les mostraré, paso a paso, cómo podemos crear y desplegar el paquete de aprovisionamiento.

Requerimientos

  1. Todos los equipos deben estar en Windows 10, versión 1703 o superior
  2. Asignar licencia de Intune a la cuenta que se le asociará el token (ver más adelante)
  3. Habilitar la inscripción automática de dispositivos (ver más adelante)
  4. Instalar en un equipo técnico el ADK para Windows 10, versión 1809

Asignar licencia de Intune

Una vez creado el tenant de Intune o EMS (dependiendo del licenciamiento), navegamos hasta el portal de administración de Office 365 e iniciamos sesión con una cuenta administradora: https://portal.office.com/AdminPortal

Una vez en el portal, expandimos el nodo izquierdo de Users y luego clic en Active users

image

Hacemos clic sobre el usuario que deseamos asignarle la licencia de Intune:

image

En la página de usuario que se abre a la derecha, hacemos clic en el botón Edit que está en la parte derecha de Product licenses:

image

En la página de Product licenses, cambiamos de Off a On Intune o Enterprise Mobility + Security:

image

Por último, clic en el botón inferior de Save:

image

Clic en el botón de Close dos veces y cerramos la página de administración de Office 365.

Este mismo procedimiento lo debemos realizar para cada nuevo usuario cuyo dispositivo se vaya a conectar a Microsoft Intune.

Habilitar inscripción automática

1. Iniciamos sesión en el portal de Azure con la cuenta administrativa: https://portal.azure.com

2. Ubicamos y hacemos clic sobre Azure Active Directory en el panel izquierdo:

image

3. En la página de Azure Active Directory, seleccionamos Mobility (MDM and MAM)

image

4. Seleccionamos en el panel central Microsoft Intune

image

5. En la página de Configure, nos aseguramos de seleccionar All en MDM User scope para que todos los dispositivos de usuarios se puedan inscribir a Microsoft Intune:

image

Adicionalmente, pueden habilitar también MAM User scope para administrar los dispositivos móviles, aunque eso hace parte de otros posibles artículos.

En un escenario ideal, seleccionaríamos Some y ahí pondríamos un primer grupo de usuarios de pruebas antes de poder habilitar a toda la organización.

Con esto estamos listos para que los dispositivos con Windows 10 puedan ser administrados por Microsoft Intune.

Crear el paquete de aprovisionamiento

1. En el equipo técnico donde instalamos el ADK para Windows 10, versión 1809, ejecutamos el Windows Imaging and Configuration Designer como administradores

2. En la ventana de Windows Imaging and Configuration Designer, seleccionamos el nodo de Provision desktop devices:

image

3. En la ventana de New project, asignamos un nombre, una descripción (opcional) y hacemos clic en el botón de Finish:

image

4. En la categoría de Set up device, es obligatorio asignar un nombre de equipo. El paquete soporta un par de formatos: %SERIAL% y %RAND%. El primero pone el serial que toma del hardware de la máquina, el segundo asigna un número aleatorio según la cantidad que le demos. Para este caso, yo le pondré: INSIDO-%RAND:4%

image

Es muy importante no ir a asignar un nombre sin estas variables porque entonces todos tratarían de unirse como si fueran el mismo dispositivo y no funcionará.

5.  Hacemos clic en Account Management, seleccionamos Enroll in Azure AD y luego hacemos clic en el botón de Get Bulk Token:

image

6. Seguimos el asistente para iniciar sesión con la cuenta administrativa y obtener el token:

image

6. Si el equipo técnico no está unido a Azure AD, nos aparecerá otra página en donde debemos indicarle en la parte inferior This app only para terminar:

image

Si todo sale bien, nos debe decir «Bulk Token Fetched Successfully»:

image

7. Hacemos clic en el botón Finish y luego en Create para que el paquete compile:

image

8. Si todo sale bien, tendremos un enlace en la parte inferior para nuestro paquete similar a este:

image

Desplegar el paquete de aprovisionamiento

Aunque hay diferentes formas de implementar el paquete de aprovisionamiento, incluso de forma desatendida con PowerShell, lo haré de la forma más simple: copiar el paquete localmente a cada máquina.

1. Una vez copiado en cada equipo, hacemos doble clic sobre el paquete

2. Si nos sale la ventana del UAC, hacemos clic en el botón (Yes)

image

3. En la ventana del paquete de aprovisionamiento, confirmamos que se trate del que creamos y hacemos clic en el botón Sí, agregarlo:

image

Si todo sale bien, el equipo debería reiniciarse solo al momento de aplicarlo (1 min.):

image

4. Al reiniciar el equipo, estará conectado a Azure Active Directory e inscrito a Microsoft Intune. Cada nuevo usuario ya podrá iniciar normalmente con su cuenta profesional:

image

Como dije antes, es necesario que el usuario no tenga restricciones para iniciar sesión con su cuenta de Azure AD y que además tenga su respectiva licencia de Microsoft Intune asignada para poder recibir directivas desde la nube.

Visualizar los equipos inscritos en la consola de Intune

Para estar seguros de que todo salió bien, podemos visualizar los dispositivos inscritos directamente en la consola de Intune:

  1. Navegamos hasta https://portal.azure.com e iniciamos sesión con una cuenta de administrador

  2. En la barra de búsqueda superior, digitamos Intune y hacemos clic en Intune para abrir la consola:

image

  1. En la consola de Intune, hacemos clic en Devices en el panel izquierdo:

image

  1. En la página de Devices, hacemos clic en All devices, debajo de la categoría de Manage

image

  1. Aquí podremos ver todos los dispositivos inscritos correctamente a Intune:

image

Como pueden ver, tengo dos dispositivos con el formato de nombre que puse en el Configuration Designer al momento de crear el paquete.

De aquí en adelante ya podemos empezar a gestionar los dispositivos:  directivas, líneas base, etc. Espero compartir algo de esto en futuros artículos.

Cabe aclarar que con este método de inscripción no funciona el Acceso condicional (Conditional Access) sobre los dispositivos.

Espero sea de utilidad.

—Checho

La pantalla blanca al iniciar PES 2019, Process Explorer, Procdump, Windbg y su solución

Desde los tiempos de Winning Eleven, he sido fiel seguidor de Pro Evolution Soccer (PES), primero en la consola de Play Station y luego en el PC hasta el son de hoy. Aunque ya no lo hago todos los días, con regularidad entro en las noches para jugar un rato después de trabajo. Para mi fortuna, casi nunca tengo problemas con la plataforma de Steam, sin importar que estoy instalando todas las compilaciones que salen del programa de Windows Insider; sin embargo, ayer iba a jugar en la noche y me di cuenta de que el juego no estaba entrando, solo aparecía la pantalla blanca y se cerraba:

image

Después de revisar actualizaciones de Windows y hacer un reinicio del equipo, probé yendo a las propiedades del juego en Steam, pestaña de Local Files y utilicé la opción de Verify itegrity of ame files:

SNAGHTML12e95ca

En principio parece que iba a funcionar porque hace reparaciones si encuentra algo raro, pero la pantalla blanca solo se prolongó por unos segundos más antes de cerrarse inesperadamente otra vez. Como no estaba dispuesto a ponerme a descargar otra vez un juego tan pesado sin saber si solucionaría el inconveniente, decidí ponerme a diagnosticar para intentar encontrar la forma de volver a jugar.

Lo primero que hice fue verificar si el juego se estaba cerrando completamente, para eso abrí Process Explorer, fui al menú de Options, luego Difference Highlighting Duration y lo establecí a lo máximo, es decir, 9 segundos, para poder alcanzar a ver cuáles procesos se cerraban mientras cambiaba entre aplicaciones.

Efectivamente, me encontré con que el juego se estaba cerrando abruptamente después de que desaparecía la ventana en blanco:

image

El otro detalle importante es que también se estaba activando el reporte de errores de Windows, WerFault.exe, que me indicaba que estaba sucediendo un crash de la aplicación:

image

¿Qué estaba impidiendo la ejecución del juego? Pues bien, existen muchos motivos por los que una aplicación puede hacer crash al ejecutarse, incluso diferentes soluciones; una de las formas más productivas para encontrar la causa es obtener un volcado de memoria del proceso en el momento del fallo y proceder a analizarlo con un depurador como Windbg. No es una tarea muy sencilla por lo técnico que puede volverse, pero generalmente solo se necesitan algunos conocimientos básicos para dar con la pista del problema.

Procdump, al rescate

Procdump es una herramienta que hace parte de la suite de Sysinternals y que permite generar volcado de memoria según los parámetros que le indiquemos al proceso que debe de monitorear: excepciones, hangs, etc. Para no complicarme tanto organizando los parámetros, en parte porque no soy muy bueno con la herramienta, opté por utilizar el parámetro –i para instalar el controlador de Procdump indicando la ruta donde quería los volcados para que él mismo me escribiera uno cada que hubiese una excepción en Windows. El comando completo es:

procdump.exe –i C:\Dumps

image

La ruta final puede ser cualquiera, yo traté de mantenerlo simple.

Tan pronto intenté jugar nuevamente, la pantalla se puso blanca, la aplicación se cerró y Procdump hizo lo suyo: crear el volcado de memoria que necesitaba.

image

Windbg

Con el volcado de memoria ya creado, procedí a ejecutar Windbg, abrir el .DMP que había generado el Procdump y finalmente corrí el comando de !analyze –v para que hiciera un análisis automático:

image

Normalmente el análisis que hace Windbg se acerca mucho al controlador o módulo que ocasiona la falla, aunque puede llegar a reportar varios que no están dentro de los símbolos:

image

Lo malo de esto es que muchas veces salen falsos positivos porque indica controladores o componentes propios del sistema operativo como desconocidos.

La forma más fácil de identificar el posible causante es mostrar la pila de ejecución que había al momento del crash y empezar desde la función que le indica a Windows que debe detenerse hacia abajo hasta encontrar controladores o módulos de terceros para analizar con más detalles. En mi caso, encontré dos: NvCamera64 y nvwgf2umx.

image

Windbg permite utilizar el comando lmvm para obtener detalles de cada controlador o módulo. Al ejecutarlo con cada uno, me di cuenta de que pertenecían a NVIDIA:

image

Aunque el primero no tenía la descripción, el segundo, nvwgf2umx, indicaba que era del controlador de D3D10.

Imagino yo que no funcionaba alguna actualización de PES 2019 o la última compilación de Windows, así que mi camino fue ir al GeForce Experience y buscar a ver si existía un nuevo controlador; efectivamente, no hace mucho habían liberado otra versión:

image

Después de hacer una instalación limpia desde el asistente y reiniciar Windows, ejecuté nuevamente el juego y, para mi tranquilidad, todo había vuelto a la normalidad:

image

Una vez más, todo salvado gracias a estas maravillosas herramientas y un poco de investigación.

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

DelVol: cambia fácilmente letra de unidades en Windows

Lo pensé mucho para publicar este artículo, pues no me parece que la herramienta que voy a describir llegue a ser de utilidad para mucha gente; sin embargo, decidí hacerlo por algunas razones: primero, haré mención de su uso en un artículo que escribiré para Implementa Windows. Segundo, es una buena oportunidad para documentar su funcionamiento, y tercero, quizá a otras personas les pueda solucionar el mismo problema que yo tuve.

El problema

Parte de mi rol en el trabajo es realizar ingeniería de imágenes en las empresas, tratando siempre de automatizar todo lo que más pueda en el proceso de instalación de Windows. Como es de esperarse, todas las empresas son muy diferentes, así que siempre me encuentro con nuevos requerimientos, unos más sencillos que otros.

En este caso, necesitaba una forma de automatizar el proceso para quitarle la letra de unidad a una partición; más específicamente, necesitaba liberar la letra D y cambiarla por cualquier otra letra en tiempo de implementación desde MDT.

Las opciones

La primera opción, como suele ser normal, es ver una forma soportada para hacer el cambio de unidad con alguna herramienta integrada de Windows, así que opté por Diskpart. Lo único que debemos saber es el número de volumen que tiene asignada la partición con la letra a cambiar y la nueva letra que vamos a asignarle.

En mi caso, para cambiar de la D a la Z, suponiendo que el volumen es el 0, tendría que utilizar los siguientes comandos:

> Diskpart
> List Volume
> Select Volume 0
> Assign Letter=Z

image

Lo malo con Diskpart es que siempre debía saber el número de volumen y la nueva letra de unidad; si me equivocaba en alguno de los dos o la letra de unidad estaba tomada, no tenía como manejarlo.

La segunda opción era, por supuesto, PowerShell. Soy un entusiasta, pero aún muy malo para construir scripts profesionales, así que traté de encontrar la mejor opción para hacer el cambio de forma automatizada. El script que manejé durante algunas pruebas era así:

$drive = Get-WmiObject -Class win32_volume -Filter “DriveLetter = ‘D:'”

Set-WmiInstance
-input $drive -Arguments @{DriveLetter=”Q:”}

A diferencia de Diskpart, PowerShell utilizaba el módulo de WMI para consultar el volumen que estaba montado con la letra D y luego le asignaba la letra Q.

Aunque me liberé del primer problema, saber el volumen, aún estaba condicionado por la disponibilidad de la letra que le iba a asignar; no obstante, es probable que haya podido encontrar la forma de buscar con PowerShell qué unidades estaban tomadas, pero eso le habría dado más duración al script, además de subir la probabilidad de error. Por otro lado, la ejecución de scripts de PowerShell desde MDT me parece algo lenta y propensa a fallar, pues hay dependencias de que se habilite correctamente la ejecución y de versiones de PowerShell para soportar los módulos.

Podía dejar cualquiera de las dos, pero, como última opción, opté por tratar de entender un poco más cómo funciona la asignación de particiones con la API de Windows y construir mi propia herramienta: DelVol.

Un poco de teoría

Normalmente nosotros reconocemos los volúmenes que tenemos activos en el equipo por su etiqueta (Datos, Windows, Backup, OSDisk, etc.) o por la letra que les fueron asignados, sea por Windows o por nosotros (D:\, E:\, J:\, etc.); pero Windows no puede utilizar la misma estrategia porque, por ejemplo, un volumen puede tener asignado una letra y una etiqueta, solo la letra, solo la etiqueta o ninguna de las dos. Otro ejemplo claro es que la letra puede variar cada que se desconecta y reconecta, puesto que Windows asigna por disponibilidad.

El sistema operativo, entonces, reconoce cada volumen con algo llamado Volume GUID Path, que está compuesto por un prefijo, «\\?\», la palabra «Volume» y un identificador único asignado por Windows. Por ejemplo, el volume GUID path  de la unidad Z:\ en mi equipo quedaría así:

\\?\Volume{45c09333-0000-0000-0000-100000000000}\

Si están interesados en saber el volume GUID path de sus particiones, Windows tiene una herramienta integrada llamada MountVol:

image

Windows Sysinternals también ofrece una herramienta un poco mejor llamada DiskExt que muestra, además del GUID, otros detalles relevantes como la unidad y disco al que pertenece:

image

Yo también hice un pequeño ejecutable que utiliza las funciones GetVolumeInformation y GetVolumeNameForVolumeMountPoint para obtener el volume GUID path, letra de unidad, tipo de sistema de archivos y serial asignado por Windows. El uso es muy sencillo, si yo quiero saber el detalle para la letra Z, solo debo indicársela como argumento agregando los dos puntos y el backslash, así:

VolInfo.exe Z:\

image

Pueden descargar los archivos fuente desde el repositorio de GitHub. El ejecutable está en la carpeta de Exefile: https://github.com/SergioCalderonR/VolInfo 

La solución: DelVol

DelVol es una sencilla herramienta de línea de comandos que me permite especificar la letra de unidad a la que le quiero cambiar la letra y ella se encargará de buscar internamente cuál es la siguiente letra disponible para asignársela, liberando la anterior para nuevo uso. La herramienta utiliza varias funciones de la API de Windows, de esta forma elimino la necesidad de versiones de framework y proporciono compatibilidad desde Windows 7 en adelante.

Gracias a que la herramienta se encarga de buscar la siguiente letra disponible, también elimino la preocupación de que la letra esté ocupada, tal cual me sucedía con Diskpart y PowerShell.

¿Cómo funciona?

Solo es necesario indicarle como argumento la letra de unidad y la herramienta hará el resto. Por ejemplo, si deseo liberar la letra Z, el comando sería:

DelVol.exe Z:\

image

Es necesario indicar la letra de unidad con los dos puntos y el backslash, de lo contrario la herramienta devolverá un error, esto es porque las funciones requieren este formato para funcionar, aunque espero hacer esto más fácil en el futuro.

En caso de equivocación o de lanzar solo el ejecutable sin argumentos, la aplicación mostrará una pequeña ayuda con ejemplo:

image

Como pueden ver, la ventaja de interactuar directamente con la API de Windows es el rendimiento al ejecutar, además de tener un poco más de control sobre lo que estoy haciendo.

¿Dónde descargar?

La solución está disponible también en mi repositorio de Github, por si alguien está interesado en conocer el código y, por qué no, aportar:

https://github.com/SergioCalderonR/DelVol 

Si solo desean el ejecutable, pueden obtenerlo al descargar la solución, en la carpeta Exefile.

SNAGHTML87a094[5]

image

Espero sea de utilidad.

Saludos,

<

p align=”justify”>—Checho

Monitorear la creación de archivos en Windows utilizando Sysmon

Hace unos días recibí, por fin, mi copia del libro Troubleshooting with the Windows Sysinternals tools de Mark Russinovich y Aaron Margosis, copia que estaba esperando desde principios de año, pero que había tenido retrasos de publicación. Mi pensado es pasar por todas las herramientas lo más detallado posible; sin embargo, después del capítulo introductorio, me concentré en la aplicación más nueva de todas, System Monitor (Sysmon), pues quiero aprovechar este espacio para describir un escenario en el que puede ser de mucha ayuda y aprender por ahí derecho.

Sysmon es una herramienta escrita por Mark Russinovich y Thomas Garnier, basada en los mismos mecanismos que Process Monitor, pero enfocada completamente a rastrear actividad maliciosa en los equipos de la red. Sysmon, a diferencia de casi todas las herramientas de Sysinternals, debe ser instalada para empezar a monitorear, solo se concentra en una serie de eventos y puede utilizarse un archivo XML de configuración para realizar filtros específicos sobre estos eventos. Por otra parte, toda la actividad que Sysmon rastrea queda escrita en el Visor de eventos de Windows para un posterior análisis.

Aunque podría escribir un artículo de uso general de la herramienta, quiero enfocar esta entrada explícitamente a uno de los eventos: creación de archivos. Describiré cómo podemos instalar y configurar Sysmon para que podamos ver en el Visor de eventos todos los archivos que se crean, además de datos importantes como el proceso implicado en la creación, hora exacta, etc.

 

Instalación y configuración de Sysmon

Lo primero que debemos hacer es descargar, instalar y configurar Sysmon en el sistema operativo. A continuación, pasaré a describir cómo realizar todos estos procedimientos.

  1. Descargamos el paquete de Sysmon desde la web de Sysinternals: https://technet.microsoft.com/en-us/sysinternals/sysmon
  2. Creamos una carpeta llamada Sysmon en la unidad de Windows y guardamos el instalador, descomprimido, ahí:

    image

  3. Ejecutamos el símbolo del sistema con privilegios elevados y navegamos hasta la carpeta C:\Sysmon
  4. Creamos y configuramos el archivo de configuración de Sysmon:

Creación del archivo de configuración

El archivo de configuración consiste en un XML que contiene un elemento root, Sysmon,  y varios elementos hijos, con sus respectivos filtros para estos eventos que Sysmon leerá y aplicará. Es necesario indicarle explícitamente qué excluirá y qué incluirá porque si no, Sysmon empezará a escribir en el visor de evento todos los eventos.

Antes de construir el XML, debemos consultar la versión del schema ejecutando el siguiente comando:

sysmon –? config

Veremos, entre bastante información, un formato XML en la consola con la versión del schema.

image

Para el momento de escribir este artículo, la versión es 3.20, pero podría variar cuando lo ejecuten, así que más vale verificar antes de crear el archivo de configuración.

El secreto del archivo de configuración consiste en saber indicarle los filtros para todo lo que deseamos. Para este caso, es necesario deshabilitar todos los eventos adicionales y solo dejar el de FileCreate, correspondiente a la creación de archivos. Así quedaría el archivo:


<Sysmon schemaversion=”3.20″>
<!–Captures only FileCreate events–>
    <EventFiltering>
    <!–Let’s disable all events but FileCreate–>
        <FileCreate onmatch=”exclude”/>
        <ProcessCreate onmatch=”include”/>
        <FileCreateTime onmatch=”include”/>
        <NetworkConnect onmatch=”include”/>
        <ProcessTerminate onmatch=”include”/>
        <DriverLoad onmatch=”include”/>
        <ImageLoad onmatch=”include”/>
        <CreateRemoteThread onmatch=”include”/>
        <RawAccessRead onmatch=”include”/>
        <ProcessAccess onmatch=”include”/>
        <RegistryEvent onmatch=”include”/>               
        <FileCreateStreamHash onmatch=”include”/>   
    </EventFiltering>
</Sysmon>


Noten que el único evento que tiene el atributo onmatch como exclude es el de FileCreate; esto indica que Sysmon va a monitorear toda la actividad que tengan los eventos de creación de archivos. Todos los demás eventos, al estar con el atributo de include y sin ninguna regla de condición, quedarán deshabilitados.

Nota:

Aquí hay que tener cuidado, pues como veremos más adelante, al empezar a jugar con las reglas de condición los atributos varían.

Debemos guardar este archivo con cualquier nombre y extensión .XML. Preferiblemente, almacenarlo en la misma ruta que el ejecutable de Sysmon para que sea fácil referenciarlo. En mi caso le puse el nombre de Config.xml.

image

 

Para proceder, finalmente, con la instalación, ejecutamos desde el símbolo del sistema:

Sysmon.exe –accepteula -i C:\Sysmon\Config.xml

Debemos tener un resultado similar al siguiente:

image

Para verificar cuáles reglas quedaron aplicadas para los filtros, ejecutamos Sysmon –c

image

Revisión del los logs creados por Sysmon

De aquí en adelante basta con abrir el Visor de eventos y navegar hasta Applications and Services logs\Microsoft\Windows\Sysmon\Operational para poder ver todos los eventos que se están generando con respecto a la creación de archivos en nuestro sistema:

image

El evento 11 corresponderá siempre a la creación de archivos, aunque en la categoría lo describe también. Cada fila de información (Information) nos entregará los detalles precisos sobre el evento:

image

Cada evento tiene unos nombres de etiquetas que entregan diferente información. Por ejemplo, en la creación de archivo podemos ver el proceso que lo hizo con la etiqueta de Image; el archivo creado con la etiqueta de TargetFilename y la hora exacta con la etiqueta de CreationUtcTime.

Como está la configuración, vamos a ver todos los eventos de creación de archivos, independiente de que en unos confiemos y en otros no. Esta información es perfecta para auditoría o análisis forense, pero llegará un punto en el que deseemos concentrarnos en uno o más archivos específicamente y ahí Sysmon también nos puede ayudar.

Ahora, supongamos que entre todos los eventos encontramos uno que parece ser malicioso:

image 

Opciones avanzadas

Para poder concentrarnos específicamente en la creación del archivo MalwareFile.txt creado en la unidad de Windows, podemos indicarle fácilmente a Sysmon que solo monitoree las ocurrencias de ese nombre, sin importar en dónde lo escriba.

Nosotros podemos crear unas reglas de condiciones incluyentes o excluyentes con los elementos hijos, es decir, los nombres de etiqueta que aparecen en el evento, para poder suplir diferentes necesidades. Cuando el atributo del elemento es include, todo lo que esté dentro de la etiqueta FileCreate es lo que se escribirá en el Visor de eventos, dependiendo de la condición con la etiqueta.

En el siguiente ejemplo, estoy utilizando la etiqueta TargetFilename para decirle que me muestre siempre los resultados que contengan el nombre de MalwareFile.txt; para conseguir este filtro, utilizo la condición “contains” dentro del nombre de etiqueta, así:

image

De esta forma, no importa en qué unidad se cree el archivo, voy a poder verlo en el Visor de eventos.

La modificación en la configuración de Sysmon no requiere reinicio y se aplica inmeditamente; basta con ejecutar desde el símbolo del sistema con privilegios elevados:

Sysmon –c C:\Sysmon\Config

image

Si utilizamos nuevamente Sysmon –c, veremos que el filtro está aplicado:

image

 

Ahora supongamos que deseamos tener registro de todos los archivos creados que contengan la palabra «Malware» y se copien en la partición del sistema operativo. La regla de condición, teniendo en cuenta las etiquetas de Image y de TargetFilename quedarían expresadas en el XML así:

<FileCreate onmatch=”include”>
            <TargetFilename condition=”image”>C:\</TargetFilename>
            <TargetFilename condition=”contains”>Malware</TargetFilename>
</FileCreate>

Aquí estoy utilizando la etiqueta TargetFilename, que contiene el nombre completo, incluyendo la ruta, para establecer dos reglas de condición:

1. La imagen debe ser el la unidad del sistema operativo, C
2. El archivo debe contener el nombre de «Malware» para que lo escriba en el Visor de eventos

Siempre se debe correr el comando de Sysmon –c con el XML de configuración para que los filtros queden aplicados; es decir:

Sysmon –c C:\Sysmon\Config.xml

De esta forma podríamos ver toda ocurrencia de la palabra «Malware» en los archivos creados en la unidad de Windows:

image

Como pueden ver en el ejemplo, el archivo contiene la palabra clave en la mitad.

Entre mejor implementemos los filtros en Sysmon, más fructífero será nuestro análisis. Es una herramienta sorprendente.

Limitaciones

Si el código de la aplicación tiene como disposición CREATE_ALWAYS, es decir, que el archivo se escriba si no estaba o se sobreescriba si ya estaba, Sysmon solo registrará en el Visor de eventos la primera vez que se escribió, no cuando se haya sobreescrito. Dicho esto, una aplicación podría sobreescribir datos maliciosos sobre un archivo ya creado y no quedaría nada en el Visor de eventos.

Pude contactar a Mark Russinovich sobre esto y él me dijo que estaban considerando agregar la sobreescritura también para una futura actualización.

Espero escribir más adelante sobre el monitoreo de operaciones en registro también.

Saludos,

—Checho

Cambiar el fondo de pantalla establecido por directivas de grupo en Windows 10

En mi empresa, como en todas las organizaciones, hay una directiva de grupo que establece un fondo de pantalla corporativo en todas las estaciones Windows. Si bien es algo normal y los encargados de TI suelen cambiarlo con cierta frecuencia, se vuelve muy aburridor estar viendo el mismo fondo de pantalla todos los días; por este motivo, decidí explorar un poco cómo reconoce Windows la directiva para cambiarlo por uno que sea de mi gusto y compartirlo por aquí.

Nota: es necesario contar con privilegios administrativos para poder realizar los procedimientos que voy a describir aquí.

Explorando la directiva del fondo de pantalla

Para poder seguir lo que pasa al activar una directiva de grupo, es necesario forzar la configuración con la herramienta de gpupdate, con el parámetro de /force, y seguirla con Process Monitor mientras hace el procedimiento.

image

Ya que Process Monitor genera bastante bulla con el log, debemos configurar filtro para que nos muestre lo que esté haciendo el proceso de svchost.exe, encargado de replicar las directivas de grupo, que las operaciones sean de escritura en el registro y que no muestre nada de sistema de archivos, procesos o redes.

image

Después de esto, abrí el cuadro de búsqueda (CTRL + F) y procedí a buscar todas las ocurrencias que tuviese la palabra «Wallpaper».

image

El primer resultado, aunque no es exactamente el que buscaba, encontré algunos detalles interesantes:

image

El Path hacía referencia a la subclave de registro que almacena la información correspondiente a las GPO aplicadas tanto en máquina como en usuario. En este caso, al SID correspondiente a mi usuario, S-1-5-21-3916089143-2390449709-3607105231-11656.

Noten que, según me indicaba Process Monitor, Windows estaba escribiendo un valor (RegSetValue) con el nombre de DisplayName y su contenido era GPO Wallpaper, nombre de la GPO que se encargaba de configurar el fondo de pantalla corporativo en mi equipo.

Haciendo clic derecho desde Process Monitor e indicando Jumpt To…, encontré todos los detalles referentes a la directiva de grupo en el registro: nombre, ubicación física, ruta completa de la OU, identificador único de la GPO, entre otras.

image

Toda esta información estaba alojada en la subclave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\DataStore\SID, mas no era la única GPO, pues en la raíz de DataStore están alojados las GPO tanto para usuario como para máquina. Las que corresponden a la máquina están en la subclave de Machine, y las de usuario, en su respectiva subclave que tiene como nombre el SID.
 

image

Esta información puede llegar a ser muy útil si estamos haciendo diagnóstico de problemas con directivas de grupo que no estén aplicando en los clientes; sin embargo, no me decía desde dónde estaba llamando al fondo de pantalla ni la ubicación de este. Lo que hice fue seguir buscando en Process Monitor con la misma palabra, Wallpaper, y esto fue lo que encontré:

SNAGHTML22c85cd8

Windows creó un valor de registro llamado Wallpaper en la ruta HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\; cabe agregar que normalmente las directivas de grupo, correspondientes a usuario, se agregan en la subclave de Policies.

Abrí el Registro de Windows para explorar de una forma más visual y hallé lo que estaba buscando, la ruta exacta de la directiva de fondo de pantalla.

image

El primer valor, Wallpaper, hace referencia a la ruta física, normalmente de red, en donde está ubicada la imagen a establecer como fondo de pantalla; el segundo valor, WallpaperStyle, le dice a Windows cómo debe posicionar la imagen en el escritorio: centrado, ajustado, etc.

Una vez obtenida la información, el siguiente paso, naturalmente, era proceder a hacer la personalización.

Cambiar el fondo de pantalla por uno personalizado

Para realizar el cambio de fondo corporativo a uno personal, realizamos los siguientes pasos:

1. Asegurarnos de estar en la subclave de registro: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

2. Doble clic sobre el valor Wallpaper para abrir la ventana de edición

3. Le indicamos una ruta completa, local o de red, en donde esté alojado nuestro fondo de pantalla, en el cuadro de texto:

image

4. Clic en el botón de Aceptar (OK)

5. Reiniciamos el sistema o reiniciamos el proceso de Explorer.exe para que el fondo se aplique y lo veamos en nuestra pantalla

¿Se puede impedir el cambio efectuado por la directiva?

En teoría sí, pero después de intentarlo muchas veces, me encontré con la sorpresa que no. Básicamente, para evitar el cambio habría que quitarle todo tipo de privilegios de escritura al usuario SYSTEM sobre la subclave de System o incluso de Policies; sin embargo, todos los administradores, incluyendo SYSTEM, por supuesto, tienen el privilegio de tomar propiedad (SeTakeOwnershipPrivilege), lo que les permite volver a restablecer todos los permisos de las subclaves.

Trataré de adentrarme más en esto cuando aprenda un poco de Internals.

Saludos,

—Checho

Inyectar actualización acumulativa en Windows 10 utilizando DISM

En mi empresa actual tenemos un canal de internet (a parte de malo) tan registringo que ingresar a Windows Update para descargar actualizaciones de sistema operativo no es una opción viable. Por fortuna, Microsoft está liberando actualizaciones aucumulativas que contienen todos los parches a la fecha, así que basta con descargar solo un paquete y proceder a implementarlo en nuestro equipo, dependiendo de la arquitectura.

El proceso de instalación es solo hacer doble clic sobre el .MSU apropiado y seguir el pequeño asistente de instalación:

image

Aunque es muy sencillo, se vuelve mucho más productivo aprender a automatizarlo para que el proceso sea rápido en cada equipo donde queramos actualizar. En este artículo mostraré cómo podemos lograr eso con la versión de DISM embebida en Windows.

En este artículo utilizaré la versión 1607 de Windows 10 y el último parche acumulativo, KB3197356, que pueden descargar desde aquí:
https://support.microsoft.com/en-us/kb/3197356

Extraer el CAB e inyectar actualización

Para poder inyectar en una imagen con conexión una actualización, el paquete debe tener de tipo .cab; sin embargo, las actualizaciones descargadas de los servidores de Microsoft siempre están como .msu, así que debemos hacer la extracción del .cab antes de proceder a instalar.

Para exraer el .cab e inyectar la actualización realizamos los siguientes pasos:

1. Descargamos la actualización acomulativa a una ruta local; para este caso, yo la guardé en la carpeta C:\CU

image

2. Hacemos clic derecho sobre el menú de inicio y luego en Símbolo del sistema (administrador)

image

3. Desde el símbolo del sistema navegamos hasta la ruta en donde está la KB, por ejemplo: cd C:\CU

image

4. Extraemos todos los .cab que contiene el .MSU con la herramienta de Expand, así:

Expand -F:*.cab KB3197356.msu C:\CU

*Nota: el nombre KB3197356.msu es el nombre que le puse al paquete, así que eso variará en cada caso.

image

El resultado será dos archivos, el WSUSSCAN y la KB en cuestión.

image

5. Eliminamos el paquete de WSUSSCAN

6. Para inyectar la KB, que es la que realmente necesitamos, ejecutamos el siguiente comando desde el mismo símbolo del sistema:

Dism /Online /Add-Package /PackagePath:C:\CU

image

*Notas:

Este proceso puede tardar varios minutos en un mismo porcentaje.

– Los nombres de los directorios pueden variar en cada equipo.

7. Reiniciamos el equipo para que Windows aplique la actualización

image

Después del reinicio, Windows estará completamente actualizado y podremos seguir trabajando.

Espero sea de utilidad.

Saludos,

—Checho

Interpretar las principales operaciones de registro con Process Monitor: RegCreateKey

En el primer artículo de esta seríe describí las funciones RegOpenKeyEx y RegCloseKey, así como la forma de interpretarlas, básicamente, desde la herramienta de Process Monitor. En esta nueva entrega me concentraré exclusivamente a la función RegCreateKeyEx, puesto que es un poco más completa de comprender cuando estamos haciendo diagnóstico.

RegCreateKeyEx

La operación principal de esta función, perteneciente a la API de Windows, consiste en crear una subclave de registro; en caso de que la subclave ya exista, la función la abre para utilizarla posteriormente. Ahora, tomando de ejemplo la subclave HKEY_CURRENT_USER\WinSide, la siguiente gráfica explica la definición que acabo de dar:

SNAGHTML256a06ea

 

HKEY_CURRENT_USER o su abreviación, HKCU, como lo dije en el primer artículo de esta serie, es una clave raíz; aunque WinSide es la verdadera subclave, se le puede llamar también subclave a todo el conjunto, es decir, HKEY_CURRENT_USER\WinSide.

Teniendo en cuenta la misma subclave de ejemplo, HKCU\WinSide, analicemos un poco el código que podríamos escribir en C/C++ con la API. Estas son las variables que requiere la función:

//RegCreateKeyEx
    HKEY hKey = HKEY_CURRENT_USER;
   LPCWSTR subKey = L”WinSide”;
    DWORD reserved = 0;
    LPWSTR classType = NULL;
    DWORD options = REG_OPTION_NON_VOLATILE;
    REGSAM samDesired = KEY_WRITE;
    LPSECURITY_ATTRIBUTES securityAttributes = NULL;
    HKEY createdKey;
    DWORD disposition;

La variable hKey contiene la clave raíz que pudo ser abierta por alguna función como RegOpenKeyEx o, como en este caso, una de las claves raíces que tiene el registro de Windows; la variable de subKey es un apuntador al nombre de la subclave que deseamos abrir o crear, en este caso WinSide; reserved es una variable reservada por el sistema y siempre debe ser cero; classType es el tipo de clase definida para la clave, pero puede ser NULL; la variable options me permite indicar diferentes comportamientos que puede tener la subclave, en el caso de REG_OPTION_NON_VOLATILE, le indica a Windows que la información almacenada se conserva después del reinicio; samDesired indica los derechos de acceso para la subclave, es decir, qué quiero hacer; la variable de securityAttributes almacena los atributos de seguridad, pero al darle NULL la subclave obtiene los predeterminados; createdKey va a tener el handle de la subclave abierta o creada; y disposition me indicará si la sublcave existía y se abrio o no existía y se creó.

Para poder ilustrar lo que Process Monitor captura, invocaré a la función RegCreateKeyEx para que abra o cree la subclave:

/* Función para crear o abrir la subclave
    HKEY_CURRENT_USER\WinSide */

    LONG createKey = RegCreateKeyEx(hKey, subKey, reserved,
                            classType, options, samDesired,
                securityAttributes, &createdKey, &disposition);

La variable createKey recibirá el código de error devuelto por el manejador de errores de Windows; yo puedo utilizar una función adicional para traducir eso a texto, pero obtaré por lo más sencillo que es validar si es satisfactorio o si es necesario mostrar el código de error, así:

if (createKey != ERROR_SUCCESS)
    {
        wprintf(L”Error opening the key. Code: %li\n”, createKey);
    }
    else
    {
        wprintf(L”Subkey was opened or created!\n”);
    }

 

Por supuesto, yo podría darle un poco más de estilo y aprovechar el valor retornado por disposition: es REG_CREATED_NEW_KEY si Windows creó la clave desde cero o REG_OPENED_EXISTING_KEY si la clave ya existía y solo se abrió. Nada más útil que llamar al condicional switch.

switch (disposition)
        {
        case REG_CREATED_NEW_KEY:
            wprintf(L”Key did not existed and was created\n”);
            break;

        case REG_OPENED_EXISTING_KEY:
            wprintf(L”Key existed and was just opened\n”);
            break;

        default:
            wprintf(L”Unkown value\n”);
            break;
        }

El código de toda la validación se vería así:

if (createKey != ERROR_SUCCESS)
    {
        wprintf(L”Error opening the key. Code: %li\n”, createKey);
    }
else
    {
       
        switch (disposition)
        {
          case REG_CREATED_NEW_KEY: //Key was created
            wprintf(L”Key did not existed and was created\n”);
            break;

          case REG_OPENED_EXISTING_KEY: //Key was opened
            wprintf(L”Key existed and was just opened\n”);
            break;

          default:
            wprintf(L”Unkown value\n”);
            break;
        }

        //Do not forget to close the handle!
        RegCloseKey(createdKey);
    }

De esta forma la consola mostrará el mensaje adecuado según se haya creado o abierto la subclave.

Aquí pueden ver la documentación oficial de RegCreateKeyEx:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724844(v=vs.85).aspx 

Process Monitor en acción

Empecemos por ver cómo nos muestra Process Monitor las operaciones que se hagan sobre la subclave HKCU\WinSide, para eso basta con filtrar por ruta y proceso de la aplicación, así:

image

Al ejecutar la aplicación, sin que esté la subclave creada, la validación se va por el REG_CREATED_NEW_KEY y me muestra el mensaje correspondiente:

image

¿Qué pasa en Process Monitor? Esto es lo que me muestra después de mostrado el mensaje:

image

La primera operación que hay listada es RegCreateKey, que corresponde a la que en código tengo como RegCreateKeyEx, está trabajando sobre el Path de HKCU\WinSide, handle que abrió o creó, según sea la disposición. El resultado, como también pueden ver fue SUCCESS, lo que indica que la operación se completó sin problemas y, finalmente, la columna de Detail me da datos importantes como el Desired Access (derechos de acceso solicitados) y Disposition (que me indica si la clave se creó o se abrió).

Después de estas operaciones, vemos que RegCloseKey se encarga de hacer la operación sobre la misma subclave, HKCU\WinSide, para cerrar el handle, es decir, terminar lo que se está haciendo sobre la subclave.

Noten que aunque yo conozco el código, los datos extraídos son todos desde Process Monitor, así que no necesitaría el código para saber qué pretende hacer la aplicación efectuando esa operación. Como datos adicionales, puedo entrar a las propiedades de la operación haciendo doble clic, pestaña de Process y ver detalles más completos:

image


Integrity
me indica el nivel de integridad en el que se está ejecutando el proceso, que en este caso es Medium, como cada proceso de usuario estándar; Architecture me indica, como su nombre en inglés lo dice, la arquitectura de la aplicación, que en este caso es 32-bit, por lo que en algún punto está actuando también la capa de emulación de WOW64.

Si vamos a la pestaña de Stack, podremos ver detalles de toda la transición entre User Mode y Kernel Mode, información bastante completa para alguien que entienda de Windows Internals. Una de las cosas que se puede identificar, por ejemplo, es que puedo ver que a la función exacta que se llama es RegCreateKeyExW (el W al final indica que se compiló como Unicode).

image


Nota:
para ver claramente esto, es necesario que Process Monitor tenga configurado los símbolos.

Aunque desde la vista general de Process Monitor puedo ver los detalles, también está disponible la pestaña de Event en donde tengo todo el resumen:

image

Es importante anotar que así en el código de la aplicación el valor de disposition sea NULL, Process Monitor podrá mostrarlo y así sabremos, a ciencia cierta, si la clave se abrió o se creó. Por ejempo, si yo ejecuto otra vez la misma aplicación de muestra, pero esta vez sin indicarle el disposition, puedo el resultado será el mismo:

image

Debido a que la subclave ya existía, puedo concluir, gracias al detalle de Process Monitor (Disposition: REG_OPENED_EXISTING_KEY), que Windows abrió la clave sin necesidad de crearla otra vez.

Una característica particular que tiene las llamadas a la API es que puedo crear más de una subclave de una vez. Por ejemplo, si en el código que mostré en este artículo quisiera abrir o crear la subclave HKCU\WinSide\Learning\Internals, bastaría con indicarle a la variable subKey todo el árbol, así:

LPCWSTR subKey = L”WinSide\\Learning\\Internals”;


Nota:
el doble signo de ‘\’ es para indicarle que deseamos poner una barra inversa y no una secuencia de escape.

Después de esto, solo es necesario ejecutarlo y esperar el resultado. El mensaje que nos devolverá será para toda la subclave y no para cada una individualmente.

En Process Monitor, sin embargo, podremos ver todo el proceso:

image

Lo primero que intenta hacer la aplicación es abrir la subclave HKCU\WinSide\Learning\Internals; como la clave no existe, empieza a hacer todo el procedimiento de abrir o crear desde la primera subclave, WinSide, hasta la última subclave, Internals. Noten que cada subclave se va cerrando después de pasar el handle a la otra. Cuando termina toda la operación hasta Internals, todos los handles se cierran y el resultado es nuestra subclave creada:

image

Desde Process Monitor, entonces, podemos identificar cuál es la subclave final desde antes de que la aplicación la cree y hacer un seguimiento detallado de cada subclave.

Espero que esto les pueda servir tanto como a mi me está sirviendo para aprender. Intentaré mejorar cada vez más las entradas, conforme vaya aprendiendo yo; además, es posible que toque otras funciones, sea de registro o de sistema de archivos.

 

P.D.: cualquier comentario o corrección es bienvenido.

 

Saludos,

—Checho