Chequear si un host está en red (Win32_PingStatus class)

Introducción

Win32_PingStatus es una clase WMI (Windows Management Instrumentation), para acceder a estas clases usamos el cmdlet Get-WmiObject (alias : gwmi), podemos obtener un listado de todas las clases del equipo local con este cmdlet:

PS> Get-WmiObject -List

Si queremos obtenerla de un equipo remoto especificamos el equipo añadiendo -ComputerName 192.168.1.29 al cmdlet.

Buscamos la clase que nos interesa para este propósito

PS> Get-WmiObject -List | where {$_.name -Match "Ping"}

Ping básico

Vamos a elaborar un ejemplo super sencillo para testear la conectividad en red con otra máquina.

Fuente: Ping-Basic.ps1

$IpAddr = "Address='8.8.8.8'"
# Podemos usar Get-WmiObject o su alias gwmi 
Get-WmiObject Win32_PingStatus -filter $IpAddr

Ejecución:

PS> .\Ping-Basic.ps1

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms)
------        -----------     -----------      -----------                              -----    --------
M01166        8.8.8.8         8.8.8.8                                                   32       39

Código de estado

StatusCode: Un código 0 significa que la máquina ha respondido correctamente al ping, cualquier otro valor significa que se ha producido un problema. Vamos a ampliar el cmdlet inicial para acceder a las propiedad del objeto resultante de la llamada Get-WmiObject Win32_PingStatus.

Fuente: Ping-SatusCode.ps1

$IpAddr = "Address='8.8.8.8'"
$PingRes = Get-WmiObject Win32_PingStatus -filter $IpAddr

$SttCode = $PingRes.StatusCode
$Addr = $PingRes.Address

if ($SttCode -eq 0) {
    "$Addr status $SttCode OK"
} else {
    "Error"
}

Hacer ping a varias máquinas

Podemos hacer ping a más de una máquina encadenando varios host en una sentencia or por ejemplo:

PS> Get-WmiObject Win32_PingStatus -filter "Address='google.com' or Address='trello.com'"

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms)
------        -----------     -----------      -----------                              -----    --------
M01166        google.com      172.217.17.14                                             32       39
M01166        trello.com      104.83.74.177                                             32       44

Para que sea extensible vamos a mejorarlo un poco,

Fuente: Ping-Multiple.ps1

Rango de IPs

Ahora vamos a hacer ping contra un rango de IPs (por ejemplo de 8.8.8.1 a 8.8.8.254), usando un loop do..until controlamos el contador $i que va generando el último octeto de la IP, guardamos el objeto resultante de la llamada Get-WmiObject Win32_PingStatus en una variable y sólo mostramos la dirección IP que estamos probando y el código de estado del ping resultante.

Fuente: Ping-SubNet-basic.ps1

$i =1
$AddrIP = "8.8.8."
do { 
    $Ip4th = $AddrIP + $i   
    $PingRes = Get-WmiObject Win32_PingStatus -f "Address='$Ip4th'" 
    $PingRes | Format-Table Address, StatusCode -hideTableHeaders -auto; $i++
} until ($i -eq 254)

Códigos de estado del comando ping

  • 0 Success
  • 11001 Buffer Too Small
  • 11002 Destination Net Unreachable
  • 11003 Destination Host Unreachable
  • 11004 Destination Protocol Unreachable
  • 11005 Destination Port Unreachable
  • 11006 No Resources
  • 11007 Bad Option
  • 11008 Hardware Error
  • 11009 Packet Too Big
  • 11010 Request Timed Out
  • 11011 Bad Request
  • 11012 Bad Route
  • 11013 TimeToLive Expired Transit
  • 11014 TimeToLive Expired Reassembly
  • 11015 Parameter Problem
  • 11016 Source Quench
  • 11017 Option Too Big
  • 11018 Bad Destination
  • 11032 Negotiating IPSEC
  • 11050 General Failure

Test-NetConnection

Test-NetConnection

PS C:\> Test-NetConnection -ComputerName "google.com" -InformationLevel "Detailed"

ComputerName           : google.com
RemoteAddress          : 172.217.21.78
NameResolutionResults  : 172.217.21.78
InterfaceAlias         : Wi-Fi
SourceAddress          : 192.168.221.101
NetRoute (NextHop)     : 192.168.221.1
PingSucceeded          : True
PingReplyDetails (RTT) : 53 ms

Sockets .Net

Enlaces externos