Cómo detectar remotamente Windows ha completado la configuración del parche después de reiniciar

10

Estamos planeando automatizar la creación de máquinas virtuales para nuestra infraestructura de compilación para que podamos:

  1. Escale los recursos de compilación según la demanda, por ejemplo, agregando más agentes de compilación cuando sea necesario y eliminándolos cuando no sea necesario
  2. Recree todo o parte del entorno de construcción si / cuando las máquinas mueren
  3. Duplicar el entorno de compilación cuando necesitamos una configuración de prueba

Uno de los pasos en este proceso es automatizar la creación de las imágenes base de VM (en nuestro caso, usando Hyper-V). Para eso tenemos un script que:

  1. Crea un nuevo VHDX desde ISO con el script Convert-WindowsImage . Actualmente estamos usando Windows 2012R2, pero buscaremos comenzar con 2016 tan pronto como esté disponible.
  2. Agrega un script desatendido al nuevo VHDX con toda la configuración básica que necesitamos
  3. Actualiza el VHDX con los últimos parches de Windows utilizando el script Apply-WindowsUpdate
  4. Crea una nueva máquina virtual Hyper-V basada en VHDX y la inicia
  5. Espera a que la VM arranque y espera que el servicio WinRM esté listo para aceptar conexiones remotas
  6. Espera a que Windows complete la configuración inicial y la configuración de los nuevos parches
  7. Aplica cualquier parche adicional
  8. Reinicia para completar la configuración de los últimos parches
  9. Espera a que Windows complete la configuración de los parches
  10. Empuja un script sysprep a la máquina e invoca ese script. Esto ejecuta sysprep y luego apaga la máquina
  11. Elimina la VM pero mantiene el VHDX
  12. Elimina los archivos sysprep y desatendido del VHDX y luego compacta el VHDX
  13. Mueve VHDX a la ubicación de la plantilla y marca como solo lectura

El problema que estamos experimentando está en los pasos 6 y 9. Idealmente, esperamos que se complete toda la configuración antes de reiniciar / apagar la máquina, pero no parece haber una forma de detectar que Windows ha terminado la etapa de configuración.

Al pasar por la interfaz de usuario, es muy claro cuando se realiza cualquiera de los pasos porque la interfaz de usuario de inicio de sesión no aparece hasta que el proceso esté listo. Sin embargo, cuando se utiliza WinRM para conectarse de forma remota a la máquina, esto es menos claro porque WinRM proporciona acceso a la máquina antes de que termine el trabajo de configuración.

Entonces, la pregunta es cuál es la forma más infalible de detectar a través de una conexión remota que Windows ha terminado de configurar actualizaciones, etc. para que podamos reiniciar / apagar la máquina sin causar problemas más adelante.

------ EDITAR -----

Al final, estamos usando una versión modificada de la respuesta de Katherine en que nuestro script también espera windeployy ngencompleta. Dado que eso ngenno se completa hasta mucho después de que el sistema operativo haya terminado de inicializar, eso funciona, y como beneficio adicional, el VHDX final tendrá todo el .NET framework ngen-ed, lo que significa que no tenemos que lidiar con eso cuando creamos nuevos Máquinas virtuales del disco de plantilla. Tanto el script que usamos para crear la plantilla VHDX como los scripts para crear el entorno de prueba local están en github en caso de que alguien esté interesado.

Petrik
fuente

Respuestas:

6

Esto puede sonar como una respuesta extraña, pero ...

Hay un script de PowerShell para verificar si hay actualizaciones disponibles para Nagios . Probablemente podría usar este script o una variante para sus propósitos, sin Nagios.

En cuanto a si están en progreso, verifique si Wuauclt y TrustedInstaller se están ejecutando o no. El consejo de Microsoft sobre actualizaciones en Server Core podría ayudar aquí :

Dependiendo de las actualizaciones que estén instaladas, es posible que deba reiniciar la computadora, aunque el sistema no le notificará al respecto. Para determinar si el proceso de instalación se ha completado, use el Administrador de tareas para verificar que los procesos Wuauclt o Trusted Installer no se estén ejecutando activamente. También puede usar los métodos en la sección "Ver actualizaciones instaladas" para consultar la lista de actualizaciones instaladas.

Probablemente pueda obtener esa información con algo como Get-Process -Computername YourImage TrustedInstaller.exe. Una vez que hayan finalizado los procesos Wuauclt y TrustedInstaller, debería ser seguro reiniciar.

