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 SHA256Compare 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 -UseBasicParsingPara 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 -UseBasicParsingConsumir 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, timestampAlternativa 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