Invoke-WebRequest: baixar arquivos e testar URLs no PowerShell

Invoke-WebRequest: baixar arquivos e testar URLs no PowerShell

O servidor de atualização dos agentes de endpoint parou de responder num Patch Tuesday. O time de infra precisava checar se o endereço estava acessível, baixar o instalador manualmente e validar o hash SHA256 — tudo isso num servidor core sem interface gráfica. Três cmdlets de PowerShell resolveram em menos de dois minutos.

O que é o Invoke-WebRequest?

O Invoke-WebRequest é o cmdlet do PowerShell que faz requisições HTTP e HTTPS — equivalente ao curl no Linux ou ao wget. Ele retorna um objeto com o código de status, os headers da resposta, os cookies e o conteúdo. Está disponível desde o PowerShell 3.0 no Windows e no PowerShell 7+ em qualquer plataforma.

Qual a diferença entre Invoke-WebRequest e Invoke-RestMethod?

Invoke-WebRequest retorna o objeto HTTP completo — status, headers e conteúdo bruto. Invoke-RestMethod parseia a resposta JSON ou XML automaticamente e devolve um objeto PowerShell já pronto para uso. Para baixar arquivos ou checar disponibilidade de URLs, use Invoke-WebRequest. Para consumir APIs que respondem em JSON, Invoke-RestMethod é mais direto.

Baixar um arquivo com PowerShell

O caso de uso mais frequente: baixar um executável, script ou arquivo de configuração direto no terminal, sem abrir browser.

Invoke-WebRequest -Uri "https://exemplo.com/patch.msi" -OutFile "C:\Downloads\patch.msi"

O parâmetro -OutFile grava o conteúdo no caminho especificado. Sem ele, o conteúdo vai para a saída padrão — útil para processar em memória, mas ineficiente para arquivos grandes.

Em scripts de automação, desative a barra de progresso para ganhar velocidade — ela consome CPU desnecessariamente quando não há interface interativa:

$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri "https://exemplo.com/instalador.exe" -OutFile "C:\Temp\instalador.exe"
$ProgressPreference = 'Continue'

Depois do download, valide a integridade do arquivo com o hash SHA256 antes de executar qualquer coisa:

Get-FileHash -Path "C:\Temp\instalador.exe" -Algorithm SHA256

Compare o hash retornado com o valor publicado pelo fornecedor. Se não bater, o arquivo está corrompido ou adulterado — descarte e baixe de novo.

Verificar se uma URL está acessível

Como saber se um site ou serviço web está no ar usando PowerShell?

Use Invoke-WebRequest com -UseBasicParsing dentro de um bloco try/catch: código 200 significa que a URL responde, qualquer 5xx indica falha no servidor, e uma exceção capturada indica timeout ou erro de DNS.

try {
    $response = Invoke-WebRequest -Uri "https://meuservidor.empresa.com/health" `
        -UseBasicParsing -TimeoutSec 10
    Write-Host "Status: $($response.StatusCode)"
} catch {
    Write-Host "Falhou: $_"
}

O parâmetro -UseBasicParsing evita que o cmdlet tente processar o HTML como DOM — necessário em servidores sem Internet Explorer Engine (Windows Server Core, por exemplo) e mais eficiente em todos os casos.

Para monitorar vários endpoints de uma vez:

$urls = @(
    "https://servidor1.empresa.com/ping",
    "https://servidor2.empresa.com/ping",
    "https://api-interna.empresa.com/v1/health"
)

foreach ($url in $urls) {
    try {
        $r = Invoke-WebRequest -Uri $url -UseBasicParsing -TimeoutSec 5
        Write-Host "$url — $($r.StatusCode)"
    } catch {
        Write-Host "$url — ERRO: $($_.Exception.Message)"
    }
}

Esse script pode ser agendado com o schtasks para rodar a cada 5 minutos e gravar o resultado num log — transformando um teste manual em monitoramento contínuo.

Enviar headers e autenticação

APIs protegidas e servidores que bloqueiam User-Agents genéricos exigem headers personalizados. O parâmetro -Headers aceita uma hashtable:

$headers = @{
    "Authorization" = "Bearer SEU_TOKEN_AQUI"
    "Accept"        = "application/json"
    "User-Agent"    = "MonitorScript/1.0"
}

$response = Invoke-WebRequest -Uri "https://api.exemplo.com/dados" `
    -Headers $headers -UseBasicParsing

Para autenticação básica com usuário e senha, use Get-Credential — ele abre um prompt seguro sem expor a senha no script:

$cred = Get-Credential
Invoke-WebRequest -Uri "https://intranet.empresa.com/relatorio" `
    -Credential $cred -UseBasicParsing

Consumir APIs REST com Invoke-RestMethod

Quando a resposta é JSON, Invoke-RestMethod converte automaticamente para um objeto PowerShell — as propriedades ficam acessíveis diretamente por ponto, sem precisar de ConvertFrom-Json:

# Consulta a API pública do GitHub
$repo = Invoke-RestMethod -Uri "https://api.github.com/repos/PowerShell/PowerShell"
Write-Host "Stars: $($repo.stargazers_count)"
Write-Host "Atualizado em: $($repo.updated_at)"

Para uma API interna de segurança — um SIEM ou plataforma de threat intel — o padrão é o mesmo:

$alertas = Invoke-RestMethod -Uri "https://siem.empresa.com/api/alertas" -Headers $headers
$alertas | Where-Object { $_.severity -eq "critical" } | Select-Object title, timestamp

Alternativa para arquivos grandes: BITS

O Invoke-WebRequest não suporta retomada de download (pause/resume). Para arquivos grandes em conexões instáveis, o BITS (Background Intelligent Transfer Service) é mais robusto:

Start-BitsTransfer -Source "https://exemplo.com/arquivo-grande.iso" `
    -Destination "C:\Downloads\arquivo.iso"

O BITS usa largura de banda ociosa, retoma automaticamente após interrupção e integra com o agendador do Windows — ideal para atualizações que não precisam de entrega imediata.

Para instalações completas de software, o winget gerencia downloads e instalações de pacotes num único comando, sem precisar do Invoke-WebRequest manualmente. E para downloads recorrentes que precisam ser sincronizados em rede, o Robocopy complementa bem depois que os arquivos chegam localmente.

Conclusão

O Invoke-WebRequest resolve três problemas comuns sem abrir um browser ou instalar ferramentas extras: baixar arquivos, verificar disponibilidade de serviços e consumir APIs. O padrão try/catch com -TimeoutSec é o que transforma um teste manual num script de monitoramento real. Para cruzar esses resultados com o que está acontecendo no sistema operacional, veja como o Get-WinEvent permite correlacionar falhas HTTP com erros registrados nos logs do Windows — uma combinação útil em diagnósticos de serviços críticos.

Comentários