Verificando Serviços em Servidores Remotos

Sem dúvida a melhor forma de se monitorar uma infraestrutura de TI é utilizando o System Center Operations Manager (SCOM). Agora, caso não exista um SCOM em seu ambiente ou ele ainda está em implantação e serviços precisam ser monitorados, isso pode ser feito via PowerShell (PS).

Neste post vai ser mostrado como verificar o status de serviços em um servidor local e em servidores remotos de uma forma simples. Também será mostrado como podem ser feitos scripts um pouco mais elaborados para essas tarefas.

Em um host local para verificar os serviços que estão rodando basta digitar:
Get-Service
0701

Esse comando padrão traz o status do serviço (se está rodando ou não) o nome do serviço e o nome que aparece no Windows de forma amigável.

Em um host para verificar os serviços que estão parados:
Get-Service | where status -eq “stopped”

Em um host para verificar os serviços que estão rodando:
Get-Service | where status -eq “running”

Para poder verificar todos os serviços no servidor remoto (chamado SCVMM2012) precisamos do seguinte comando via PS:
Get-Service –Computername scvmm2012

O próximo comando é utilizado para verificar os serviços que começam com CM:
Get-Service cm* -ComputerName scvmm2012

0702

Para verificar se os serviços em que o nome começa por “cm” estão rodando no servidor remoto:
Get-Service cm* -ComputerName scvmm2012 | Where-Object {$_.status -eq “running”}

Se a ideia é verificar um mesmo serviço em dois servidores diferentes pode ser usado o seguinte comando:
$srv = “scvmm2012”, “scom2012”
Get-Service –Name spooler –Computername $srv

O comando acima vai verificar o status do serviço Spooler nos servidores SCVMM01 e SCOM01.

0703

No caso acima vemos duas vezes o serviço rodando, mas não sabemos em qual está. Se em um estivesse parado iria ser interessante saber em qual dos dois. Para essa situação podemos usar:
$srv = “scvmm2012”, “scom2012”
Get-Service –Name spooler –Computername $srv | format-table –property machinename, status, displayname – auto

Para melhorar um pouquinho mais o detalhamento da saída poderia ser usado ainda:
$srv = “scvmm2012”, “scom2012”
Get-Service –Name spooler –Computername $srv | format-table –property machinename, status, name, displayname – auto

0704

Se a intenção é verificar o serviço de vários servidores uma opção interessante é criar um documento txt com o nome dos servidores, isso facilitaria o trabalho.

O exemplo abaixo mostra um arquivo chamado servers.txt dentro da pasta c:\ps.

0705

Os nomes dos servidores devem estar um em cada linha.
$server = get-content c:\ps\servers.txt
Get-Service –name Spooler –computername $server | format-table –property machinename, status, name, displayname – auto

0706

Uma coisa que pode acontecer é um servidor ser inicializado e algum serviço, que deveria iniciar automaticamente não inicia. Para ver os serviços que devem iniciar de forma automática (no próprio servidor):
Get-WmiObject -Class Win32_Service | where startmode -eq “auto”

O comando acima vai dar um monte de informações. É possível diminuir a quantidade de informações:
Get-WmiObject -Class Win32_Service | where startmode -eq “auto” | Format-Wide -Property Name -Column 1

O comando interessante seria ver os serviços que deveriam iniciar automaticamente e estão parados. Para isso usamos o comando:
Get-WmiObject -Class Win32_Service | where startmode -eq “auto” | where state -eq “stopped”

0707

Para verificar o status de um serviço específico usamos o seguinte comando:
Get-WmiObject -Class Win32_Service | where name –eq skypeupdate

Para iniciar um serviço que esteja parado podemos usar o comando:
Get-WmiObject -Class Win32_Service | where name -eq skypeupdate | start-service

Obviamente para parar um serviço que esteja rodado podemos usar o mesmo comando, apenas mudando o final:
Get-WmiObject -Class Win32_Service | where name -eq skypeupdate | stop-service

0708

Para iniciar todos os serviços que deveriam iniciar automaticamente e estão parados usamos o seguinte comando:
Get-WmiObject -Class Win32_Service | where startmode -eq “auto” | where state -eq “stopped” | start-service

Pensando em vários servidores é possível criar um comando que verifica de uma vez vários serviços em vários servidores. Para esse exemplo usaremos os servidores SCVMM2012 e SCOM2012 e verificaremos o serviço MSSQLSERVER, presente em ambos, e o serviço SCVMMSERVICE presente apenas no servidor SCVMM2012 e o serviço OMSDK presente apenas no servidor SCOM2012:
$srv = “scvmm2012”, “scom2012”
$services = “scvmmservice”, “omsdk”, “mssqlserver”
Get-Service –name $services –computername $srv| format-table –property machinename, status, name, displayname

0709

Para o mesmo exemplo acima, adicionando o serviço de Remote Access, que está parado em ambos servidores:
$srv = “scvmm2012”, “scom2012”
$services = “scvmmservice”, “omsdk”, “mssqlserver”, “remoteaccess”
Get-Service –name $services –computername $srv| format-table –property machinename, status, name, displayname

0710

