Realizar un inventario de aplicaciones instaladas utilizando Application Compatibility Toolkit (ACT)

Hasta el día de hoy, todas las entradas que he hecho en este blog sobre ACT, muestran cómo aplicar determinado shim para solucionar algún problema de aplicaciones como la corrección de rutas o mentira sobre versión; sin embargo, ese no es el único propósito de ACT, así que deseo dedicar este artículo para mostrar algo muy útil en una organización: realizar inventario de aplicaciones instaladas de una forma fácil y rápida.

Requerimientos

1. Descargar el ADK para Windows 8.1 Update desde aquí:
http://www.microsoft.com/en-us/download/details.aspx?id=39982

Ver “Instalando ADK” abajo para las instrucciones de instalación.

*Nota: La descarga solo baja un pequeño cliente que sirve para bajar el contenido completo o instalarlo desde la web. Recomiendo bajar todo antes de instalar.

2. Servidor 2012 R2 que puede ser o no dedicado y que esté unido al dominio de la organización.

*Nota: No es estrictamente necesario que sea Server 2012 R2, pues el ADK funciona desde 2008, incluso en equipos cliente también.

2.1. Crear una carpeta en cualquier unidad llamada: ACTLogs.

3. Equipos cliente que estén unidos al dominio para tomar el inventario.

4. [Opcional] Descargar e instalar SQL Server 2012 Management Studio Express desde aquí:
https://www.microsoft.com/en-US/download/details.aspx?id=29062

Instalando ADK

Cuando descarguemos todo el contenido, pasamos los archivos de instalación al servidor destinado para el ACT, hacemos doble clic sobre el adksetup.exe y procedemos con los siguientes pasos:

1. En la página de Specify Location, escogemos la ruta donde deseamos instalar el ACT, preferiblemente en la que está predeterminada y clic en Next:

2015-06-19_10-45-29

2. En la página Join the Customer Experience Improvement Program (CEIP), escoger si deseamos unirnos al programa y clic en Next:

2015-06-19_10-47-12

3. En la página de License Agreement, clic en Accept:

2015-06-19_10-49-01

4. En la página Select the features you want to install, seleccionamos: Application Compatibility Toolkit (ACT) y, en caso de no tener una base de datos implementada, SQL Server 2012 Express. Luego hacemos clic en Install:

2015-06-19_10-56-48

*Nota: La base de datos se utiliza para guardar el inventario recolectado por el Application Compatibility Manager (ACM), incluido en el ACT.

5. En la última página del asistente, clic en el botón Close para terminar.

Instalando y Configurando ACM

En el Windows Server, buscamos Application Compatibility Manager, clic derecho y Ejecutar como administrador:

2015-06-19_14-25-53

En la página de Welcome to the ACT configuration wizard, clic en Next:

2015-06-19_14-35-47

En la página de Do you want to use this computer to run an ACT Log Processing Service?, dejamos la selección de Yes para que el servicio se instale en el mismo equipo y clic en el botón Next:

2015-06-19_14-36-52

En la página de Configure your ACT Database Settings, escogemos (local)Settings y luego en el botón de Connect para realizar la conexión a la base de datos:

2015-06-19_14-39-29

Una vez detectada, le ponemos el nombre de ACT a la base de datos y clic en Next:

2015-06-19_14-42-04

En la página de Configure Your ACT Database Settings, clic en el botón Next para iniciar la configuración automática:

2015-06-19_14-43-36

En la página de Configure Your Log File Location, hacemos clic en el botón Browse para seleccionar la carpeta ACTLogs creada en el requerimiento 2.1 y clic en Next:

2015-06-19_14-45-44

En la página de Configure Your ACT Log Processing Service Account, dejamos la selección de Local System y clic en Next:

2015-06-19_14-47-29

En la página Congratulations, clic en Finish para terminar:

2015-06-19_14-48-51

Configurando el Data Collection Package

En la consola de Microsoft Application Compatibility Manager, clic en el menú File y seleccionamos New:

2015-06-19_14-58-26

En la ventana de Create a data-collection package, clic en el botón de Invetory collection package para crear el paquete que se encargará de recolectar el inventario de aplicaciones en nuestros equipos:

2015-06-19_15-00-09

