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

El navegador que se abría solo al iniciar sesión, la extraña página que no dejaba navegar, Process Monitor y su solución

El problema que estoy por describir ya se había publicado hace un buen rato en un hilo de Microsoft Community, aunque sin una respuesta certera. Esta vez pude enfrentarme directamente al problema y afortunadamente pude encontrar una solución, así que no dudé en documentarlo para escribir este post.

El problema

Cada que el usuario iniciaba sesión, por reinicio o cierre de sesión, se abría Internet Explorer mostrando una curiosa página similar a esta:

2015-05-17_22-05-16

Al cerrar la página la ventana no volvía a aparecer, pero Internet Explorer tampoco permitía navegar a otra página diferente, puesto que siempre abría el extraño enlace y le enviaba como parámetro la página a la que se intentaba navegar.

Así se veía intentando ingresar a la web de Sysinternals:

Malware1

De esta forma, aunque se podían abrir los enlaces posteriormente, siempre se debía pasar por la página de login.lataminternet.com.

La causa

Lo primero que intenté para solucionar el problema fue abrir Autoruns y buscar entradas que pudiese ver sospechosas y que tal vez referenciaran a esa extraña web, o por lo menos dieran pistas del porqué Internet Explorer se ejecutaba al iniciar sesión. Lamentablemente, encontré solo algunas entradas de programas inútiles que si bien inhabilité, no me solucionaron el problema del navegador.

Lo que procedí a hacer fue ejecutar Process Monitor, posteriormente iniciar el navegador e intentar ir a algún sitio como el de Sysinternals para rastrear todo lo que estaba ocurriendo en Windows y pasar a diagnosticar.

Una vez abierto el log, abrí el menú de filtros (Filter > Filter) y creé uno para que solo se incluyera en el resultado las entradas que en su detalle (Detail) tuviesen lataminternet.com:

2015-05-17_22-29-45

Por fortuna para mi, fueron pocas entradas para analizar:

2015-05-17_22-33-01

La primera y la última entrada hacían referencia a la sub-clave de TypedURLs, que es donde al parecer Internet Explorer guarda el historial de todas las páginas que se han digitado completamente en la barra de direcciones. Muy similar a RunMRU de la ventaja de Ejecutar que tiene la lista de comandos lanzados.

Descartado eso, me quedaba la clave:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionURLPrefixes

Desde Process Monitor, hice clic derecho y seleccioné Jump To para ir al Registro y allí me encontré con una interesante sorpresa:

11263697_10152928299007476_1556594887_n

La clave predeterminada y la de www tenían como contenido la URL completa del sitio que se abría cada vez que intentaba navegar con Internet Explorer o iniciaba sesión.

En un equipo funcional, los valores deberían verse así:

2015-05-17_22-41-23

En la otra sub-clave de registro debajo de URL, llamada DefaultPrefix estaba también referenciado el sitio:

2015-05-17_22-47-59

Todo empezaba a tener bastante sentido, pues a parte del nombre Prefijos en español de la sub-clave, no se estaba abriendo solo el protocolo (http, por ejemplo), sino toda la página de login.lataminternet.com.

*Nota: Interesante además ver que lo que anteponga como contenido en cada uno de estos valores, lo va a lanzar el navegador, ¿no lo creen?

La solución

Lo que hice para solucionar el problema, fue lo siguiente:

1. Navegar hasta la sub-clave:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionURLDefaultPrefix

2. Allí hice doble clic sobre el valor predeterminado y lo dejé sin contenido:

2015-05-17_22-51-00

2. Después de esto, me pasé en la misma clave de URL a la sub-clave de Prefixes.

3. Quité el contenido del valor predeterminado y cambié el de www a solo http://

2015-05-17_22-52-49

4. Reinicié el equipo.

Después del reinicio, Internet Explorer no abrió más y ahora podía navegar sin problema alguno:

2015-05-17_22-55-33

Espero sea de utilidad.

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

Saludos.

Checho

La aplicación que daba Acceso Denegado con el proceso elevado, UAC, Process Explorer, ResHacker y su solución

Una de las cosas que hacemos en Tulpep, empresa donde actualmente trabajo, cuando solucionamos un problema de alguna aplicación que requiere muchos pasos manuales, es ofrecer una solución alternativa en la que creamos un instalador y automatizamos los procesos con el objetivo de que sea más fácil para el cliente. Estos procesos suelen hacerse con Inno Setup, a no ser que sea un desarrollo propio.

Hace unos días terminé un instalador que debía entregar a un cliente y por supuesto, debía probar el funcionamiento en un laboratorio. Una de las Fuentes que tenía referenciado en el script de Inno Setup, era un .BAT que iba a correr después de terminada la instalación:

2015-04-18_19-20-58

El archivo en cuestión, utilizaba Robocopy para copiar unos archivos necesarios de la carpeta fuente de instalación, a la de otro programa que se enviaba a instalar desde el asistente:

2015-04-18_19-32-02

Hasta aquí nada raro, de hecho la instalación funcionaba muy bien desde el Inno Setup que previamente había lanzado como administrador.

El problema

Una vez probado todo, procedí a compilar el instalador y a probar desde él toda la instalación. Sabía que debía tener privilegios administrativos para las tareas que iba a ejecutar, pero solo con darle doble clic al Setup.exe que había creado, Windows me pedía elevación de privilegios:

2015-04-18_19-39-05

Con eso creí que era suficiente, ya que si el instalador pedía elevación, todo lo que ejecutara debía obtener el mismo token administrativo y proceder a realizar operaciones.

Sin embargo, al llegar al momento en que se lanzaba el BAT, recibí un mensaje de acceso denegado:

2015-04-18_19-52-32

Ahí se quedaba en un bucle infinito tratando de escribir y no pasaba. ¿Por qué?

La causa

Normalmente un proceso siempre adquiere el token o privilegios otorgados por su proceso padre; además de sus niveles de integridad. Si este ejecutable me pedía elevación, yo suponía que debía estar con los privilegios elevados pero, la única forma de comprobarlo iba a ser con Process Explorer de Sysinternals.

Lo que hice fue ejecutar Proccess Explorer, habilitar la columna de Integirty Levels y dejarlo en segundo plano mientras lanzaba la aplicación haciendo doble clic y aceptando el mensaje del UAC. Esto fue lo que encontré al dejar el instalador abierto y ver en Procexp:

2015-04-18_20-12-48

El árbol que muestra Process Explorer, ubica el proceso padre mucho más alineado a la izquierda que el hijo. En este caso, el proceso padre era Setup.exe, luego Setup.tmp y abajo de él, pero en el mismo nivel, estaban otros Setup y finalmente el cmd.exe que a su vez llamaba al Robocopy.exe.

