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-Service

Para 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 Running

Em 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, StartType

Tabela 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 Spooler

Você 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 Spooler

Restart-Service: para e inicia novamente, útil para aplicar alterações.

Restart-Service -Name Spooler

Todos 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 -Force

Para operar em vários serviços, você pode passar uma lista de nomes:

Start-Service -Name Spooler, WSearch, BITS

Ou usar o pipeline:

Get-Service -Name "Win*" | Stop-Service

Observaçã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 -WhatIf

Isso 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 Automatic

Os 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, Description

Importante: 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 Running

Em 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 -WhatIf para 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

Exercícios

  1. Liste todos os serviços que estão com status 'Running' e cujo nome começa com 'W'.

✓ Resposta:
Get-Service -Name "W*" | Where-Object { $_.Status -eq 'Running' }
  • Inicie o serviço 'Spooler' se ele estiver parado, caso contrário, exiba uma mensagem.
  • ✓ Resposta:
    $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."
    }
  • Reinicie o serviço 'WSearch' e verifique se ele ficou 'Running' após a operação.
  • ✓ Resposta:
    Restart-Service -Name WSearch
    Get-Service -Name WSearch | Select-Object Status
  • Altere o tipo de inicialização do serviço 'BITS' para 'Manual' e verifique a alteração.
  • ✓ Resposta:
    Set-Service -Name BITS -StartupType Manual
    Get-Service -Name BITS | Select-Object Name, StartType
  • Escreva um script que verifique se o serviço 'Spooler' está rodando; se não, inicie-o e aguarde até que esteja 'Running' (use um loop com Refresh).
  • ✓ Resposta:
    $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."
    }