(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como criar um Serviço Windows com PowerShell: passo a passo

João Barros 12 de November de 2026 3 min de leitura

Criar um Serviço Windows com PowerShell permite executar scripts ou aplicações em segundo plano como serviços geridos pelo Service Control Manager. Este processo é útil para automatizar tarefas que devem correr sempre que o sistema arranca ou para ter melhor controlo sobre arranque/paragem, reinício e dependências.

Pré-requisitos

  • Windows 10/11 ou Windows Server com permissões de administrador.
  • PowerShell 5.1 ou PowerShell 7+ (para criar e gerir ficheiros e serviços).
  • Um script PowerShell ou um executável simples a executar como serviço (ex.: script.ps1).

Passo 1: Preparar um wrapper simples em PowerShell

Os Serviços Windows esperam um executável. A abordagem simples é usar um pequeno wrapper que executa o seu script em loop e responde a sinais de paragem. Vamos criar um ficheiro chamado ServiceWrapper.ps1 que gere arranque/paragem e registe eventos básicos.

# ServiceWrapper.ps1
param(
    [string]$ScriptToRun = "C:\path\to\script.ps1",
    [int]$IntervalSeconds = 60
)

$stopRequested = $false

# Capturar Ctrl+C/Stop
Register-ObjectEvent -InputObject $Host -EventName 'CancelKeyPress' -Action { $global:stopRequested = $true } | Out-Null

Write-EventLog -LogName Application -Source "MyPowerShellService" -EntryType Information -EventId 1000 -Message "Service starting"

while (-not $stopRequested) {
    try {
        & powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File $ScriptToRun
    }
    catch {
        Write-EventLog -LogName Application -Source "MyPowerShellService" -EntryType Error -EventId 1001 -Message "Script error: $_"
    }
    Start-Sleep -Seconds $IntervalSeconds
}

Write-EventLog -LogName Application -Source "MyPowerShellService" -EntryType Information -EventId 1002 -Message "Service stopping"

Passo 2: Criar um executável launcher com PowerShell

Para registar um serviço é mais prático ter um pequeno launcher exe. Podemos usar o utilitário sc.exe para apontar para uma instância do cmd.exe que invoque PowerShell. Isto evita ferramentas externas. Aqui criamos o serviço para executar cmd.exe /c powershell -File ServiceWrapper.ps1.

# Abrir PowerShell como Administrador e correr:
$serviceName = "MyPowerShellService"
$displayName = "My PowerShell Service"
$wrapperPath = 'C:\services\ServiceWrapper.ps1'  # caminho absoluto
$cmd = "C:\Windows\System32\cmd.exe /c powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File `"$wrapperPath`""

sc.exe create $serviceName binPath= "$cmd" start= auto DisplayName= "$displayName"

# Conceder permissão de escrever no Event Log (opcional, se usar Write-EventLog)
New-EventLog -LogName Application -Source "MyPowerShellService" -ErrorAction SilentlyContinue

Passo 3: Configurar conta e dependências do serviço

Por padrão o serviço corre como LocalSystem. Se o script precisa de rede ou de uma conta específica, altere a conta com sc.exe config. Também pode adicionar dependências com a tag depend=.

# Exemplo: configurar para usar uma conta de domínio
sc.exe config MyPowerShellService obj= "DOMAIN\ServiceUser" password= "P@ssw0rd"

# Exemplo: adicionar dependência no serviço de rede
sc.exe config MyPowerShellService depend= Tcpip/WinSock

Passo 4: Controlar o serviço (iniciar, parar, reiniciar)

Use comandos simples para gerir o serviço. No caso de problemas, verifique o Event Viewer e os ficheiros de log do seu script.

# Iniciar o serviço
Start-Service -Name MyPowerShellService

# Verificar estado
Get-Service -Name MyPowerShellService | Format-List Name,Status,ServiceType

# Parar o serviço
Stop-Service -Name MyPowerShellService -Force

# Reiniciar
Restart-Service -Name MyPowerShellService

Verificar o resultado

Confirme que o serviço aparece e corre como esperado: Get-Service mostra Status = Running. Verifique o Event Viewer (Application) para entradas com Source = MyPowerShellService e os EventId 1000/1002. Se o seu script grava ficheiros de log, confirme que são actualizados conforme o IntervalSeconds.

Conclusão

Agora tem um Serviço Windows básico que executa um script PowerShell em segundo plano e que responde a arranque/paragem. Próximos passos: proteger credenciais com o Windows Credential Manager, criar logs mais robustos ou empacotar o wrapper como um EXE com ferramentas como PS2EXE para maior controlo. Dica: teste sempre o wrapper manualmente antes de registar o serviço para evitar loops indesejados.