A parte de que se creaban dos instancias: Setup.exe y Setup.tmp; el nivel de integridad que tenía heredado cmd y Robocopy era Medium (ver gráfica), cuando en realidad debería ser High como el que estaba arriba de cmd.exe. Todo esto quiere decir que cmd.exe estaba heredando el token del primer Setup.exe, así que siempre iba a ejecutarse con privilegios estándar y NO elevados.

La ventana del UAC que me pedía consentimiento elevaba la segunda instancia del Setup.exe, pero esto no servía de nada, ya que siempre los demás ejecutables o archivos por lotes que llamaba iban a seguir ejecutándose sin permisos administrativos. El resultado de todo esto: ¡Acceso Denegado!

Ahora, ¿Qué pasaba al tomarme el trabajo de darle clic derecho sobre el Setup.exe y seleccionar Ejecutar como administrador? Esto muestra Process Explorer:

2015-04-18_21-10-33

Básicamente, no había otra instancia del .EXE y .TMP. Las únicas dos instancias que existían estaban con el nivel de integridad en High (Alto); o sea que todo lo que el proceso llamara se iba a ejecutar con privilegios administrativos. Por ejemplo, el Robocopy:

2015-04-18_21-14-20

En pocas palabras, para que todo se ejecutara e instalara correctamente, necesitaba que la aplicación obtuviera el token administrativo desde su proceso padre.

¿Por qué una instancia quedaba elevada al hacer doble clic? No sé responder eso, pero lo que sí sabía en ese momento es que el instalador no estaba pidiendo elevación de privilegios administrativos. ¿Por qué me salía el primer mensaje pidiendo elevación? No sé, probablemente el UAC estaba

En este punto, una de las personas que más admiro, Ricardo Polo, me dio la pista clave: El archivo manifiesto de UAC que estaba en el instalador. No entraré en detalle porque me falta mucho conocimiento para escribir bastante al respecto, pero básicamente es un XML donde entre otras cosas, se le pide a Windows con qué nivel de privilegios debe ser ejecutada la aplicación. Existen tres, los máximos privilegios que el usuario le pueda otorgar, como se invoque (que se traduce básicamente a estándar) y pedir administrador. Técnicamente, se reconocen como: highestAvailable, asInvoker y requiereAdministrator.

Intentaré describir en otro post cómo lo hice, pero en esencia utilicé Strings de Sysinternals para ver los binarios del instalador y de ese resultado buscar el manifiesto. Este fue el resultado al verlo en un TXT:

2015-04-18_21-35-09

Debido a que el manifiesto que Inno Setup integraba a la aplicación pedía asInvoker, siempre se iba a ejecutar con privilegios estándar si se lanzaba con doble clic. El reto consistía en modificar ese manifiesto para que pidiera privilegios administrativos al ejecutarse.

La solución

Para poder modificar el manifiesto sobre el ejecutable, descargué Resource Hacker y procedí a hacer lo siguiente:

1. Lancé Resource Hacker haciendo clic derecho y Ejecutar como administrador.

2. Abrí el instalador desde ResHacker haciendo clic en File > Open.

2015-04-18_21-42-59

3. Expandí el nodo 24 > 1 y clic en 1033 para ver el string que tenía. Estos números pueden variar:

2015-04-18_21-44-53

4. Cambié el level por requiereAdministrator y clic en el botón Compile Script.

2015-04-18_21-52-38

5. Hice clic en el menú File > Save as…

2015-04-18_21-56-53

6. Le puse un nombre descriptivo con la extensión .EXE y lo guardé:

2015-04-18_21-58-34

7. Cerré Resource Hacker.

Finalmente, fui hasta la ruta del instalador y el nuevo instalador ahora tenía el escudo de UAC que identifica el requerimiento de privilegios para ejecutarse:

2015-04-18_22-00-08

Al ejecutarlo, aparecía el UAC y después de aceptar se elevaba el privilegio como debía ser:

2015-04-18_22-01-04

Este mismo procedimiento se le puede aplicar a cualquier instalador que deseen modificarle el manifiesto, si es que lo tiene.

Espero sea de utilidad.

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

Checho

[How to] Monitorear Windows con Process Monitor en el inicio y cierre de sesión

La mayoría de los casos que suelo exponer en este blog, muestro cómo utilicé alguna característica de Process Monitor para encontrar pistas, causas o incluso la solución. Una de las características que más he utilizado en casos donde el problema se reproduce al inicio de sesión, o antes, es la de Boot Logging que me permite monitorear Windows incluso después de reiniciar el equipo.

Sin embargo, no siempre es práctico tener tantos datos cuando se está buscando algo muy concreto pero que se reproduce en un escenario de cierre o inicio de sesión. En este post mostraré cómo aprovechar PsExec y Process Monitor para cubrir este escenario sin necesidad de habilitar Boot Logging.

*Nota: Si lo que se quieres es monitorear controladores u otro tipo de cosas que suceden antes del inicio de sesión, la única opción es Boot Loggging.

Caso real de ejemplo:

Ahora, consideremos un problema que ha tenido cierta frecuencia en los foros de Microsoft; básicamente iniciamos sesión en Windows y nos encontramos con un mensaje de error como este:

2015-04-05_21-27-00

Como casi siempre pasa, después de aceptar el mensaje, no sucede nada más. El Administrador de tareas –si estamos de suerte- para este caso mostraría algo así:

2015-04-05_21-29-56

Deshabilitarlo serviría para evitar el mensaje, pero estaría actuando directamente sobre el proceso real de wscript.exe y no sobre la causa raíz. Obviamente NO iríamos por el camino fácil. =)

Como dije al inicio, el camino directo sería usar Boot Logging; aun así podemos combinar Process Monitor y PsExec para hacer algo más productivo:

Requerimientos

1. Descargar Process Monitor desde aquí:
https://technet.microsoft.com/es-es/sysinternals/bb896645

Descomprimir el archivo .ZIP.

2. Descargar PsExec desde aquí:
https://technet.microsoft.com/es-es/sysinternals/bb897553

Descomprimir el archivo .ZIP.

3. Copiar y pegar Procmon.exe y PsExec.exe al directorio raíz C:

2015-04-05_21-42-22

Combinando Procmon y PsExec

Hacemos clic derecho en el botón de Inicio y luego en Símbolo del sistema (administrador):

2015-04-05_21-46-25

Aceptamos la ventana del UAC y una vez en la consola, ejecutamos en orden:

cd C:

Esto nos ubicará en el directorio raíz C:

2015-04-05_21-50-11

Una vez en la raíz, podremos ejecutar sin problemas Procmon y PsExec. Para que Proccess Monitor siga ejecutándose incluso después del cierre de sesión, ejecutamos:

PsExec –s –d C:Procmon.exe /AccepEula /Quiet /BackingFile C:Log.pml

2015-04-05_21-54-00

*Nota: PsExec me permite ejecutar procesos remotamente, pero además utilizar el usuario con súper poderes SYSTEM con la bandera –s; –d es para que PsExec se cierre sin esperar a que Procmon.exe lo haga y lo demás es para aceptar el EULA, que no muestre mensajes y que todo se vaya guardando en el archivo Log.pml ubicado en la misma unidad.

