Notificação por email quando o serviço automático não é iniciado (Windows Server 2012 R2)

Notificação por email quando o serviço automático não é iniciado (Windows Server 2012 R2)

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

insira a descrição da imagem aqui

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" }

}

informação relacionada