Como posso saber quando um Ping foi perdido ou não respondido?

Como posso saber quando um Ping foi perdido ou não respondido?

Quando instalo atualizações do Windows ou realizo outra manutenção que em algum momento envolve uma ou mais reinicializações automáticas, enfrento o mesmo desafio repetidamente há anos:

  1. Como posso verificar se a conexão de rede com um dispositivo específico foi interrompida e como posso registrar isso com timecode? Mesmo que a interrupção tenha durado apenas alguns segundos, como é comum ao reiniciar uma VM.

  2. Como posso descobrir quando e por quanto tempo ocorreu a interrupção da conexão de rede (= reinicialização) sem uma longa pesquisa nos arquivos de log?

  3. Existe alguma maneira de resolver esse desafio sem software especial? Somente com ferramentas do Windows como o PowerShell?

Responder1

Normalmente uso esse script para observar um ou mais computadores ligando e desligando.

# pinger.ps1

# example: pinger comp01
# pinger $list

param ($hostnames)

$pingcmd = 'test-connection'

$sleeptime = 1

$sawup = @{}
$sawdown = @{}

foreach ($hostname in $hostnames) { 
  $sawup[$hostname] = $false
  $sawdown[$hostname] = $false
}

while ($true) {
  foreach ($hostname in $hostnames) {
    if (& $pingcmd -count 1 $hostname -ea 0) {
      if (! $sawup[$hostname]) {
        echo "$([console]::beep(500,300))$hostname is up $(get-date)"
        $sawup[$hostname] = $true
        $sawdown[$hostname] = $false
      }
    } else {
      if (! $sawdown[$hostname]) {
        echo "$([console]::beep(500,300))$hostname is down $(get-date)"
date}
        $sawdown[$hostname] = $true
        $sawup[$hostname] = $false
      }
    }
  }
  sleep $sleeptime
}
pinger comp01,comp02

comp01 is up 12/02/2022 13:16:47
comp02 is up 12/02/2022 13:16:47

Responder2

Solução com PowerShell e Windows 10/Windows Server >= 2016:

  1. Faça ping no host continuamente e escreva a respostacomtimecode para um arquivo de texto (mas também exibi-lo na tela). Você pode usar um endereço IP ou nome de host aqui:

    $computer = "192.168.1.29"; ping.exe -t $computer | Foreach{"{0} - {1}" -f (Get-Date),$_} | Tee "$env:userprofile\documents\Ping_$computer.txt" -append
    
  2. Abra uma segunda janela do PowerShell e digite o seguinte comando. Isso monitorará continuamente o arquivo de texto da janela nº 1 do PowerShell e gerará todas as linhas que NÃO contêm a string "Resposta". Então, todos os momentos em que o ping não funcionou.

    Get-content "$env:userprofile\documents\Ping_192.168.1.29.txt" -Tail 0 -Wait | where { $_ -NotMatch "Reply" }
    

informação relacionada