Utilizando Process Explorer de Sysinternals se puede verificar que Process Monitor está en ejecución, bajo la sesión 0 perteneciente a los servicios y con el usuario de SYSTEM:

2015-04-05_21-59-36

Procedemos a cerrar sesión, iniciar nuevamente, esperar a que el mensaje extraño vuelva a salir y hacemos lo siguiente:

Clic derecho otra vez en el botón de Inicio, Símbolo del sistema (administrador):

2015-04-05_21-46-25

En el símbolo del sistema, ejecutamos:

cd C:

2015-04-05_21-50-11

Finalmente, ejecutamos lo siguiente para terminar el monitoreo:

PsExec –s –d C:Procmon.exe /AcceptEula /Terminate

2015-04-05_22-03-38

Si todo sale bien, el log nos habrá quedado guardado en la raíz del disco local C:

2015-04-05_22-05-55

Lo único que queda es abrir el log y y empezar a jugar con Process Monitor para descubrir qué causa el mensaje de error.

Por ejemplo y para este caso, lo primero sería referenciar detalles sobre el proceso que lanza el wscript.exe; esto es fácil presionando las teclas CTRL + T para abrir el árbol de procesos y ubicar la ocurrencia que buscamos de wscript:

2015-04-05_22-09-02

Tal como ven, el proceso padre fue Explorer.exe, con su respectivo PID 2384.

Ya que es el Explorer.exe, indica que probablemente se ejecutó algún archivo al momento de iniciar sesión, no necesariamente que el proceso haya sido alterado.

Una buena práctica es siempre ver qué se está lanzando en ubicaciones tan comunes como la carpeta de Inicio que ha existido durante tanto tiempo y que le dice a Windows todo lo que debe ejecutar automáticamente.

Para que Process Monitor nos muestre las operaciones de lectura que hace solo en este directorio, podemos filtrar diciendo que excluya todos los PID diferentes al 2384 –en este caso-, que el resultado sea SUCCESS, la ruta contenga Startup y la categoría sea Read:

2015-04-05_22-15-03

Noten que en la mayoría excluí lo que no quería, con el resultado que deseaba.

El resultado sería más o menos así:

2015-04-05_22-19-09

Gracias a que lo que dejaría Process Monitor sería muy conciso, identificar un archivo extraño como un acceso directo se podría hacer sin mayor dificultad.

*Nota: No me enfoqué en los filtros de Process Monitor, porque el objetivo era mostrar cómo ejecutarlo al cerrar e iniciar sesión; sin embargo intentaré crear otros artículos donde detalle más el tema.

Espero sea de utilidad.

Saludos.

Checho

Convertir un medio de Windows 10 PRO build 10041 a Enterprise utilizando DISM

Hace unos días, y después de casi dos meses, se liberó finalmente la compilación 10041 de Windows 10 de manera oficial. Lamentablemente, sólo se encuentran disponibles los bits de la edición PRO y no los de Enterprise. Como siempre, han salido muchos caminos para tenerlos a partir del medio de PRO; hoy quiero mostrarles el que en mi concepto es el más fácil y limpio de todos.

*Nota: Es muy probable que este post tenga validez solo para este caso, pues a futuro seguramente continuarán liberando la ISO de Enterprise aparte.

Requerimientos

1. Debemos tener instalado el ADK en un equipo. Aunque no lo he probado, no creo que haya problema en tener el de Windows 8.1, pero recomiendo hacerlo de una vez con el ADK para Windows 10 que se encuentra disponible aquí:
Download the Windows ADK for Windows 10 Technical Preview

En el momento de instalación, basta con seleccionar Deployment Tools para tener lo que necesitamos en el artículo:

2015-03-27_10-19-58

2. Descargar el medio de instalación de Windows 10 Technical Preview, build 10041. Lo pueden bajar desde sitio oficial de Microsoft:
http://windows.microsoft.com/en-us/windows/preview-iso-update-1503

Todo el procedimiento siguiente lo haré desde un equipo que ya tiene instalado Windows 10.

Actualizando PRO a Enterprise

Lo primero que debemos hacer es montar la imagen .ISO para extraer los archivos de instalación y poder manipularlos. Para esto, procedemos con estos pasos:

1. Hacemos clic derecho sobre la imagen ISO descargada y seleccionamos Montar:

2015-03-27_10-34-42

2. Una vez montado en la unidad virtual, identificamos la letra que Windows le asignó:

2015-03-27_10-35-54

En mi caso como ven, le asignó la letra G:

3. Hacemos clic derecho en el botón de Inicio –8/8.1/10- y seleccionamos Símbolo del sistema (Administrador):

2015-03-27_10-38-28

4. Desde el símbolo del sistema, ejecutamos:

mkdir C:10041

2015-03-27_10-40-35

Esto nos creará una carpeta llamada 10041 en la raíz del disco duro.

5. Luego ejecutamos:

xcopy <UnidadWin>*.* /s/e/f C:10041

Donde <UnidadWin> corresponde a la letra asignada por Windows al medio en el momento de montar la imagen ISO. En mi caso, que es la G, el comando sería:

xcopy G:*.* /s/e/f C:10041

2015-03-27_10-42-56

Todos los archivos de instalación se copiarán a la carpeta 10041 creada previamente. Es posible que tarde varios minutos, dependiendo de la velocidad de lectura y escritura de nuestro disco.

6. Clic en el botón de Inicio, buscamos Deployment and Imaging Tools Environment, clic derecho y Ejecutar como administrador (Run as administrator):

2015-03-27_10-51-57

*Nota: En Windows 8.1 obviamente la interfaz es diferente, pero el nombre y procedimiento es el mismo.

7. Desde la consola, ejecutamos:

mkdir C:Montar

2015-03-27_18-02-45

Luego:

Dism /Mount-Image /ImageFile:C:10041sourcesinstall.wim /index:1 /MountDir:C:Montar

2015-03-27_11-18-59

Ahora, aquí es donde está el secreto de todo; desde la consola pueden ejecutar:

Dism /Image:C:Montar /Get-TargetEditions

Este comando me dice a qué ediciones puede ser actualizada la edición actual. Esto es lo que mostrará:

2015-03-27_11-28-11

Como ven, a parte de Professional con Windows Media Center y Education –Ni idea-, puede ser actualizada a Enterprise. ¡Justo la que necesitamos!

8. Procedemos entonces a ejecutar:

Dism /Image:C:Montar /Set-Edition:Enterprise

2015-03-27_11-33-08

9. Si no hay errores, procedemos a desmontar nuestra imagen ejecutando:

Dism /Unmoun-Wim /MountDir:C:Montar /Commit

2015-03-27_11-37-00

