Como criar um Serviço Windows com PowerShell: passo a passo
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.