![Notificación por correo electrónico cuando no se inicia el servicio automático (Windows Server 2012 R2)](https://rvso.com/image/668797/Notificaci%C3%B3n%20por%20correo%20electr%C3%B3nico%20cuando%20no%20se%20inicia%20el%20servicio%20autom%C3%A1tico%20(Windows%20Server%202012%20R2).png)
Tenemos algunos servidores (Windows Server 2012 R2) en nuestro entorno que instalan actualizaciones automáticamente y luego se reinician.
Después del reinicio, nos gustaría verificar el estado de todos los servicios (Windows) que están configurados para iniciarse automáticamente. Si un servicio no se inicia, el script intentará iniciar el servicio 3 veces y si todos los intentos fallan, debería enviar una notificación por correo electrónico para que podamos verificar qué está mal con este servicio en este servidor.
Me preguntaba si ya existía una solución sencilla, ¿tal vez un script de PowerShell?
Respuesta1
Le aconsejaría que considere la posibilidad de adquirir un NMS. Usamos PRTG y funciona bien. En él puede crear sensores que monitoreen los servicios de Windows mediante WMI. Puede configurar el sensor para enviar correo/scripts de inicio si el servicio deja de funcionar.
PRTG tiene licencia para sensores, pero la versión gratuita le ofrece 100, lo que debería ser suficiente para un par de servidores (necesita un sensor por servicio para monitorear)
Respuesta2
Powershell sería una excelente manera de monitorear estos servicios. Por extraño que parezca, hoy estaba leyendo un blog sobre esto. Intentaré vincular el script si puedo encontrarlo, pero la esencia general sería:
1.) Busque servicios que estén configurados para iniciarse automáticamente.
2.) Verificar el estado del servicio.
El truco es que el
get-service
El cmdlet no genera ningún tipo de 'StartupType', por lo que tendrá que usar el objeto WMI Win32_Service en su lugar.
Foreach($Server in $ServerList){
Get-WmiObject -ComputerName $Server Win32_Service |
Where-Object {$_.StartMode -eq 'Auto' -AND $_.State -eq 'Stopped'}
}
Esto debería brindarle una lista de servicios que se ajusten a sus parámetros deseados.
NOTAS Hay un par de notas sobre esto:
1.) Le recomiendo encarecidamente que inicie este script un par de minutos después de que se inicien los servidores, ya que $_.StartMode -eq 'Auto' abarcará los servicios configurados para iniciarse inmediatamente después del inicio Y los configurados para iniciarse automáticamente después de un retraso. .
2.) Habrá servicios que se devolverán a través de este resumen y que probablemente no le interese monitorear. (Es decir, en mi computadora portátil, un servicio llamado "TrustedInstaller" cumplía con este criterio y fue devuelto como un servicio detenido :/) Por lo tanto, lo más probable es que también deba filtrarlos.
Respuesta3
Servicio > Propiedades > Recuperación
Puede seleccionar qué hacer en las primeras 3 fallas, incluido reiniciar el servicio o ejecutar un comando.
Aquí es donde también usaríasEjecute el programapara configurar su secuencia de comandos que reiniciaría el servicio, borraría un archivo, le enviaría una notificación, etc. Estoy totalmente a favor de la secuencia de comandos NMS (Zabbix) o Powershell, pero la mayor parte de esto se puede resolver de forma nativa y GPO (si corresponde a su entorno) puede establezca esto en todos los servicios/máquinas necesarias.
Respuesta4
Encontré un script de Powershell que es perfecto para mí, sólo necesito personalizarlo un poco. Aqui esta el linkhttp://doitcloudy.blogspot.de/2014/07/scriptgesteuerter-neustart-von-windows.html(Alemán, pero el guión al final de la página es todo inglés). Sin embargo, necesito ayuda con esta parte (líneas 130 y siguientes):
foreach ($item in $report){
Write-Host "Starting Service " $item.Name " on server: " $item.Server -Foregroundcolor yellow
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
if ($j.State -ne 'Running') { break}
$j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)
}
Veo que esta es la parte donde el script inicia un servicio, pero no estoy acostumbrado a trabajos en Powershell. ¿Cómo debo editar el script para que cuando falla el inicio del servicio, escriba el nombre del servicio en un archivo de registro? ¿Quizás con try/catch?
Editar:
Si alguien se topa con esto y quiere saber cómo lo resolví: después de mucha investigación descubrí que es extremadamente difícil escribir el resultado de Recibir-Trabajo en un archivo de registro. Así que elegí un enfoque diferente: compruebo si el servidor se está ejecutando una vez finalizado el trabajo. Aquí está el código:
foreach ($item in $report){
Write-Output "Starting Service " $item.Name " on server: " $item.Server
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
if ($j.State -ne 'Running') { break}
$j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)
$newService = Get-Service -ComputerName $item.Server -Name $item.Name
if ($newService.Status -ne "Running") { LogWrite "$item could not start" }
}