10. Debido a que el medio es de PRO, el serial que lee para la activación obviamente no le funciona a Enterprise. Dicho esto, es necesario cambiar el serial que lee el asistente de instalación; para esto, vamos hasta la ruta: C:10041sources y hacemos doble clic en el archivo pid.txt. Este es el contenido:

2015-03-27_17-30-05

Borramos el serial que tiene como contenido la variable de value y lo remplazamos por este:

PBHCJ-Q2NYD-2PX34-T2TD6-233PK

Nos debe quedar así:

2015-03-27_17-31-56

*Nota: Estoy utilizando el mismo serial de Enterprise que tenía la build 9926.

11. Nuestro último paso, es crear la imagen ISO que servirá para instalar Windows 10 tanto en equipos EFI como en basados en BIOS ejecutando:

Oscdimg -bootdata:2#p0,e,bC:10041bootetfsboot.com#pEF,e,bC:10041efimicrosoftbootefisys.bin -u1 -udfver102 C:10041 C:10041Win10_10041_ENT.iso

2015-03-27_11-44-06

En la carpeta C:10041 nos debe haber creado la imagen .ISO de instalación:

2015-03-27_11-45-21

¡Eso es todo! Solo queda instalar y comprobar que efectivamente es Enterprise:

2015-03-27_18-08-04

Espero sea de utilidad.

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

Saludos.

Checho

El estado de “Cannot connect to virtual machine configuration storage” en Hyper-V al intentar abrir una VM, Process Monitor y su solución

Desde ya hace varios años utilizo VMWare o Hyper-V como gestores de máquinas virtuales; normalmente varío por un tiempo dependiendo de qué quiero hacer, ya que cada uno tiene características notables. Actualmente tengo Windows 10 Enterprise Preview 9926 instalado en mi equipo principal, y debido a que VMWare 11 tiene unos problemas de compatibilidad con estas compilaciones, estoy utilizando Hyper-V.

Como tengo las máquinas virtuales en un disco externo USB, es normal que lo quite algunas veces para llevármelo, pero generalmente lo vuelvo a conectar y no tengo problema para iniciar mis entornos virtualizados. El siguiente post nace de un error después desconectar y reconectar el disco duro e intentar iniciar mis equipos virtuales. Como siempre, intentaré detallarlo un poco para aprender en el camino:

El error

El disco extraíble lo quité porque debía hacer unos procedimientos a un disco ajeno al mío, y no quería llegar a confundirme con tantas particiones. Windows asigna las letras de unidad dinámicamente, siguiendo un orden alfabético, pero entregando de acuerdo a la disponibilidad de letras de unidad.

Después de terminar con el disco ajeno y volver a conectar mi disco, tuve que decirle a Windows 10 desde el Administrador de Discos que asignara letra a las particiones, pero después de abrir Hyper-V, me encontré con esto:

2015-02-22_10-23-22

El estado de todas las máquinas era Saved-Critical, no podía ver detalles como memoria, CPU asignada y además, el estatus que recibía de cada una decía:

“Cannot connect to virtual machine configuration storage”.

Al darle doble clic a mi primera VM llamada DC-MED, pude abrir la ventana de conexión, pero con el mismo mensaje de configuration storage en la parte inferior:

2015-02-22_10-21-42

Al intentar iniciar la máquina, con esperanzas de que arrancara, recibí otro mensaje más que no me permitía continuar:

2015-02-22_10-20-42

The application encountered an error while attempting to change the state of DC-MED

DC-MED failed to restore virtual machine state.”

Hyper-V no me permitía hacer ninguna otra operación como reiniciar, apagar, volver a un punto anterior, etc, así que estaba completamente confundido.

La causa

Lo primero que hice fue correr Process Monitor, reproducir el mensaje y sobre el resultado, buscar qué referencias existían a el nombre para mostrar de DC-MED; esto fue lo primero –y lo único- que encontré:

2015-02-22_12-09-07

Si hacen clic en la captura y la ven al detalle, se está ejecutando el proceso de VMConnect.exe con una línea de comandos que identifica el nombre del host, nombre para mostrar de la máquina virtual, el GUID y el conteo de instancias que se están corriendo.

El resultado de esta operación se muestra como satisfactorio, así que no había problemas con lo que necesitaba Hyper-V para lanzar las máquinas virtuales. ¿Qué faltaba entonces?

Recordé que siempre que dejo alguna máquina virtual prendida y ejecutándose, sin importar el reinicio o apagado del equipo, están disponibles al entrar a la consola de administración de Hyper-V. Esto me llevaba a pensar que debía existir algún proceso recién se inicia sesión; la forma de averiguarlo, era habilitando la característica de Boot Logging incluida en Process Monitor.

Después de habilitarla, reiniciar la máquina y correr Process Monitor para guardar el log recopilado por el controlador, busqué las operaciones que existieran sobre el GUID correspondiente a mi virtual DC-MED y esto fue lo que encontré:

2015-02-22_18-56-59

Básicamente, el proceso vmms.exe, correspondiente a Virtual Machine Management Service, estaba abriendo un archivo con nombre BD2D3238-2536-4131-9376-383B8959D52A.vmcx, ubicado en la ruta:
C:ProgramDataMicrosoftWindowsHyper-VVirtual Machines Cache

Noten que la disposición era para abrir el archivo, pero el acceso deseado (Desired Access), contenía requerimientos para leer, listar, escribir, agregar, entre otros… Esto quiere decir que leía algo del archivo para poder inicializar las máquinas virtuales y, al llamarse la carpeta caché, podía indicar que utilizaba esta información contenida en el archivo para arrancar más rápido los equipos. Técnicamente además, la extensión .vmcx hace referencia a archivos de configuración para cada VM, así que naturalmente estaban todos .vmcx de las virtuales creadas en ese mismo directorio.

Procedí entonces a realizar una copia de ese archivo en mi escritorio y a abrirlo con el bloc de notas de Windows. No es mucho lo que pudiera leer, pero solo necesité de la siguiente porción de texto contenida:

2015-02-22_10-30-54

El archivo tenía en sus datos el directorio donde efectivamente se encontraba el disco duro virtual de mi virtual (2K12R2-AD.vhdx), y además la letra de unidad desde donde había podido acceder por última vez; en mi caso, referenciaba a la letra E:.

Al verificar en mi Explorador de Archivos, me di cuenta del pequeño problema:

2015-02-22_10-37-36

La letra de unidad que me había asignado Windows la última vez que conecté mi disco externo, había sido la F y no la E que buscaba el archivo de configuración ubicado en la carpeta Caché de las máquinas virtuales. ¡Ahí estaba el problema! Hyper-V tenía en su memoria una ubicación diferente de cada disco virtual y al no encontrarla, se quejaba y le era imposible inicializar los equipos nuevamente.

La solución

Aunque no lo hice, se supone que cambiando la letra de unidad en el archivo de configuración a la F y reiniciando, el problema se habría corregido, puesto que encontraría todos los recursos necesarios; sin embargo, tendría que modificar cada .vmcx y no lo consideraba muy práctico.