Katherine Villyard
fuente
Ese script resuelve el problema de obtener actualizaciones y detectar si se requiere un reinicio, que es otro problema que debemos resolver, pero el script no trata de esperar a que se complete un reinicio hasta el punto en que la máquina esté lista para trabajar .
Petrik
Comentaste mientras estaba editando. Agregué información sobre cómo detectar ese estado en Server Core, que está cerca de hacerlo de forma remota.
Katherine Villyard
1
Estaba siendo demasiado feliz comentando. Voy a echar un vistazo a la búsqueda de Wuauclt o TrustedInstaller.
Petrik
Estaba siendo un pequeño "hit hit" feliz de mí mismo. :)
Katherine Villyard
1
Este enfoque casi funcionó para mí, excepto que TrustedInstaller y Wuauclt terminan antes de que finalice la inicialización. Después de agregar windeploy y ngen, el script espera a que la máquina complete toda la inicialización (probablemente porque ngen no se completa hasta mucho después de que la máquina haya terminado de inicializarse).
Petrik
3

Cada parche de actualización de Windows escribirá varios eventos en el registro de eventos de instalación.

  • Id. De evento 1: inicio de cambios para el paquete KB ####
  • Id. De evento 4: es necesario reiniciar antes de que el paquete KB #### se pueda cambiar al estado instalado
  • Id. De evento 2: el paquete KB #### se cambió correctamente al estado Instalado

Una forma de determinar que se han aplicado todos los parches sería hacer un bucle de verificación en el ID de evento 4. Compare la hora de ese evento con la hora actual. Si no se escribió ninguna ID de evento 4 durante 5 o 10 minutos, entonces probablemente todos los pataches estén listos y listos para reiniciar.

No tengo claro si desea hacer el primer reinicio cuando los parches terminan de instalarse (evento 4), o el segundo reinicio después de que terminan de configurarse (evento 2). Este código hace lo primero. Simplemente cambie filterHashTable a id de evento 2 para el otro reinicio antes de su paso 10.

$target = "bart"
$found = $false
while (-not $found) {
    $lastEvent4 = (get-winevent -comp $target -maxEvents 1 -filterHashTable @{ Logname='Setup'; id = '4';}).timeCreated
    if (((get-date) - $lastEvent4).totalMinutes -gt 10) {
        "do reboot"
        restart-computer -comp -$target
        $found = $true
    } else {
        "wait"
        start-sleep 60
    }
}
Clayton
fuente
¿No funcionaría anotar los ID de KB de todos los paquetes que comienzan a instalarse y asumir que se completan solo cuando no hay más actualizaciones en curso?
Simon Richter
La lista de parches cambiará cada mes el parche del martes. Actualizar el proceso cada mes para usar una nueva lista sería un punto de mantenimiento continuo ... Pensé que lo que sugería sería más simple.
Clayton
1
Me refería a una extensión de su respuesta: cuando la actualización comienza a instalarse (evento 1), se agrega a la lista y se elimina cuando se informa que está hecha (evento 4). Con algunos ajustes (¿actualizaciones fallidas, reinicio de la lista durante el reinicio?) Debería ser posible determinar si todavía hay una instalación en curso.
Simon Richter
Entonces, para una instalación nueva, desafortunadamente no hay entradas en el registro de eventos. No he intentado instalarlo después de que la máquina se haya inicializado, pero supongo que este enfoque funcionará bien en ese caso.
Petrik
Instalación nueva? Confuso. Tienes un proceso de 13 pasos aquí. Solicitó ayuda con los pasos 6 y 9. Su pregunta era "una forma de detectar que Windows ha terminado la etapa de configuración", no una forma de comenzar la implementación de parches.
Clayton
0

He tenido un buen éxito con el siguiente enfoque: Espere hasta que Windows cambie el tipo de inicio del Servicio de instalación de módulos de Windows (también conocido como TrustedInstaller) a Manual (Inicio de demanda), después de un reinicio. En ese momento, las actualizaciones han completado la instalación.

¿El proceso del instalador de confianza a veces continúa ejecutándose después de haber instalado los parches? Sin embargo, el tipo de inicio del servicio aún se restablece a Manual.

Puede verificar por sí mismo, si la observación anterior es consistente / correcta, mirando los mensajes de registro de eventos anteriores y correlacionando eventos entre el sistema y los registros de configuración.

El cambio de inicio al Instalador del módulo de Windows se registra como un evento del sistema 7040 y se correlaciona con el último evento 2 en el registro de instalación, después de un reinicio.

Creo que cuando las actualizaciones se instalan por primera vez, este servicio se configura en 'Inicio automático' en caso de que sea necesario reiniciar. Se vuelve a establecer en 'Manual' cuando se instala el último parche (independientemente de si fue necesario reiniciar).

En algunos servidores, he notado que el inicio del instalador de confianza cambia rápidamente de Manual a Automático y viceversa, y esto puede ocurrir cada hora más o menos. Sospecho que es una aplicación que regularmente busca actualizaciones. Pero, según mi experiencia, en general parece seguro suponer que si la puesta en marcha es Manual, entonces no se están produciendo parches.

ydrol
fuente