Powershell: Comprobar reinicio de máquina y envío alerta
Hay veces que necesitas saber si una máquina ha reiniciado o no.
En mi caso, tengo unos Windows 10 que dan soporte a un producto que dispone de un desarrollo tipo Tomcat, que necesita que una sesión corra en el sistema para funcionar el programa que da servicio.
Y aunque hemos intentado crear servicios, monitorizarlo, autologon…hay temas como los parches, que muchas veces se nos escapan y hacen que la máquina reinicie y no de el servicio para lo que se ha creado. Que por cierto, es 24×7.
Como he sacado algo de tiempo este finde, he creado un sencillo script para programar en una tarea de la propia máquina, que nos alertará vía email si ha habido un reinicio o no.
Compara la fecha actual, con la fecha del último reinicio que podemos consultar vía WMI, por ejemplo.
Os lo dejo, va desarrollado por Powershell, por si a alguien le sirve. Hay formas más sencillas de monitorizar esto, pero en entornos con poco control, uno tiene que sacarse las castañas como puede.
Script Powershell para control de reinicio de PC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
################################################ # SCRIPT EL BLOG DE NEGU - 14/12/2023 # Revisar reinicio máquina y alerta por correo ################################################ ###### # NOMBRE MAQUINA $hostname = hostname # SABER DIA ACTUAL $dia = Get-Date # EXTRAEMOS FECHA DEL ULTIMO REINICIO $reinicio = Get-WmiObject win32_operatingsystem | select csname, @{LABEL='LastBootUpTime';EXPRESSION={$_.ConverttoDateTime($_.lastbootuptime)}} # VEMOS LA DIFERENCIA DE DIAS, FILTRANDO LOS RESULTADOS $Diferencia = $dia.Date - $reinicio.LastBootUpTime.Date $Diferencia.TotalDays If ($Diferencia.TotalDays -eq "0") { # ENVIO CORREO CON LA INFORMACION $fechareinicio = $reinicio.LastBootUpTime.Date $EncodedTextMAIL = “ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUA” $DecodedTextMAIL = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextMAIL)) $EncodedTextPW = “ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUA” $DecodedTextPW = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextPW)) $emailSmtpServer = "smtp.servidor.com" $emailSmtpServerPort = "587" $emailSmtpUser = "$DecodedTextMAIL" $emailSmtpPass = "$DecodedTextPW" $emailFrom = "email@dominio.com" $emailTo = "emaildestino@dominio.com" $emailcc="emaildestino2@dominio.com" $emailMessage = New-Object System.Net.Mail.MailMessage( $emailFrom , $emailTo ) $emailMessage.cc.add($emailcc) $emailMessage.Subject = "MAQUINA $hostname NO SE HA REINICIADO" $emailMessage.IsBodyHtml = $true #true or false depends $emailMessage.Body = "¡REINICIO MAQUINA $hostname!" $emailMessage.Body += "No hay reinicio de $hostname" $emailMessage.Body += "Volveremos a comprobarlo nuevamente mañana" $SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort ) $SMTPClient.EnableSsl = $False $SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass ); $SMTPClient.Send( $emailMessage ) } Else{ # ENVIO CORREO CON LA INFORMACION $fechareinicio = $reinicio.LastBootUpTime.Date $EncodedTextMAIL = “ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUA” $DecodedTextMAIL = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextMAIL)) $EncodedTextPW = “ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUA” $DecodedTextPW = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextPW)) $emailSmtpServer = "smtp.servidor.com" $emailSmtpServerPort = "587" $emailSmtpUser = "$DecodedTextMAIL" $emailSmtpPass = "$DecodedTextPW" $emailFrom = "email@dominio.com" $emailTo = "emaildestino@dominio.com" $emailcc="emaildestino2@dominio.com" $emailMessage = New-Object System.Net.Mail.MailMessage( $emailFrom , $emailTo ) $emailMessage.cc.add($emailcc) $emailMessage.Subject = "REINICIO MAQUINA $hostname REPORTADO" $emailMessage.IsBodyHtml = $true #true or false depends $emailMessage.Body = "¡REINICIO MAQUINA $hostname!" $emailMessage.Body += "El ultimo reinicio de $hostname fue el <span style="font-size: xx-large;"><strong>$fechareinicio</strong></span>" $emailMessage.Body += "Volveremos a comprobarlo nuevamente mañana" $SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort ) $SMTPClient.EnableSsl = $False $SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass ); $SMTPClient.Send( $emailMessage ) } |
Otras formas de extraer el tiempo desde el reinicio de una máquina
Disponemos de más comandos para extraer este dato, os dejo alguna forma extra:
1 2 |
PS C:\Users\elblogdenegu> systeminfo | find /i "Tiempo de arranque" Tiempo de arranque del sistema: 16/12/2023, 11:31:18 |
O podéis usar un módulo de powershell como PendingReboot:
1 2 3 4 5 6 |
PS C:\WINDOWS\system32> Import-Module -Name PendingReboot PS C:\WINDOWS\system32> Test-PendingReboot -ComputerName localhost -SkipConfigurationManagerClientCheck ComputerName IsRebootPending ------------ --------------- localhost False |
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?