La forma más fácil para solventar el tema, era volviendo a asignar la letra E a la partición que contenía los discos virtuales; para hacer esto de forma gráfica, hay que seguir estos pasos:

1. Hacer clic derecho en el botón de Inicio y seleccionar Administrador de Discos:

2015-02-23_7-38-01

2. En la consola de Administración de discos, hacer clic derecho sobre la partición o disco que se desea modificar y seleccionar Cambiar rutas y letra de unidad:

2015-02-23_7-39-52

3. En la ventana para cambiar la letra y ruta, clic en el botón Cambiar, y en Asignar la siguiente letra de unidad, poner la que debe corresponder; para mi caso, tenía que ser la letra E. Clic en Aceptar (OK):

2015-02-23_7-42-10

Windows advertirá sobre el peligro de cambiar la letra para programas que ya la estén referenciando y la necesidad de reiniciar:

2015-02-23_7-45-27

2015-02-23_7-47-32

Al aceptar ambos mensajes, veremos el cambio en el Administrador de Discos:

2015-02-23_7-48-16

4. Reiniciar el equipo.

Cuando hice los pasos anteriores y ejecuté Hyper-V después del reinicio, mis máquinas estaban de vuelta y listas para utilizar:

2015-02-23_7-54-48

¡Problema solucionado!

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

Saludos.

Checho

Crear imagen maestra de Windows 8.1 manualmente

Hace ya un par de años aproximadamente, escribí un artículo donde describí cómo crear una imagen maestra de Windows 8, pero teniendo presente además un perfil predeterminado. Debido a que el tema de la imagen maestra por ese artículo y algunos otros que tuve con Windows 7, y gran cantidad de dudas que muy amablemente me han hecho llegar, he decidido escribir este post donde me enfocaré única y exclusivamente al proceso de la imagen maestra, sin tener en cuenta otros aspectos.

El artículo estará enfocado a Windows 8.1, y trataré de detallarlo lo que más pueda, con el fin de aclarar dudas y sea fácil de seguir; como dato adicional, utilizaré nombres y rutas específicas, que pueden cambiar a preferencia si se sienten cómodos.

Requerimientos:

1) Necesitamos DOS máquinas que pueden ser físicas o virtuales. los nombres que utilizaré para diferenciarlas durante todo este post, será: WIN811 y WINP2; a continuación detallaré para qué es necesario cada una:

WIN811: Esta máquina –virtual o física-, tendrá instalado Windows con todo lo que deseen integrar en la imagen maestra; es decir, actualizaciones descargadas y aplicaciones como Office, por ejemplo (Ver captura después del párrafo). Del equipo WIN811, es donde se hará el proceso de resellado y captura de imagen. Como dije anteriormente, cada quien puede tener nombre diferente, pues yo solo lo hago para que puedan diferenciar.

2015-01-24_12-52-18

WINP2: En esta máquina –virtual o física-, es donde se instalará la última versión oficial del ADK (Ver: “Instalación del ADK”), para generar el Windows PE que se utilizará con el fin de capturar la imagen maestra en WIN811, y se creará después la imagen .ISO de instalación.

Deben descargar en el equipo WINP2 el paquete de instalación del ADK desde la web oficial de Microsoft: http://www.microsoft.com/es-ES/download/details.aspx?id=39982

*Nota: Personalmente, recomiendo que los equipos sean virtuales, puesto que se pueden recuperar más fácil si hay algún error y la imagen será mucho más limpia y neutra. El equipo donde se vaya a instalar el ADK es más viable que sea físico, pues sólo se utilizará para hacer las operaciones correspondientes para crear la imagen.

2) Los archivos de instalación que vienen en el medio o imagen .ISO de Windows 8.1. Técnicamente, en caso de que no los tengan, se podría utilizar los que trae un medio de evaluación disponible en TechNet para descargar:
http://www.microsoft.com/en-us/evalcenter/evaluate-windows-8-1-enterprise

3) En el equipo WINP2, crear una carpeta en la unidad C: llamada: W81. Allí debemos copiar los archivos de instalación del medio descargado o adquirido en el paso anterior; para esto, insertamos el DVD o montamos la imagen .ISO y posteriormente copiamos desde la consola todos los archivos. (Ver: “Copiando archivos de instalación”).

4) Mucha paciencia: Cada proceso puede tardar un buen rato, todo depende de los recursos que tengan las máquinas donde estemos trabajando.

Instalación del ADK (WINP2):

En el equipo WINP2 donde se descargó el ADK, ejecutar el adksetup.exe, y navegar en las páginas del asistente hasta llegar a Seleccione las características que desea incluir en la instalación; allí debemos escoger lo siguiente:

– Herramientas de implementación.
– Entorno de preinstalación de Windows (Windows PE).
– Herramienta de migración de estado de usuario (USMT) – Opcional.

2015-01-24_14-58-50

Clic en el botón Instalar para iniciar la instalación de los componentes.

Copiando archivos de instalación (WINP2):

Cuando hayamos insertado el medio de instalación, o montado la imagen .ISO de Windows 8.1 en el equipo WINP2, hacemos clic derecho en el botón de Inicio y seleccionamos: Símbolo del sistema (administrador).

En la consola, identificamos primero la unidad donde están los archivos, y ejecutamos:

xcopy <UnidadWin>*.* /s/e/f C:W81

Donde <UnidadWin> corresponde a la unidad en la que están los archivos de instalación; por ejemplo, si es la D, el comando sería:

xcopy D:*.* /s/e/f C:W81

2015-01-24_15-40-35

La carpeta debería verse así:

2015-01-24_21-51-22

Habilitando cuenta de administrador integrado (WIN811)

Es recomendable resellar el equipo con la cuenta de administrador integrado y eliminando todas las otras cuentas existentes; de esta forma, la imagen quedará limpia de cuentas innecesarias.

En WIN811, clic derecho en el botón de Inicio y Símbolo del sistema (administrador).

En la consola, ejecutamos:

Net User Administrador /Active:Yes

2015-01-25_9-35-28

Cerramos sesión con ese usuario e iniciamos sesión con el Administrador integrado.

Nuevamente, clic derecho en el botón de Inicio y Símbolo del sistema (administrador).

No es obligatorio, pero considero necesario eliminar todas las demás cuentas locales para que en cada instalación solo exista la que el usuario cree y así la imagen esté lo más limpia posible.

Pueden eliminar las cuentas desde el Panel de Control, pero si quieren hacerlo rápido, basta con saber el nombre de las que existen y proceder a quitarlas desde la consola. Por ejemplo, para mi caso que tengo una cuenta llamada Checho y otra Andy, los comandos serían:

Net User Checho /DELETE

2015-01-25_9-55-22

Net User Andy /DELETE

2015-01-25_9-55-50

