![Notificação por email quando o serviço automático não é iniciado (Windows Server 2012 R2)](https://rvso.com/image/668797/Notifica%C3%A7%C3%A3o%20por%20email%20quando%20o%20servi%C3%A7o%20autom%C3%A1tico%20n%C3%A3o%20%C3%A9%20iniciado%20(Windows%20Server%202012%20R2).png)
Temos alguns servidores (Windows Server 2012 R2) em nosso ambiente que instalam atualizações automaticamente e reiniciam depois disso.
Após a reinicialização, gostaríamos de verificar o status de todos os serviços (Windows) que estão configurados para inicialização automática. Se um serviço não iniciasse, o script tentaria iniciar o serviço 3 vezes e se todas as tentativas falhassem, ele deveria enviar uma notificação por email para que possamos verificar o que há de errado com este serviço neste servidor.
Fiquei me perguntando se já existia uma solução fácil, talvez um script do PowerShell?
Responder1
Eu aconselho você a tentar obter um NMS. Usamos PRTG e funciona bem. Nele você pode criar sensores que monitoram os serviços do Windows usando WMI. Você pode configurar o sensor para enviar scripts de email/iniciar se o serviço cair.
O PRTG é licenciado por sensores, mas a versão gratuita oferece 100, o que deve ser suficiente para alguns servidores (você precisa de um sensor por serviço para monitorar)
Responder2
O Powershell seria uma ótima maneira de monitorar esses serviços. Curiosamente, eu estava lendo um blog sobre isso hoje. Tentarei vincular o script se conseguir encontrá-lo, mas a essência geral seria:
1.) Encontre serviços configurados para iniciar automaticamente.
2.) Verifique o estado do serviço.
O truque é que o
get-service
cmdlet não gera nenhum tipo de 'StartupType', então você terá que usar o objeto WMI Win32_Service.
Foreach($Server in $ServerList){
Get-WmiObject -ComputerName $Server Win32_Service |
Where-Object {$_.StartMode -eq 'Auto' -AND $_.State -eq 'Stopped'}
}
Isso deve fornecer uma lista de serviços que atendem aos parâmetros desejados.
NOTAS Existem algumas notas sobre isso:
1.) Eu recomendo fortemente que você inicie este script alguns minutos após a inicialização dos servidores, pois $_.StartMode -eq 'Auto' abrangerá os serviços configurados para iniciar imediatamente após a inicialização E aqueles configurados para iniciar automaticamente após um atraso .
2.) Haverá serviços que serão retornados através deste one-liner que você provavelmente não se importa em monitorar. (Isto é, no meu laptop, um serviço chamado "TrustedInstaller" atende a esses critérios e foi retornado como um serviço interrompido:/) Portanto, você provavelmente também precisará filtrá-los.
Responder3
Serviço > Propriedades > Recuperação
Pode selecionar o que fazer nas três primeiras falhas, incluindo reiniciar o serviço ou executar um comando.
É aqui que você também usariaRodar programapara definir seu script que reiniciaria o serviço, limparia um arquivo, enviaria uma notificação, etc. Sou totalmente a favor do script NMS (Zabbix) ou Powershell, mas a maior parte disso pode ser resolvida nativamente e o GPO (se aplicável ao seu ambiente) pode tenha isso definido em todos os serviços/máquinas necessários.
Responder4
Encontrei um script Powershell que é perfeito para mim, só preciso personalizá-lo um pouco. Aqui está o linkhttp://doitcloudy.blogspot.de/2014/07/scriptgesteuerter-neustart-von-windows.html(Alemão, mas o script na parte inferior da página é todo em inglês). No entanto, preciso de ajuda com esta parte (linhas 130 e seguintes):
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)
}
Vejo que esta é a parte onde o script inicia um serviço, mas não estou acostumado com jobs no Powershell. Como devo editar o script para que, ao iniciar o serviço falhar, ele grave o nome do serviço em um arquivo de log? Talvez com try/catch?
Editar:
Se alguém se deparar com isso e quiser saber como resolvi: Depois de muita pesquisa descobri que é extremamente difícil gravar a saída de Receive-Job em um arquivo de log. Então escolhi uma abordagem diferente: verifico se o servidor está funcionando após a conclusão do trabalho. Aqui está o 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" }
}