Whenever I am doing large sweeps of the network that require connecting to a large number of workstations (e.g. file copy, wmi query, etc.), I prefer to check to see if I can even see the system. This avoids waiting for (WMI) timeouts and also aids in troubleshooting failures. If the file copy failed, why? Well, if I can’t ping it or it can’t be resolved, I would like to know right away and move on to the next host.
Of course, there are a couple downsides to this method. It does add overhead to the script because it too has a timeout. However, depending on the purpose of the script, this may be acceptable for the flexibility you gain. The other caveat is that the systems you run this against must allow ICMP on their local firewall or the script will just ignore them and move on to the next host.
There are several methods for pinging hosts but I’ve found this to be the most reliable since it works against any system that allows ICMP, even Linux or Macs. This is adapted from Richard Mueller’s ping script. This method will return three possible values: “Online”, “No Ping Reply”, or “No DNS/WINS Entry”. You can also tweak the ping command options to your liking.
Here is an example of how to call the function:
Dim computers(2), computer, pingable computers(0) = "pc-100.domain.local" computers(1) = "pc-200.domain.local" comptuers(2) = "pc-300.domain.local" For Each computer In computers Select Case IsConnectible(computer) Case "Online" wscript.echo computer & " is online" Case "No Ping Reply" wscript.echo computer & " is offline or firewall blocks ICMP" Case "No DNS/WINS Entry" wscript.echo computer & " cannot be found in DNS/WINS" Case "Host Unreachable" wscript.echo computer & " is unreachable" End Select Next
Here is the function:
Private Function IsConnectible(ByVal strComputer) ' Uses ping.exe to check if computer is online and connectible. ' Adapted from http://www.rlmueller.net/Programs/Ping1.txt Dim objShell, objExecObject, strText Set objShell = CreateObject("Wscript.Shell") ' use ping /? to find additional values for ping command; see -n and -w Set objExecObject = objShell.Exec("%comspec% /c ping -n 2 -w 750 " & strComputer) Do While Not objExecObject.StdOut.AtEndOfStream strText = strText & objExecObject.StdOut.ReadLine() Loop If InStr(strText,"could not find host") > 0 Then IsConnectible = "No DNS/WINS Entry" ElseIf (InStr(strText,"Reply from ") > 0) And (InStr(strText,": bytes=") > 0) Then IsConnectible = "Online" ElseIf InStr(strText,"Destination host unreachable") > 0 Then IsConnectible = "Host Unreachable" Else IsConnectible = "No Ping Reply" End If End Function