Dejamos la sesión de Administrador activa para las próximas operaciones en WIN811.

Creando entorno de preinstalación (Windows PE) – WINP2

En el equipo WINP2, es decir, en donde se instaló el ADK, buscamos desde la Pantalla de Inicio Entorno de herramientas de implementación y creación de imágenes, clic derecho y Ejecutar como administrador:

2015-01-24_16-06-12

Desde la consola, vamos a crear un Windows PE de acuerdo a nuestra arquitectura:

Si van a capturar un equipo de 32 bits, ejecutan:

copype x86 C:WinPE

2015-01-24_22-02-30

Si van a capturar un equipo de 64 bits, ejecutan:

copype AMD64 C:WinPE64

2015-01-24_22-09-02

Para este artículo, yo voy a capturar un equipo de 64 bits, así que me aplica el segundo comando.

Después de copiar todo, deben tener una carpeta llamada WinPE o WinPE64 según sea el caso en la raíz del disco local:

2015-01-24_22-10-12

*Nota: En lo que resta del artículo, trabajaré refiriéndome a WinPE64 porque fue el que creé, así que ahí tendrás que modificar en caso de que hayan creado el de 32 bits.

Generar imagen ISO

Abrimos nuevamente el Entorno de herramientas de implementación y creación de imágenes –si es que habíamos cerrado la consola- y ejecutamos:

MakeWinPEMedia /ISO <DirWPE> C:WinPE64.iso

Donde <DirWPE> se refiere al directorio del Windows PE creado; en mi caso, como fue el de 64 bits, sería:

MakeWinPEMedia /ISO C:WinPE64 C:WinPE64.iso

2015-01-24_22-18-33

Nos debe quedar una imagen creada llamada: WinPE64.iso en la raíz del disco:

2015-01-24_22-23-17

Esa es la imagen que utilizaremos para cargar el equipo WIN811, así que la debemos grabar en algún medio DVD/USB si es que estamos sobre equipos físicos, o pasarla en imagen .ISO en caso de que estemos trabajando sobre máquinas virtuales.

Resellando equipo – WIN811

En el equipo WIN811, que es donde está instalado Windows, Office, las actualizaciones y todo lo que deseamos tener en la imagen maestra, vamos a proceder a resellar con el fin de limpiar todas las asociaciones propias de hardware, el SID y dejar listo para capturar. Para resellar el equipo, hacemos lo siguiente:

1. Cerramos todas las aplicaciones que estén corriendo.

2. Clic derecho en el botón de Inicio y seleccionamos Símbolo del sistema (administrador).

3. En la consola, ejecutamos:

cd sysprep

sysprep /OOBE /Generalize /Shutdown

2015-01-25_10-00-17

El proceso de resellado iniciará y debemos dejar el equipo tranquilo hasta que termine y se apague automáticamente:

2015-01-25_10-05-00

*Nota: Si por alguna razón cerramos, o el Sysprep falla, es poco probable que se pueda arreglar el problema, así que normalmente hay que restaurar el equipo a un estado antes de correr el resellado.

Capturando el equipo – WIN811

Una vez apagado el equipo, debemos iniciarlo pero desde el DVD o USB con el Windows PE creado en los pasos anteriores desde el WINP2. Si estamos en máquinas físicas, hay que insertar el medio (DVD o USB), iniciar el menú de arranque de acuerdo al modelo, o bien entrar en la BIOS y escoger cuál debe ser el primer dispositivo en iniciar.

Para Hyper-V

Si estamos en máquinas virtuales, específicamente en Hyper-V, podemos simplemente cargar el equipo WIN811 con la imagen ISO que creamos en el WINP. En Hyper-V, basta con ir al menú Medio > Unidad DVD > Insertar disco…

2015-01-26_14-32-08

En la ventana de abrir, escogemos el Windows PE (WINPE64.iso) copiado de WINP2 y aceptamos:

2015-01-26_14-34-31

Luego, clic en el menú Archivo > Configuraciones.

Nos paramos en Firmware y nos aseguramos que esté arrancando desde DVD:

2015-01-26_14-36-15

Al iniciar el equipo, nos debe pedir presionar tecla para arrancar desde el medio –si fue con el DVD- y estaremos frente a una consola dentro del ambiente de preinstalación:

2015-01-26_14-38-39

Antes de capturar, es necesario identificar con exactitud qué letra tiene la partición de Windows, pues no siempre mantiene la C. Para esto, ejecutamos:

Diskpart

List volume

Esto nos listará todas las particiones y su detalle, para que cada uno referencie el volumen donde está instalado Windows:

2015-01-26_14-41-40

Tal cual ven en la imagen, el volumen , con letra C en mi caso, es la partición donde sé que está instalado el sistema operativo. Con esto, solo ejecutamos Exit para salir.

2015-01-26_14-46-25

*Nota: Tengan presente que la letra de unidad puede variar en cada caso, así que la deben identificar antes de continuar.

Para finalmente capturar la imagen, ejecutamos:

Dism /Capture-Image /ImageFile:<UnidadDes>:install.wim /CaptureDir:<UnidadOr>: /Name:"Windows 8.1 PRO + Office" /Description:"Windows 8.1 PRO + Office"

Donde <UnidadDes> corresponde a la partición, ruta de red o destino que va a tener nuestra imagen capturada y <UnidadOr> es la letra de la unidad que vamos a capturar. Por ejemplo, en mi caso que la quiero guardar en la misma unidad C del WIN811 y que es esa misma unidad la que voy a capturar, el comando sería:

Dism /Capture-Image /ImageFile:C:install.wim /CaptureDir:C: /Name:"Windows 8.1 PRO + Office" /Description:"Windows 8.1 PRO + Office"

2015-01-26_14-55-25

*Nota: Todo se escribe en una sola línea.

Cuando llegue al 100%, cerramos la consola y dejamos que el equipo –en mi caso WIN811- se reinicie completamente, ingresando de nuevos los datos del primer arranque ocasionados por haber resellado el equipo. Una vez iniciada la sesión, debe estar nuestra imagen capturada con el nombre de install.wim:

2015-01-26_15-22-49

Generando imagen ISO – WINP2

Desde el equipo WIN811, copiamos la imagen capturada (install.wim) al equipo WINP2 y luego la remplazamos por la del medio original en C:W81Sources

2015-01-26_15-36-05

En la carpeta C:W81Sources, nos debe quedar entonces el install.wim recién capturado.

Para crear la imagen .ISO, buscamos Entorno de herramientas de implementación y creación de imágenes, clic derecho y Ejecutar como administrador:

 2015-01-24_16-06-12

Desde la consola, ejecutamos en una sola línea:

Oscdimg -bootdata:2#p0,e,bC:W81bootEtfsboot.com#pEF,e,bC:W81efimicrosoftbootEfisys.bin -u1 -udfver102 C:W81 C:Win81PRO_with_Office.iso

2015-01-26_15-50-48