En la página de Set up your inventory package, le damos un nombre a nuestro paquete y una etiqueta para diferenciarlo; después de esto, clic en el botón Create:

2015-06-19_15-26-08

Posteriormente, escogemos una ruta donde queramos guardar el MSI que vamos a distribuir:

2015-06-19_15-29-59

Clic en Finish para terminar.

Cerramos la consola del ACM.

Modificando permisos en ACTLogs

Antes de desplegar el paquete que hará el inventario, es necesario modificar unos permisos de seguridad sobre la carpeta ACTLogs creada en los requerimientos. Para esto, seguimos estos pasos:

1. Navegamos hasta la carpeta ACTLogs, clic derecho y Properties:

2015-06-21_16-50-14

2. Vamos a la pestaña de Sharing y luego Advanced sharing:

2015-06-21_16-52-52

3. Clic en el botón Permissions:

2015-06-21_16-53-52

4. Clic en el botón Add, escogemos Domain Computers, aceptamos y luego asignamos permisos para cambiar:

2015-06-21_16-54-54

5. Clic en OK dos veces y luego pasamos a la pestaña de Security.

6. Clic en el botón Edit:

2015-06-21_16-56-51

7. Clic nuevamente en el botón de Add, buscamos Domain Computers, clic en OK y luego asignamos permisos de escritura:

2015-06-21_16-58-04

8. Clic en OK y luego en Close para terminar.

Distribuyendo y probando

Nuestro último paso es lograr ejecutar el .MSI que nos creó el ACM en todos los equipos donde deseamos tener inventario de aplicaciones; lo podemos hacer a través de la red con alguna solución como directiva de grupo o bien manualmente en cada equipo.

El cliente reporta perfectamente tanto para equipos cliente, como para equipos servidor. Por ejemplo, estas son las aplicaciones que tengo instaladas en el equipos destinado para ACT:

2015-06-21_17-12-14

Basta con ejecutar el ACT_Inventory.msi creado con una cuenta que tenga privilegios administrativos y lo único que veremos será un pequeño progreso.

Al abrir nuevamente la consola del ACM, vamos a la pestaña inferior izquierda de Analyze y en la pestaña de Windows 8.1 veremos información previa de lo que se recolectó:

2015-06-21_17-22-07

Al hacer clic en el nodo de Applications, podremos ver todas las mismas aplicaciones pero en el inventario hecho por el cliente ACT_Inventory que creamos:

2015-06-21_17-25-32

El inventario hecho en equipos Server 2012 R2 se verán en el mismo nodo de Windows 8.1. Si nos pasamos a la pestaña de Computers en el panel izquierdo, podremos ver de todas formas de qué sistema operativo proviene:

2015-06-21_17-27-22

Como mencioné antes, otra forma de realizar este despliegue sería como un Script de arranque a través de Directiva de Grupo:

2015-06-21_17-31-16

Como recomendación, es más productivo desplegarlo con alguna solución como SCCM.

En la lista de equipos, se puede ver cada equipo en particular haciendo doble clic; todos los datos estarán disponibles:

2015-06-21_17-46-06

Naturalmente, entre más equipos se reporten, más grande será el inventario en ACM:

2015-06-21_17-49-23

Desde ACM podemos además hacer doble clic sobre una sola aplicación y ver en cuántos equipos está instalada, o qué versiones son las que existen:

2015-06-21_17-52-10

2015-06-21_17-53-13

Intentará en un futuro artículo hablar sobre el otro tipo de paquete, y operaciones adicionales que se puede hacer desde el Application Compatibility Manager.

Espero sea de utilidad.

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

Saludos.

Checho

El mensaje: “Microsoft Word/Excel dejó de funcionar” en Office 2013, ProcDump, Windbg, Process Monitor y su solución

El problema más grande de comprar un equipo con Windows preinstalado, es decir, que sea OEM, es que normalmente tiene toda la basura que te puedas imaginar instalada. Casi siempre tiene antivirus de terceros, aplicaciones del fabricante que no sirven para nada y otra tanta cantidad de cosas que afectan el rendimiento del sistema operativo desde el primer momento.

Sumado a lo anterior, está la cantidad de basura adicional que ofrecen algunas instalaciones de productos como impresoras, agregando una cantidad de complementos inútiles en Windows.

