Monitoramento de Estações Windows com PowerShell e Tarefa Agendada (Estilo Cron)

Precisei criar um mecanismo simples para monitorar estações Windows e enviar periodicamente para minha API informações básicas:

  • Nome da estação
  • IP interno
  • Status (online)

Tudo isso sem instalar nada além do próprio Windows.

1. O Script PowerShell (status.ps1)

# Nome e IP
$hostname = $env:COMPUTERNAME
$ip = (Get-NetIPAddress -AddressFamily IPv4 `
        | Where-Object { $_.IPAddress -notlike "169.254.*" -and $_.IPAddress -ne "127.0.0.1" } `
        | Select-Object -First 1 -ExpandProperty IPAddress)

# Endpoint completo
$uri = "http://api/statuspphp=online&estacao=$hostname&ip=$ip"

# Log local
$log = "C:\status_reporter.log"

try {
    Invoke-WebRequest -Uri $uri -UseBasicParsing -TimeoutSec 5
    $msg = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') OK - $hostname / $ip"
}
catch {
    $msg = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ERRO - $hostname / $ip - $($_.Exception.Message)"
}

Add-Content -Path $log -Value $msg

Esse arquivo deve ficar em:

C:\Scripts\status.ps1

Sugiro que rode o arquivo pelo powerShell manualmente pra teste, e, caso não funcione pela regra de bloqueio de scripts, clique aqui para ler o post de como liberar essa função.

2. Criando a Tarefa Agendada (como um cron de 5 minutos)

A ideia é rodar no startup e depois a cada 5 minutos, infinitamente.

Execute em PowerShell (admin):

# Trigger 1: no boot
$triggerBoot = New-ScheduledTaskTrigger -AtStartup

# Trigger 2: a cada 5 minutos, duração "infinita aceitável"
$trigger5 = New-ScheduledTaskTrigger `
    -Once -At (Get-Date) `
    -RepetitionInterval (New-TimeSpan -Minutes 5) `
    -RepetitionDuration (New-TimeSpan -Days 365)

# Ação 100% silenciosa
$action = New-ScheduledTaskAction `
    -Execute "powershell.exe" `
    -Argument "-WindowStyle Hidden -ExecutionPolicy Bypass -File C:\Monitor\status.ps1 > $null 2>&1"

# Registrar a tarefa
Register-ScheduledTask `
    -TaskName "StatusReporterDevdata" `
    -Trigger $triggerBoot, $trigger5 `
    -Action $action `
    -RunLevel Highest

3. Resultado

Pronto:
Cada estação Windows envia automaticamente para sua API o status atual, hostname e IP interno — sem depender de usuário, sem instalar cURL, sem serviço adicional.

Rolar para cima