*Nota: Recomiendo hacer clic en la imagen para verla en tamaño real y escribir bien todo.

Lo anterior nos creará una imagen .ISO lista para instalarse en equipos con Legacy BIOS y con UEFI BIOS:

2015-01-26_15-56-28

Probando instalación – Cualquier equipo

Naturalmente, el paso final es grabar la imagen .ISO en un DVD o preparar un dispositivo USB para hacer la instalación y ver que no haya errores durante el despliegue:

2015-01-26_16-07-00

Traté de que este post estuviera lo más detallado posible, así que espero sea de utilidad.

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

Saludos.

Checho

El mensaje de «Error al cargar la secuencia de comandos D:bin.doc» al iniciar sesión, Process Monitor y su solución

El caso que pasaré a describir, ha sido uno de los más duros que he logrado resolver, y me gustaría compartirlo aquí, porque es uno de los que empieza a tener mucha frecuencia en los foros de soporte de Microsoft. Como suelo hacerlo, mostraré el problema, la posible causa según toda la investigación hecha y su solución.

El problema

Todo nació en un hilo de los foros de Windows 7 en Microsoft Community; aunque era el mismo problema, la solución resultó ser bastante diferente.

Básicamente, cada que el usuario iniciaba sesión en su Windows 7, el siguiente mensaje de error aparecía:

2015-01-18_13-25-59

«Error al cargar la secuencia de comandos “D:bin.doc“ El dispositivo no está listo

Inglés: «Loading script “D:bin.doc” failed (The device is not ready.)»

Después de hacer clic en el botón Aceptar, el mensaje desaparecía y no habían más comportamientos extraños en el sistema operativo, por lo menos hasta el siguiente reinicio o cierre de sesión.

El problema solo afectaba a ese usuario en particular, y se volvía bastante molesto tener que aceptar el mismo mensaje cada que iniciaba sesión.

La causa

La recomendación que doy siempre en este tipo de casos, es identificar todo lo que esté iniciando con el usuario, debido a que es muy común que aplicaciones dejen basura en el sistema y Windows intente arrancar algo mientras el usuario ingresa.

Para poder ver esto y a causa de que el Administrador de Tareas de Windows sirve poco o nada, le pido al usuario que utilice Autoruns de SysInternals para poder gestionar correctamente lo que verdaderamente está arrancando. Como no es muy normal que un usuario que pide ayuda sepa utilizar este tipo de herramientas, hago que cargue el log, lo guarde y después de lo envíe.

Volviendo al caso y una vez obtenido el log de Autoruns, pensé que iba a encontrar alguna entrada en amarillo en la pestaña de Logon o de Scheduled Tasks que tuviera algún nombre extraño y buscara el archivo bin.doc, pero no fue así.

Era muy extraño que Autoruns no hubiese podido identificar la entrada, pero como no encontré nada, procedí a pedirle el log de Process Monitor, utilizando la característica de Boot logging; de esta forma, podría monitorear lo que sucedía en Windows mientras el usuario iniciaba sesión, así que necesariamente tendría que ver algún rastro de ese mensaje.

*Nota: Boot Logging, como lo he mostrado en otras entradas, permite decirle a Process Monitor que ubique su controlador antes que cualquier otro cuando está prendiendo el equipo, así que puede recolectar todo lo que sucede en el proceso de encendido de Windows y ver cosas que sólo ocurren mientras se ingresa desde la pantalla de inicio de sesión. Para activar esta característica, hay que ir al menú Options > Enable Boot Logging.

Cuando tuve el log de Process Monitor, busqué inmediatamente por el “bin.doc” y en toda la traza que recolectó, encontré solo tres entradas al respecto:

2015-01-20_20-53-12

Básicamente, el proceso de Explorer.exe de Windows, estaba creando, o más bien instanciando el proceso de wcript.exe y después, en la segunda entrada, iniciaba Windows iniciaba ese proceso directamente.

Al entrar en las propiedades del primer evento que muestra la captura haciendo doble clic en la entrada desde Process Monitor, me encontraba con que el Explorer.exe además de iniciar el proceso wscript.exe, le mandaba unos parámetros específicos donde incluía ejecutar el archivo: bin.doc.

2015-01-20_20-58-28

Los parámetros, como lo ven en la captura, eran:

“C:WindowsSystem32wscript.exe” /e:VBScript.Encode D:bin.doc

La primera parte llamaba el proceso de wscript.exe y luego intentaba ejecutar el script. Debido a que ese archivo no existía en el equipo del usuario afectado, la ejecución fallaba y Windows mostraba el mensaje de error de Windows Script Host.

Si ejecutaba esa línea en cualquier equipo, recibía un mensaje muy similar al del error:

2015-01-20_21-09-15

Con eso pude comprobar que era la creación y ejecución de ese proceso con la línea extraña la que generaba el mensaje de error; sin embargo, esto no me decía la razón por la cual el proceso de Explorer.exe resultaba llamando a wscript.exe y menos aún, por qué le enviaba ese parámetro.

Después de darle vuelta un par de días, decidí mirar en detalle todos los eventos que ocurrían antes de que se instanciara el proceso de wscript.exe, y luego de varias líneas, encontré algo de lo que no me había percatado anteriormente:

2015-01-20_21-13-29

Como ven en la captura –si hacen clic en ella para el tamaño real-, Windows estaba leyendo un curioso archivo llamado Start.lnk, ubicado en la ruta:

C:UsersUreAppDataRoamingMicrosoftWindowsStart MenuProgramsStartup

Lo interesante aquí, es que todo lo que se encuentre en la carpeta Startup, se ejecutará automáticamente en cada inicio de sesión y el nombre del archivo no parecía muy normal.

Decidí entonces pedirle al usuario que me navegara hasta esa ruta y me enviara el archivo sin eliminarlo y al ingresar a sus propiedades –debido a que era un acceso directo-, me encontré con una grata sorpresa:

2015-01-20_21-19-13

El acceso directo, ubicado en esa carpeta, estaba lanzando la ejecución del proceso wscript.exe, con sus respectivos parámetros.

Ahora, ¿Por qué Process Monitor identificaba a Explorer.exe como el proceso que llamaba a wscript.exe para hacer la ejecución? Pues bien, Explorer.exe es el primer proceso que carga al iniciar sesión y es el proceso padre que ejecuta todo lo que esté en los respectivos directorios; debido a que Start.lnk era un archivo dentro de una carpeta predestinada para lanzarse en cada inicio, era Explorer.exe el responsable de esta ejecución.

Ya sabía dónde estaba ubicado el archivo responsable, por qué iniciaba con el usuario y por qué se ligaba a un proceso del sistema operativo. Mi último paso, era solucionarlo.

La solución

Para solventar el problema, bastó lo siguiente:

Primero que todo, le pedí al usuario navegar hasta la ruta:

C:UsuariosUreAppDataRoamingMicrosoftWindowsMenú inicioProgramasInicio