La parte positiva de todo eso, por lo menos para los que nos emocionamos con problemas extraños, es que se puede llegar a aprender mucho con cualquier inconveniente causado por la combinación de tanta instalación. A continuación paso a describir un caso muy interesante, que puede ser además de ayuda para los que experimenten algo similar. 

El problema

Básicamente, se había comprado la licencia personal de Office 365 a un equipo OEM, que obviamente tenía antivirus, software de impresora y otra cantidad interminable de aplicaciones de terceros; poco tiempo después de instalado Office, siempre que intentaban abrir un archivo de Word o Excel, Windows respondía con estos mensajes:

2015-06-10_11-00-51

<<Microsoft Word dejó de funcionar>>

2015-06-10_11-04-36

<<Microsoft Excel dejó de funcionar>>

No importa si se abría con privilegios estándar o administrador, un documento ya hecho o en blanco, siempre había crash antes de empezar a editar. Ahora, existían dos cosas curiosas:

1. Si se ejecutaba Word, la pantalla de bienvenida funcionaba sin ningún problema:

2015-06-10_18-06-10

Al hacer clic en Documento en blanco, se reproducía el problema. Lo mismo pasaba en Excel, solo funcionaba hasta la pantalla de bienvenida.

2. El crash solo se reproducía en Word y Excel; PowerPoint por otra parte, funcionaba perfectamente, sin importar de qué forma se abriera.

Antes de yo entrar a revisar el problema, habían intentado reinstalar y reparar el Office, pero sin resultado positivo.

La causa

Lo más trágico de un crash en Windows, sea de aplicación o de sistema operativo, es que la información que brinda no sirve absolutamente para nada en la mayoría de ocasiones. En el caso de este mensaje, el “dejó de funcionar” es el mismo para cualquier aplicación que se detenga y no se pueda recuperar.

Primero que todo, se me ocurrió que seguramente había alguna extensión proveniente de otra aplicación integrada en Office, y me acordé que hace muy poco Autoruns de Sysinternals agregó una nueva pestaña enfocada precisamente para revelar qué complementos tiene instalado la suite.

Descargué Autoruns, lo ejecuté como administrador en el equipo y, en efecto, había algunos complementos cargando con Office:

2015-06-10_22-35-50

Deshabilité los tres complementos, reinicié Word con mucha expectativa, pero para mi mala fortuna, el problema continuaba. Nada más para hacer por el lado de Autoruns, pues rara vez se le escapa algo a las herramientas de Sysinternals.

Aunque no sé nada sobre depuración de volcados de memoria, es decir, archivos .DMP, un análisis elemental puede ser de mucha ayuda como en el caso de pantallazos azules. Lo que hice entonces fue descargar ProcDump de Sysinternals, copiarlo en la carpeta de System32 para ejecutarlo desde cualquier procedí a hacer lo siguiente:

1. Creé la carpeta C:Dump para almacenar cualquier volcado de memoria.

2. Desde un símbolo del sistema con privilegios elevados, ejecuté:

procdump -e -w -ma winword.exe -accepteula C:Dump

2015-06-10_17-21-50

La función de ProcDump es monitorear un proceso y escribir un volcado de memoria cuando el proceso exceda los parámetros indicados, o cuando hay alguna excepción que genere un crash. Esto es mucho más útil que hacerlo desde el Administrador de tareas, puesto que lo hace en el instante adecuado y de forma automática.

El parámetro de –e, sirve para escribir un volcado de memoria cuando el proceso tenga una excepción no controlada, –w espera a que el proceso se ejecute y –ma escribe un volcado de memoria completo. Después de esto, especifiqué el proceso que deseaba monitorear y dónde quería guardar el volcado de memoria.

Una vez hecho esto, ejecuté Windbg en mi propio equipo y abrí el volcado de memoria creado desde la opción File > Open Crash Dump:

2015-06-10_22-45-32

Ya en la consola de Windbg, hice la operación más básica, ejecutar: !analyze –v

2015-06-10_22-25-00

Tal cual como lo haría con un análisis de pantalla azul, después del amplio reporte que entrega Windbg, me concentré en lo que contenía el STACK_TEXT, que es básicamente lo que había en memoria al momento del crash.

Lo ideal es descartar las entradas que se refieran a módulos de Windows y analizar las demás. En este caso, me encontré con dos muy interesantes:

