Descubriendo módulos: Listar máquinas Windows con reinicio pendiente con PowerShell
Después de casi cinco meses desde el último descubriendo módulos retomamos la sección para hablar de PendingReboot. PendingReboot es un módulo que, tal y como habréis podido leer en el título, nos ayudará a listar de forma masiva (si queremos) máquinas Windows con reinicio pendiente, algo más que común en sistemas operativos de Microsoft. ¡Vamos a ver cómo funciona!
Conociendo cómo funciona el módulo PendingReboot
PendingReboot es un módulo de PowerShell muy pequeño que alberga una única función: Test-PendingReboot. Como decía en la introducción ésta función nos puede ayudar a descubrir máquinas Windows con reinicio pendiente dentro de nuestro entorno.
Cuando una máquina se encuentra en un estado de reinicio pendiente se puede deber a varias causas: instalación de parches del sistema operativo, instalación de roles del sistema, adición a dominio, cambio de hostname, instalación/desinstalación de software de terceros…
PendingReboot nos facilitará la tarea de revisar las posibles señales que determinan si hay un reinicio pendiente en un sistema:
- Claves de registro que indican un reinicio pendiente:
- HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending
- HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootPending
- Revisión de si la máquina va a entrar en dominio:
- HKLM\SYSTEM\CurrentControlSet\Services\Netlogon
- Comparativa entre el nombre de máquina y el nombre actual de la máquina.
- Operaciones de renombrado de archivos.
- HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
- Clases utilizadas WMI utilizadas por el SDK de SCCM.
Test-PendingReboot utiliza Invoke-WmiMethod para realizar las consultas contra el registro de Windows de las máquinas remotas (y de la propia máquina local) tal y como vimos en ‘Utilizando CIM y WMI con PowerShell’.
Primer uso del módulo PendingReboot
Ahora que ya conocemos un poco las entrañas del módulo vamos a sacarle jugo. Para instalarlo como siempre tiraremos de Install-Module:
|
|
Con el módulo ya instalado podemos pasar a hacer la consulta sobre nuestra propia máquina utilizando:
|
|
Utilizo -SkipConfigurationManagerClientCheck para que no aparezca un error indicando que la máquina no dispone del ClientSDK de SCCM.
Como podemos ver, la máquina local dispone de un reinicio pendiente. Si quisiéramos ver exáctamente qué operación es la que pide el reinicio podremos consultarlo utilizando el flag -Detailed:
|
|
Y como podemos apreciar en las líneas resaltadas éste reinicio pendiente se debe a una operación de renombrado de archivos relacionada con Firefox.
Cómo listar máquinas Windows con reinicio pendiente masivamente
Revisar si nuestra propia máquina dispone de reinicio pendiente puede ser útil, pero en la mayoría de los casos se puede quedar en anecdótico. Lo realmente potente será realizar estas consultas a máquinas remotas y hacerlo a gran escala.
Lo primero que necesitaremos será almacenar las credenciales de las máquinas a las que conectaremos en un objeto PSCredential que utilizaremos en cada conexión:
|
|
Para ejecutar masivamente Test-PendingReboot nos valdremos del parámetro -Name que acepta múltiples valores. Una forma de pasarle todos los nombres sería leyendo un archivo txt con un nombre de servidor por cada línea
|
|
Otra forma es utilizar PowerCLI para listar las máquinas virtuales y pasárselas a Test-PendingReboot (deberemos estar conectados a una infraestructura vSphere):
|
|
Por último, podríamos hacer una query a una OU desde un DC (o utilizando PSRemoting contra uno) para obtener las máquinas de la misma:
|
|
Conclusión
Con la información obtenida utilizando PendingReboot podremos realizar las acciones correctoras que necesitemos. Antes de realizar un reinicio “a la brava” de las máquinas que detectemos que tienen un reinicio pendiente sería conveniente revisar el motivo por el que se ha llegado a dicho estado por si éste se debe a un comportamiento anómalo de la misma.
¡Espero que os sea de ayuda!
¡Nos vemos en la próxima! :-)