Gerenciando serviços
Nesta aula, você aprenderá a gerenciar serviços do Windows usando PowerShell, desde a consulta de status com Get-Service até o controle e configuração com Start/Stop/Restart-Service e Set-Service. Inclui exemplos práticos, boas práticas e exercícios para fixação.
Serviços são processos que rodam em segundo plano no Windows, fornecendo funcionalidades essenciais ao sistema operacional e a aplicativos. Gerenciá-los é uma tarefa comum para administradores de sistemas e desenvolvedores. PowerShell oferece cmdlets poderosos para consultar, iniciar, parar, reiniciar e configurar serviços. Nesta aula, você dominará os principais cmdlets e entenderá como usá-los de forma eficiente, incluindo a análise de status e a configuração de propriedades.
Além dos comandos básicos, exploraremos cenários práticos, como lidar com dependências, usar filtros e trabalhar com múltiplos serviços. Ao final, você terá uma base sólida para automatizar tarefas de gerenciamento de serviços em seus scripts.
Get-Service
O cmdlet Get-Service é a porta de entrada para o gerenciamento de serviços. Ele recupera informações sobre os serviços do sistema, como nome, nome de exibição, status e tipo. Sem parâmetros, lista todos os serviços, mas você pode filtrar por nome, nome de exibição ou até mesmo por status.
Exemplo básico: listar todos os serviços com seu status.
Get-ServicePara filtrar por nome ou parte dele, use o parâmetro -Name com curingas:
Get-Service -Name "Win*"Você também pode filtrar por nome de exibição com -DisplayName:
Get-Service -DisplayName "*Windows*"Para listar apenas serviços com status específico, use o parâmetro -Status (disponível no PowerShell 7+):
Get-Service -Status RunningEm versões anteriores, você pode filtrar com Where-Object:
Get-Service | Where-Object { $_.Status -eq 'Running' }O objeto retornado contém propriedades úteis, como Name, DisplayName, Status, ServiceType, e também métodos para iniciar/parar (embora seja melhor usar os cmdlets específicos). Você pode selecionar propriedades específicas:
Get-Service -Name Spooler | Select-Object Name, Status, StartTypeTabela de propriedades comuns:
Name: nome do serviço (usado em comandos).DisplayName: nome amigável exibido no console.Status: Running, Stopped, Paused, etc.StartType: Automatic, Manual, Disabled, etc.ServiceType: Win32OwnProcess, Win32ShareProcess, etc.
Dica: use Get-Service | Get-Member para explorar todos os membros disponíveis.
Start/Stop/Restart-Service
Para controlar o ciclo de vida dos serviços, use os cmdlets Start-Service, Stop-Service e Restart-Service. Esses comandos exigem privilégios administrativos, então execute o PowerShell como Administrador.
Start-Service: inicia um serviço que está parado.
Start-Service -Name SpoolerVocê pode usar o nome de exibição com -DisplayName:
Start-Service -DisplayName "Print Spooler"Stop-Service: para um serviço em execução.
Stop-Service -Name SpoolerRestart-Service: para e inicia novamente, útil para aplicar alterações.
Restart-Service -Name SpoolerTodos aceitam o parâmetro -Force para interromper serviços que estejam com dependências ou que não respondam rapidamente. Por exemplo:
Stop-Service -Name Spooler -ForcePara operar em vários serviços, você pode passar uma lista de nomes:
Start-Service -Name Spooler, WSearch, BITSOu usar o pipeline:
Get-Service -Name "Win*" | Stop-ServiceObservação: Cuidado ao usar pipeline para parar serviços; verifique se não está interrompendo serviços críticos do sistema.
Além disso, você pode usar o parâmetro -WhatIf para simular a operação sem executá-la:
Restart-Service -Name Spooler -WhatIfIsso mostra o que aconteceria, útil para testar scripts.
Set-Service
O cmdlet Set-Service permite alterar a configuração de um serviço, como o tipo de inicialização (StartType), a descrição, o caminho do executável e as credenciais (conta de logon). É essencial para ajustar serviços conforme a necessidade.
Alterar o tipo de inicialização:
Set-Service -Name Spooler -StartupType AutomaticOs valores válidos para -StartupType são: Automatic, Manual, Disabled e AutomaticDelayedStart (no PowerShell 6+).
Alterar a descrição:
Set-Service -Name Spooler -Description "Gerencia fila de impressão"Alterar o caminho do executável (geralmente usado para apontar para um binário diferente):
Set-Service -Name MeuServico -BinaryPathName "C:\Novo\Caminho\servico.exe"Alterar a conta de logon (requer credenciais):
Set-Service -Name MeuServico -Credential (Get-Credential)Para verificar as alterações, use Get-Service com Select-Object:
Get-Service -Name Spooler | Select-Object Name, Status, StartType, DescriptionImportante: Alterar o tipo de inicialização para Disabled impede que o serviço seja iniciado, enquanto Manual permite iniciar manualmente. Use com cautela.
Lembre-se de que as alterações só têm efeito após o serviço ser reiniciado (se necessário).
Status
O status de um serviço indica seu estado atual: Running, Stopped, Paused, ou StartPending/StopPending (transições). Para verificar o status, use Get-Service e inspecione a propriedade Status.
Exemplo de verificação condicional:
$servico = Get-Service -Name Spooler
if ($servico.Status -eq 'Running') {
Write-Host "O serviço está rodando."
} else {
Write-Host "O serviço está parado."
}Você também pode usar o parâmetro -Status para listar serviços com um status específico (PowerShell 7+):
Get-Service -Status RunningEm versões anteriores, use Where-Object:
Get-Service | Where-Object { $_.Status -eq 'Running' }O status Paused é raro, mas pode ocorrer. Você pode pausar e retomar com Suspend-Service e Resume-Service (não abordados nesta aula, mas disponíveis).
Para monitorar mudanças de status, você pode usar um loop com Start-Sleep:
$servico = Get-Service -Name Spooler
while ($servico.Status -ne 'Running') {
Start-Sleep -Seconds 2
$servico.Refresh()
Write-Host "Aguardando o serviço iniciar... Status atual: $($servico.Status)"
}O método Refresh() atualiza o objeto com as informações mais recentes.
Além disso, você pode verificar o status de um serviço específico e agir de acordo, por exemplo, iniciá-lo se estiver parado:
$servico = Get-Service -Name Spooler
if ($servico.Status -ne 'Running') {
Start-Service -Name Spooler
}Isso é útil em scripts de manutenção.
Boas Práticas
- Sempre execute o PowerShell como Administrador para comandos que alteram serviços.
- Use
-WhatIfpara testar comandos destrutivos antes de executá-los. - Filtre serviços com cuidado para não afetar serviços críticos do sistema.
- Ao usar
Set-Service -Credential, tenha cuidado com a segurança das credenciais. - Documente as alterações feitas nos serviços para auditoria.
Referências
- Get-Service (Microsoft Docs)
- Start-Service (Microsoft Docs)
- Stop-Service (Microsoft Docs)
- Restart-Service (Microsoft Docs)
- Set-Service (Microsoft Docs)
- Gerenciando serviços com PowerShell (Microsoft Docs)
Exercícios
- Liste todos os serviços que estão com status 'Running' e cujo nome começa com 'W'.
Get-Service -Name "W*" | Where-Object { $_.Status -eq 'Running' }$servico = Get-Service -Name Spooler
if ($servico.Status -ne 'Running') {
Start-Service -Name Spooler
} else {
Write-Host "O serviço já está em execução."
}Restart-Service -Name WSearch
Get-Service -Name WSearch | Select-Object StatusSet-Service -Name BITS -StartupType Manual
Get-Service -Name BITS | Select-Object Name, StartType$servico = Get-Service -Name Spooler
if ($servico.Status -ne 'Running') {
Start-Service -Name Spooler
$servico.Refresh()
while ($servico.Status -ne 'Running') {
Start-Sleep -Seconds 2
$servico.Refresh()
Write-Host "Aguardando... Status: $($servico.Status)"
}
Write-Host "Serviço iniciado com sucesso."
} else {
Write-Host "Serviço já está em execução."
}