2015-06-10_17-49-31

Ambas entradas tenían un mismo módulo llamado SprintIntegration. Para obtener más información, ejecuté desde la consola: lm vm SprintIntegration y obtuve esto:

2015-06-10_17-50-09

Era una DLL llamada SprintIntegration.dll, perteneciente a una empresa con el nombre de ABBYY y con nombre de producto: ABBYY FineReader. Ya había una interesante pista, ¿cómo sabía de qué forma estaba interactuando esto con Office? Seguramente desde el Windbg hubiese podido obtener muchos más detalles, pero a falta de conocimiento, decidí ejecutar Process Monitor y seguir el rastro desde la ejecución de Word, hasta el crash.

Con todo el log de Process Monitor a la mano, realicé un primer filtro para que sólo me mostrara actividad que tuviese el proceso de Winword.exe perteneciente a Microsoft Word:

2015-06-10_16-34-55

Hecho esto, abrí el cuadro de búsqueda (CTRL + F) y busqué por entradas que tuviesen referencia al nombre de producto ABBYY FineReader; el primer resultado arrojó una luz sobre lo que pasaba:

2015-06-10_17-42-18

Tal como ven en la captura (clic para verla en tamaño real), Word estaba consultando a un valor llamado FriendlyName, en la sub-clave:

HKLMSOFTWAREWow6432NodeMicrosoftOfficeWordAddinsSprint.WordIntegration.9

Lo primero que llamó mi atención, es que estaba sobre la sub-clave de Addins y Autoruns no me había mostrado nada relacionado a Sprint.WordIntegration, cosa que me extrañaba bastante, porque al parecer esto era en realidad una extensión más de Office.

Cuando vi en las propiedades de la entrada en Process Monitor, pude ver finalmente la relación con el módulo de ABBYY:

2015-06-10_23-37-13

Así se veía todo el contenido de la sub-clave Sprint.WordIntegration.9 en el Registro:

2015-06-10_23-41-06

En la misma sub-clave de Office además, noté que cada producto tenía su apartado de Addins, y cuando expandí los de Excel y PowerPoint, encontré algo particular:

2015-06-10_17-48-33

Tanto la sub-clave de Addins para Word, como la de Excel tenían la clave de Sprint, pero PowerPoint no; esto era un claro indicador del porqué ahí no había crash y en los otros dos productos sí.

La prueba final era proceder a eliminar la sub-clave para que el producto no la pudiera encontrar al abrirse:

2015-06-10_18-00-04

Después de esto, abrí solo Word que es donde le había quitado ese complemento y no hubo ningún tipo de crash.

La solución

Encontrado y probado la causa, mi siguiente paso era ver de qué forma podía implementar una solución. Eliminar ambos complementos solucionaría el problema tanto en Word como en Excel, pero decidí buscar otro camino directamente desde la aplicación.

En Programas y Características, identifiqué la versión que tenía instalado Windows de ABBYY:

2015-06-10_17-46-58

Tal como ven, era la 9.01.513.58212; abrí la aplicación en cuestión, fui al menú de Ayuda y como pensaba, existía la opción para buscar actualizaciones:

2015-06-10_18-03-25

Para mi grata sorpresa, se abrió una página web indicándome que en efecto, había una actualización para la versión 9.0, pero lo más interesante era uno de los detalles sobre esta:

2015-06-10_18-02-42

Esta aplicación corregía la integración con Office 2010 y 2013, así que probablemente el desarrollador ya tenía identificado el problema que estaba causando.

Descargué la actualización y procedí a instalarla. La versión cambió ligeramente:

2015-06-10_18-24-09

Volví finalmente a abrir Word y como supuse, ya no había crash, así que podía utilizar libremente Word y Excel:

2015-06-10_18-05-14

Obviamente, eliminar la sub-clave Sprint.WordIntegration.9 en los Addins de Word y Excel hubiese solucionado el problema sin necesidad de actualizar el cliente, pero actualizar era más sano y soportado.

¡Espero sea de utilidad!

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

Saludos.

Checho

Crear y configurar una partición de recuperación en Windows 8.1