*Nota: Si tienen el mismo problema, la ruta será igual, pero variará el nombre de usuario.

Segundo, que hiciera clic derecho sobre el archivo de Start.lnk y Eliminar.

*Nota: Es probable que no siempre tenga el mismo nombre, pero casi siempre será un acceso directo.

Tercero, le pedí reiniciar el sistema y después de esto, el mensaje de error se había ido.

Notas finales

La razón por la que Autoruns no muestra este tipo de entradas, es porque las considera como de Windows al llamar ejecutables conocidos y este tipo de entradas están ocultas de forma predeterminada en Autoruns. Basta ir al menú Options > Filter Options y quitar la selección sobre: Hide Microsoft entries y Hide Windows entries.

2015-01-20_22-03-51

Por otro lado, me di cuenta después que el archivo se habría podido identificar desde Process Explorer, accediendo a las propiedades del Windows Script Host mientras estuviera en ejecución:

2015-01-20_21-59-11

Espero haber sido de utilidad.

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

Saludos.

Checho

Mostrar todos los usuarios disponibles antes de iniciar sesión en Windows 8/8.1

Uno de los cambios pequeños que tuvo el comportamiento de inicio de sesión en Windows 8/8.1, es que siempre intentará arrancar con el último usuario que estuvo activo en el sistema; aunque puede ser útil si solo tenemos un usuario, no es tan entretenido si es un equipo compartido en el que cada determinado tiempo un nuevo usuario requiere iniciar sesión.

La pregunta del cómo decirle a Windows que muestre todos los usuarios antes de iniciar sesión, tiene cierta frecuencia en los foros oficiales de Microsoft Community así que después de indagar un poco al respecto, decidí documentar el procedimiento paso a paso para que en cada inicio de sesión se deba escoger el usuario y el sistema operativo no lo haga de forma automática.

El objetivo del post, es ver el inicio así:

2015-01-07_11-33-12

Como ven, la idea es siempre poder escoger el usuario antes de ingresar las credenciales.

Cada vez que Windows inicia, o se va a la pantalla de inicio de sesión cerrando o bloqueando sesión, el sistema operativo busca el estado de un valor llamado Enabled en la clave:
HKLMSOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUIUserSwitch

Process Monitor puede dar fe de ello:

2015-01-07_11-21-41

Si el valor Enabled está habilitado, es decir, tiene uno como contenido, Windows siempre mostrará todos los usuarios antes de iniciar sesión, pero normalmente este valor está en cero, o sea deshabilitado:

2015-01-07_11-29-03

Normalmente bastaría con habilitarlo y listo, pero en este caso, aunque le pongamos el contenido de de uno, se volverá a cambiar a cero en cada inicio de sesión. ¡Ahí el problema!

Si bien se podrían editar los permisos para prohibirle al usuario SYSTEM, que es responsable, se generarían problemas después para que Windows entienda otros cambios que se deben hacer sobre la clave de registro.

Lo que haremos a continuación, será automatizar el cambio del contenido de la clave, así en cada inicio de sesión tendrá el comportamiento esperado.

Automatizando el cambio de clave en Registro

Lo primero que haremos, será abrir un blog de notas en limpio y escribir el siguiente comando:

REG ADD HKLMSOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUIUserSwitch /v Enabled /t REG_DWORD /d 1 /f

Todo es una sola línea:

2015-01-07_11-41-39

Lo que hace el comando es básicamente escribir uno en el valor Enabled.

A continuación, clic en Archivo > Guardar como y lo ponemos en una ubicación donde podamos escribir como en el Escritorio. El nombre será: EnaUsr.bat

2015-01-07_11-45-20

Después de esto, movemos el archivo manualmente al disco local C:

Debería quedar entonces en C:EnaUsr.bat

2015-01-07_11-48-32

Ese archivo siempre pondrá el contenido de uno sobre el valor cada que se llame; ahora necesitamos una forma de poder llamarlo siempre y que funcione sin mayor inconveniente. La forma más fácil para hacer esto, es a través de una Tarea Programada.

Antes que nada, es necesario que en el Registro de Windows, el cambio de contenido a uno esté por lo menos la primera vez antes de proceder al Programador de Tareas, así que hacemos clic derecho sobre EnaUsr.bat y seleccionamos Ejecutar como administrador:

2015-01-07_12-28-24

Para verificar, abrimos el Registro de Windows desde la Pantalla de Inicio (Regedit.exe) y navegamos hasta:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUIUserSwitch

El valor de Enabled, debe estar en uno:

2015-01-07_12-30-46

Hecho esto, procedemos a crear la tarea:

Creando la Tarea Programada

Desde la Pantalla de Inicio, escribimos Programar tareas y lo ejecutamos:

2015-01-07_11-55-08

En la ventana de Programar tareas, clic en Crear tarea en el panel derecho:

2015-01-07_11-56-33

En la pestaña de General, escribimos un nombre, por ejemplo: Mostrar usuarios y luego una descripción que explique el propósito de esta tarea:

2015-01-07_12-00-29

Después, en la parte inferior de la misma pestaña, cambiamos a Windows 8.1 el Configurar para:

2015-01-07_12-03-03

Como necesitamos que esta tarea se ejecute independiente del usuario que inicie sesión, es necesario decirle al Programador de Tareas que siempre utilice el usuario de SYSTEM; para esto, hacemos clic en el botón Cambiar usuario o grupo en la misma pestaña de General, copiamos SYSTEM y clic en Aceptar:

2015-01-07_12-08-37

La pestaña de General debería verse así:

2015-01-07_12-10-34

Pasamos a la pestaña de Desencadenadores y clic en el botón Nuevo:

2015-01-07_12-13-44

Al lado de Iniciar la tarea, escogemos Al iniciar la sesión y clic en Aceptar:

2015-01-07_12-17-14

Pasamos a la pestaña de Acciones y hacemos clic en el botón Nueva:

2015-01-07_12-19-03

En la ventana de Nueva acción, dejamos la opción de Iniciar un programa que está de forma predeterminada, hacemos clic en el botón Examinar, buscamos nuestro archivo por lotes ubicado en C:EnaUsr.bat y clic en Aceptar:

2015-01-07_12-20-41

¡Todo listo! De vuelta en la ventana de Crear tarea, hacemos clic en Aceptar para terminar y cerrar.

En la ventana de Programador de tareas, al pararnos en el nodo de Biblioteca del Programador de tareas, deberíamos poder ver nuestra tarea creada en el panel central:

2015-01-07_12-23-58

Cerramos el Programador de tareas y habremos terminado. Lo único que queda, es reiniciar el equipo por lo menos dos veces y ver que en efecto, siempre debamos escoger nuestro usuario de la lista disponible sin importar con quién iniciemos y reiniciemos:

2015-01-07_12-34-53

Espero haber sido claro y que sea de utilidad.

Saludos.

Checho