Agendando tarefas no Windows com PowerShell e Task Scheduler

1. Introdução ao Task Scheduler e PowerShell

O Agendador de Tarefas do Windows (Task Scheduler) é um componente essencial para automação de processos no sistema operacional Windows. Ele permite executar programas, scripts e comandos em horários específicos, em resposta a eventos do sistema ou em intervalos regulares. Quando combinado com o PowerShell, o Task Scheduler se torna ainda mais poderoso, oferecendo automação programática completa.

Utilizar o PowerShell para gerenciar tarefas agendadas oferece diversas vantagens: repetibilidade, versionamento de scripts, integração com pipelines de CI/CD e a capacidade de criar, modificar e remover tarefas em lote. O módulo ScheduledTasks fornece cmdlets nativos para essa finalidade, disponível no Windows 10, Windows Server 2016 e versões posteriores.

Pré-requisitos:
- Windows PowerShell 5.1 ou PowerShell 7+
- Módulo ScheduledTasks (carregado automaticamente)
- Permissões administrativas para criar/alterar tarefas no sistema
- Política de execução que permita scripts (Set-ExecutionPolicy RemoteSigned)

Para verificar se o módulo está disponível:

Get-Module -ListAvailable -Name ScheduledTasks
Import-Module ScheduledTasks

2. Criando tarefas básicas com cmdlets do PowerShell

A criação de uma tarefa agendada envolve três componentes principais: gatilho (trigger), ação (action) e o registro da tarefa propriamente dito.

Exemplo básico: Executar um script de backup toda noite às 23h.

$trigger = New-ScheduledTaskTrigger -Daily -At "23:00"
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-File `"C:\Scripts\backup.ps1`""
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
    -LogonType ServiceAccount -RunLevel Highest

Register-ScheduledTask -TaskName "BackupDiario" `
    -Trigger $trigger `
    -Action $action `
    -Principal $principal `
    -Description "Backup automático de arquivos"

Gatilhos comuns:
- -Daily -At "08:00" — execução diária
- -Weekly -WeeksInterval 1 -DaysOfWeek Monday -At "06:00" — semanal
- -AtLogOn — quando o usuário faz logon
- -AtStartup — na inicialização do sistema

Ações suportadas: executar programa, enviar email (obsoleto) ou exibir mensagem.

3. Gerenciando tarefas existentes

O PowerShell oferece cmdlets intuitivos para gerenciar tarefas já registradas.

Listando tarefas:

Get-ScheduledTask | Where-Object {$_.State -eq "Ready"} | Format-Table TaskName, State

Habilitando/desabilitando:

Disable-ScheduledTask -TaskName "BackupDiario"
Enable-ScheduledTask -TaskName "BackupDiario"

Removendo tarefas:

Unregister-ScheduledTask -TaskName "BackupDiario" -Confirm:$false

Obtendo detalhes completos:

Get-ScheduledTask -TaskName "BackupDiario" | Select-Object *

4. Configurações avançadas de gatilhos e condições

Para cenários mais complexos, é possível criar gatilhos baseados em eventos específicos do sistema.

Gatilho por evento do sistema (ID 100 do log System):

$trigger = New-ScheduledTaskTrigger -AtStartup
$trigger = New-ScheduledTaskTrigger -Custom -RepetitionInterval (New-TimeSpan -Minutes 30) `
    -RepetitionDuration (New-TimeSpan -Days 1)

Condições de execução avançadas: controlam quando a tarefa deve ou não executar.

$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries:$false `
    -StopIfGoingOnBatteries:$true `
    -RunOnlyIfNetworkAvailable:$true `
    -IdleDuration (New-TimeSpan -Minutes 10) `
    -IdleWaitTimeout (New-TimeSpan -Minutes 30)

Register-ScheduledTask -TaskName "LimpezaLogs" `
    -Trigger $trigger `
    -Action $action `
    -Settings $settings

Repetição e duração: útil para tarefas que devem ser executadas múltiplas vezes.

$trigger.RepetitionInterval = New-TimeSpan -Minutes 15
$trigger.RepetitionDuration = New-TimeSpan -Hours 2

5. Trabalhando com credenciais e segurança

Executar tarefas com contas específicas e privilégios adequados é crucial para segurança.

Usando New-ScheduledTaskPrincipal:

$principal = New-ScheduledTaskPrincipal -UserId "DOMINIO\Usuario" `
    -LogonType Password `
    -RunLevel Highest

Armazenando credenciais de forma segura:

$cred = Get-Credential
$cred | Export-Clixml -Path "C:\Segredos\credencial.xml"

# Recuperando posteriormente
$cred = Import-Clixml -Path "C:\Segredos\credencial.xml"

Executando com conta de sistema:

$principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" `
    -LogonType ServiceAccount -RunLevel Highest

6. Automação de scripts PowerShell como tarefas agendadas

Scripts .ps1 são os candidatos ideais para automação via Task Scheduler.

Criando tarefa que executa script com argumentos:

$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-NoProfile -ExecutionPolicy Bypass -File `"C:\Scripts\relatorio.ps1`" -Param1 Valor1 -Param2 Valor2"

Configurando política de execução: para evitar erros, configure o sistema para permitir scripts.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine

Logging e saída: redirecione a saída para arquivos de log.

$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-File `"C:\Scripts\processo.ps1`" >> `"C:\Logs\processo_$(Get-Date -Format yyyyMMdd).log`" 2>&1"

7. Monitoramento e manutenção de tarefas

Manter o controle sobre a execução das tarefas é fundamental para garantir que a automação está funcionando.

Verificando histórico de execução:

Get-ScheduledTaskInfo -TaskName "BackupDiario" | Format-List *

Tratamento de falhas e notificações: inclua lógica de notificação no próprio script.

try {
    # Código do backup
    # Se falhar, envia email
    Send-MailMessage -To "admin@empresa.com" `
        -Subject "Falha no backup" `
        -Body "O backup não foi concluído." `
        -SmtpServer "smtp.empresa.com"
} catch {
    Write-EventLog -LogName Application -Source "BackupScript" `
        -EventId 1001 -EntryType Error -Message $_.Exception.Message
}

Exportando e importando tarefas (XML):

# Exportar
Export-ScheduledTask -TaskName "BackupDiario" | Out-File "C:\BackupTarefas\BackupDiario.xml"

# Importar
Register-ScheduledTask -Xml (Get-Content "C:\BackupTarefas\BackupDiario.xml" -Raw) `
    -TaskName "BackupDiario"

8. Exemplos práticos e boas práticas

Exemplo 1: Backup automático de diretório toda noite

$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-File `"C:\Scripts\backup_diario.ps1`""
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount

Register-ScheduledTask -TaskName "Backup_Arquivos_Criticos" `
    -Trigger $trigger -Action $action -Principal $principal `
    -Description "Backup dos arquivos do servidor"

Exemplo 2: Limpeza de logs do sistema semanalmente

$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At "03:00"
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-Command `"Get-EventLog -LogName System -After (Get-Date).AddDays(-7) | Clear-EventLog`""
Register-ScheduledTask -TaskName "Limpeza_Logs_Sistema" `
    -Trigger $trigger -Action $action

Boas práticas:
- Nomenclatura consistente: use prefixos como Backup_, Limpeza_, Monitor_
- Documentação: mantenha um script mestre com todas as tarefas registradas
- Testes: execute cada tarefa manualmente antes de agendar
- Versionamento: salve os scripts de criação em repositório Git
- Logs centralizados: configure todas as tarefas para escrever logs no mesmo diretório
- Notificações: implemente alertas para falhas críticas

Referências