Hace ya un buen tiempo, escribí sobre una característica interesante de recuperación para Windows 8/8.1 llamada: Refresh. Básicamente, me permitía realizar una instalación de Windows, volviendo a un punto que yo especificara con perfil y archivos. Primero mostré cómo creaba y luego cómo se podía establecer una imagen creada en un equipo en otro PC.

Refresh funciona muy bien y por lo general es el primer camino, pero hay ocasiones en las que por diferentes razones quieres volver a restaurar el equipo sin conservar nada, tal cual se hacía con las particiones de recuperación entregadas por los OEM en Windows 7. Bajo esta necesidad, es que existen la característica de Reset, que permite hacer reinstalación del sistema operativo partiendo de una imagen sin conservar nada.

Recordemos que Windows 8/8.1 me permite escoger cuál de las dos quiero ejecutar, Una restauración sin afectar los archivos (Refresh), o quitar todo y reinstalar Windows (Reset):

2015-06-05_12-17-36

En los artículos mencionados al principio mostré y expliqué cómo configurar Refresh, ¿pero qué pasa con Reset? Normalmente ya existe una partición de recuperación, pero me lleva el equipo a un punto donde el OEM me lo entregó y quizá quiera reinstalar, pero que se haga sobre una imagen que contenga las aplicaciones ya instaladas.

En el resto del post explicaré cómo podemos capturar una imagen a partir del sistema que tenemos instalado y configurar un punto de Reset.

Requerimientos

1. Crear un Entorno de Preinstalación (Windows PE):

Para no hacer demasiado largo el post, tengo creado un artículo en TechNet Wiki donde explico paso a paso cómo podemos hacer esto:
http://social.technet.microsoft.com/wiki/contents/articles/28497.how-to-crear-un-entorno-de-preinstalacion-de-windows-windows-pe-es-es.aspx 

2. Respaldar el código de producto de Windows:

Para hacer esto, descargamos y ejecutamos la aplicación ProduKey de Nirsoft y la ejecutamos para obtener nuestro código de activación:

2015-06-05_11-37-39

Capturando la imagen maestra

Una vez hayamos creado el Windows PE siguiendo el primer paso de los requerimientos, debemos grabarlo en un DVD o USB e iniciar nuestro equipo con Windows 8.1 desde él. Al iniciar, tendremos la consola del Windows PE:

2015-06-05_12-41-58

Lo que haremos será capturar la instalación actual para volverla un .WIM y poder utilizarla como imagen de recuperación.

Antes que nada, verificamos que la partición asignada dentro del Windows PE para nuestra instalación es la C; para esto, ejecutamos:

Dir C:

Debería ver en el resultado las carpetas de instalación como Program Files, Windows, etc:

2015-06-05_12-45-56

*Nota: Si esto no pasa, debemos utilizar Dir para ver el contenido de otras unidades como E, D, F, etc. En alguna de ellas, exceptuando la X que pertenece al Windows PE, quedarán la partición del sistema operativo. Generalmente se mantiene en C.

Luego de verificar la partición, procedemos a capturar ejecutando:

Dism /Capture-Image /CaptureDir:C: /ImageFile:C:install.wim /Name:¨Windows 8.1 Pro" /NoRpFix

2015-06-05_12-58-50

*Nota: Todo es una sola línea.

El tiempo que demore creando la imagen, dependerá de la velocidad y escritura del disco local.

Cuando llegue al 100 %, reiniciamos el equipo y dejamos que ingrese a Windows nuevamente. Al reiniciar, debe haberse creado un archivo llamado install.wim en la raíz del la unidad C:

2015-06-05_13-15-37

Ahora, es muy importante saber el peso de la imagen, pues de eso dependerá el tamaño para la partición de recuperación. En mi caso, la imagen pesa 11.1GB:

2015-06-05_13-17-35

Configurando partición de recuperación

En Windows 8.1, hacemos clic derecho sobre el botón de Inicio y seleccionamos: Administrador de discos:

2015-06-05_13-36-28

En la consola de Administración de discos, seleccionamos en la parte inferior el disco que deseamos reducir, hacemos clic derecho y seleccionamos Reducir volumen:

2015-06-05_13-43-02

En la ventana de Reducir, indicamos el espacio que deseamos reducir, teniendo en cuenta el espacio disponible para reducción. En este caso, tomé un poco menos de 13GB indicado en MB:

2015-06-05_13-48-38

