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!

Listar máquinas Windows con reinicio pendiente con PowerShell

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:

Install-Module -Name PendingReboot -Scope CurrentUser -Confirm:$false

Con el módulo ya instalado podemos pasar a hacer la consulta sobre nuestra propia máquina utilizando:

PS C:\>Test-PendingReboot -ComputerName localhost -SkipConfigurationManagerClientCheck

ComputerName IsRebootPending
------------ ---------------
localhost               True

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:

PS C:\>Test-PendingReboot -ComputerName localhost -SkipConfigurationManagerClientCheck -Detailed


ComputerName                     : localhost
ComponentBasedServicing          : False
PendingComputerRenameDomainJoin  : False
PendingFileRenameOperations      : True
PendingFileRenameOperationsValue : {\??\C:\Program Files (x86)\Mozilla Firefox\tobedeleted\moz67c...}
SystemCenterConfigManager        :
WindowsUpdateAutoUpdate          : False
IsRebootPending                  : True

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:

$Credencial = Get-Credential

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

PS C:\>Test-PendingReboot -ComputerName $(Get-Content C:\Scripts\Computers.txt) -Credential $Credencial -SkipConfigurationManagerClientCheck

ComputerName  IsRebootPending
------------  ---------------
Sobrebits1              False
Sobrebits2               True
Sobrebits3              False
Sobrebits4              False
Sobrebits5              False

Otra forma es utilizar PowerCLI para listar las máquinas virtuales y pasárselas a Test-PendingReboot (deberemos estar conectados a una infraestructura vSphere):

PS C:\>Test-PendingReboot -ComputerName $($(Get-Folder Sobrebits-VMs | Get-VM).ExtensionData.Guest.Hostname) -Credential $Credencial -SkipConfigurationManagerClientCheck

ComputerName  IsRebootPending
------------  ---------------
Sobrebits1              False
Sobrebits2               True
Sobrebits3              False
Sobrebits4              False
Sobrebits5              False

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:

PS C:\>Test-PendingReboot -ComputerName $($(Get-ADComputer -Filter * -SearchBase "OU=Computers,DC=Sobrebits,DC=local").DNSHostName) -Credential $Credencial -SkipConfigurationManagerClientCheck

ComputerName  IsRebootPending
------------  ---------------
Sobrebits1              False
Sobrebits2               True
Sobrebits3              False
Sobrebits4              False
Sobrebits5              False

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! 🙂

3 Comments

  1. Oliver abril 16, 2019

Deja un comentario