Agora vamos fazer o seguinte, vamos monitorar os serviços acima, só que vamos mudar o serviço de Remote Access para o serviço de Audio do Windows. O serviço de áudio também está parado nos dois servidores. O próximo comando vai verificar os quatro serviços nos dois servidores e iniciar se algum estiver parado (no caso o serviço de áudio estará parado em ambos:
$srv = “scvmm2012”, “scom2012”
$services = “scvmmservice”, “omsdk”, “mssqlserver”, “audiosrv”
Get-Service –name $services –computername $srv| format-table –property machinename, status, name, displayname
Get-Service –name $services –computername $srv| start-service
Get-Service –name $services –computername $srv| format-table –property machinename, status, name, displayname

O script acima vai mostrar o status dos serviços e após irá iniciar os que estiverem parados e, novamente, irá mostrar o status.

0711

Como fazer essas operações de forma remota fora do domínio no servidor VMM01:
$cred = get-credential
Invoke-Command -ComputerName vmm01 -ScriptBlock {get-service } -credential $cred

0712

Quando o commando $cred = get-credential é digitado, vai abrir uma janela pedindo que seja digitado o usuário e a senha. Para que o usuário seja completado pode ser usado $cred = get-credential contoso\administrator

Que tal criar um script em PowerShell de uma forma um pouco mais elaborada?

Qualquer um dos comandos acima pode ser salvo em um arquivo .ps1 para ser rodado todo de uma vez só. Quando é feito um script podemos aprimorar algumas coisas. Copiar os scripts abaixo e salvar em um arquivo.ps1.

O script abaixo vai verificar os serviços no localhost:
$servers = “localhost”
foreach ($i in $servers)
{write-host “Verificando Serviços no Servidor” $i
Get-wmiobject -computername $servers -class win32_service | Select-Object -property name, state, startmode, startname | sort-object -property startmode, state, name | Format-table *}

O mesmo script verificando os serviços nos servidores SCVMM2012 e SCOM2012:
$servers = “scvmm2012”, “scom2012”
foreach ($i in $servers)
{write-host “Verificando Serviços no Servidor” $i
Get-wmiobject -computername $servers -class win32_service | Select-Object -property name, state, startmode, startname | sort-object -property startmode, state, name | Format-table *}

O script acima não pede credenciais, então deve ser rodado no mesmo domínio.

Que tal um script onde é perguntado o nome do servidor onde verificar o status dos serviços e ainda verifica as credenciais:
$ComputerName = Read-Host “Digite o Nome do Servidor”
$UserName = Read-Host “Digite o Usuario”
$Password = Read-Host -AsSecureString “Digite a Senha”
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserName , $Password
$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -Credential $Credential
$Service

E agora é dado duas opções de servidores para se escolher:
Write-Host Bem Vindo ao verificador de Serviços. Servidor VMM01 é opção 1. Servidor OM01 é opção 2.
$ComputerName = Read-Host “Digite a opcao”
if ($ComputerName -eq 1)
{
$comp = “vmm01”
}
elseif ($ComputerName -eq 2)
{
$comp = “om01”
}
else
{
Write-Host “Opção inválida”; exit
}
$UserName = Read-Host “Enter User Name”
$Password = Read-Host -AsSecureString “Enter Your Password:”
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserName , $Password
$Service = Get-WmiObject -Class Win32_Service -ComputerName $Comp -Credential $Credential
$Service

Para finalizar, um script que pergunta o nome do host e o tipo de verificação:
Write-Host Bem Vindo ao verificador de Serviços.
$Comp = Read-Host “Digite o nome do Servidor”
Write-Host Tipos de verificação:
Write-Host 1 – Para verificar o status de todos os serviços;
Write-Host 2 – Para verificar os serviços que estão rodando;
Write-Host 3 – Para verificar os serviços que estão parados;
Write-Host 4 – Para verificar os serviços que estão parados e tem inicialização
automática;
Write-Host 5 – Para digitar o nome do serviço a ser verificado;
$vertype = Read-Host “Digite o tipo de verificação”
$UserName = Read-Host “Enter User Name”
$Password = Read-Host -AsSecureString “Enter Your Password”
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserName , $Password
if ($vertype -eq 1)
{
$Service = Get-WmiObject -Class Win32_Service -ComputerName $Comp -Credential $Credential
$Service
}
elseif ($vertype -eq 2)
{
$Service = Get-WmiObject -Class Win32_Service -ComputerName $Comp -Credential $Credential
$Service | where state -eq “running” | format-table -property name, state
}
elseif ($vertype -eq 3)
{
$Service = Get-WmiObject -Class Win32_Service -ComputerName $Comp -Credential $Credential
$Service | where state -eq “stopped” | format-table -property name, state
}
elseif ($vertype -eq 4)
{
$Service = Get-WmiObject -Class Win32_Service -ComputerName $Comp -Credential $Credential
$Service | where startmode -eq “auto” | where state -eq “stopped” | format-table -property name, state
}
elseif ($vertype -eq 5)
{
$Service = Read-Host “Digite o nome do Serviço”
$Service2 = Get-WmiObject -Class Win32_Service -ComputerName $Comp -Credential $Credential | where name -eq $service
$service2
}
else
{
Write-Host “Opção inválida”; exit
}

Antes que alguém fale, eu sei que, no script acima, a verificação da opções deveria vir antes de digitar o usuário e senha.

Depois de todos esses scripts podemos ver como é possível combinar os scripts e criar visualizações diferentes.
Espero que esses scripts possam ser úteis!!!

Até a próxima!!