El espacio sin asignar se verá inmediatamente en el administrador de discos. Hacemos clic derecho sobre este espacio sin asignar y seleccionamos Nuevo volumen simple:

2015-06-05_13-50-45

En el Asistente para nuevo volumen simple, hacemos clic en el botón Siguiente dos veces, hasta llegar a la página de Asignar letra de unidad o ruta de acceso. Allí asignamos la letra R y clic en Siguiente nuevamente:

2015-06-05_13-57-19

En la página de Formatear la partición, asignamos como etiqueta de volumen: Recovery y clic en Siguiente:

2015-06-05_13-58-18

En la página de Finalización del asistente para nuevo volumen simple, clic en Finalizar.

Lo que haremos ahora será ir a la nueva partición de Recovery desde el Explorador de archivos, crear una carpeta llamada Imagen y ahí pegar el archivo install.wim desde la unidad C que capturamos en los pasos anteriores.

Esto lo podemos automatizar ejecutando desde un símbolo del sistema con privilegios elevados:

mkdir R:Imagen

xcopy C:install.wim R:Imagen

2015-06-05_14-04-46

*Nota: Obviamente esto lo podemos hacer manualmente.

Cuando hayamos copiado el archivo, hacemos clic derecho sobre el botón de Inicio y seleccionamos Símbolo del sistema (administrador):

2015-06-05_13-24-49

En el símbolo del sistema, ejecutamos:

Reagentc /Setosimage /Path R:Imagen /Target C:Windows /Index 1

2015-06-05_14-13-12

Ya todo está listo, pero para que nos quede más estético, debemos marcar la partición como de recuperación y ocultarla para evitar que se borre. Para esto, desde la misma consola ejecutamos:

Diskpart

List disk

Esto nos listará todos los discos que tengamos conectados:

2015-06-05_14-18-14

En mi caso, solo tengo un disco, así que obviamente la partición está incluida en ese disco. Esto podría variar en cada uno de ustedes, pero recomiendo que se utilice un espacio en el mismo disco donde está instalado el sistema operativo.

Una vez identificado el disco, lo debemos seleccionara y proceder a marcarla como recuperación, quitarle la unidad y esconderla. Para mi caso, ejecutamos:

Select disk 0

List disk

Tendremos ahora la lista de particiones del equipo:

2015-06-05_15-18-42

Seleccionamos la partición correspondiente a la unidad de recuperación. En este caso, como sería la 5, el comando quedaría:

Select partition 5

Posteriormente, quitamos la letra de unidad asignada, le cambiamos el tipo y la ocultamos ejecutando:

Remove

set id=de94bba4-06d1-4d40-a16a-bfd50179d6ac

gpt attributes=0x8000000000000001

2015-06-05_18-37-44

Importante:

Si la BIOS no es UEFI, los comandos aquí deben ser así:

set id=27
remove

Hecho esto, en la consola de Administración de discos debe verse la partición sin letra y sin posibilidad de modificarla al darle clic derecho:

2015-06-05_18-41-22

¡Todo listo! Ahora cada que necesitemos reinstalar Windows, sin guardar nada y volviendo al punto donde capturamos la imagen, hacemos lo siguiente:

1. Presionamos las teclas Windows + I para abrir el panel derecho y clic en Cambiar configuración de PC:

2015-06-05_20-02-27

2. En la aplicación de Configuración de PC, clic en Actualizar y recuperar y luego en Recuperación.

3. En el panel derecho, hacemos clic en el botón Comenzar, debajo de Quitar todo y reinstalar Windows:

2015-06-05_20-03-59

4. En la página de Restablecer PC, clic en Siguiente:

2015-06-05_20-09-19

5. En la página de ¿Quieres limpiar completamente la unidad? clic en Quitar solo mis archivos:

2015-06-05_20-10-10

6. En la página de Listos para restablecer tu PC, clic en el botón Restablecer:

2015-06-05_20-11-15

El equipo se reiniciará y comenzará a restablecer usando la imagen establecida:

2015-06-05_20-13-00

Como dato adicional, este proceso seguirá funcionando para volver de Windows 10 a Windows 8.1, siguiendo un procedimiento para restablecer muy similar al enumerado.

Espero sea de utilidad.

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

Saludos.

Checho