A long, long time ago, managing Windows computers was a pretty simple task because most machines existed as stand-alone systems with dedicated resources like printers. Networking, if it existed, was simple and basic. Or course today we have much more complex environments which means there are many opportunities for problems. In this article I want to discuss some key networking tools and checks that should help you identity potential problems before they become serious and ensure a smooth running network.
One word before we get started: I'm assuming that all the systems you are checking are only using a single IPv4 network interface, presumably a desktop computer. You can use everything I'm going to cover to check a server with multiple network cards and IP addresses, but it might require a few extra steps on your part. I'm also going to assume you are running in a domain environment and running these checks with administrator credentials. They aren't required for some tests, but it's just as easy to use the same credential for everything.

Ping

Often the first network check is a 'ping'. This is the process of sending a special packet to a network address. The packet uses ICMP (Internet Control Message Protocol) to test network connectivity. When the remote computer receives this ping, it sends a response. The traditional tool is PING.EXE which is run from a command prompt. You can ping either a computer name or an IP address.
C:\>ping xplab
Pinging xplab.jdhlab.local [192.168.56.203] with 32 bytes of data:
Reply from 192.168.56.203: bytes=32 time<1ms TTL=128
Reply from 192.168.56.203: bytes=32 time<1ms TTL=128
Reply from 192.168.56.203: bytes=32 time<1ms TTL=128
Reply from 192.168.56.203: bytes=32 time=1ms TTL=128
Ping statistics for 192.168.56.203:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 1ms, Average = 0ms
The response merely means the networking stack is working. There is no guarantee that the operating system is functioning normally. More on that later. The best you can tell from this is that the computer is up and connected to the network.
Windows PowerShell offers a similar tool, the Test-Connection cmdlet. Again, specify a computer name or IP address.
PS C:\> Test-Connection xplab
Source' Destination IPV4Address'' IPV6Address Bytes Time(ms)
------' ----------- -----------'' ----------- ----- --------
CLIENT1 xplab'''''' 192.168.56.203 {}''''''''' 32''' 1
CLIENT1 xplab'''''' 192.168.56.203 {}''''''''' 32''' 0
CLIENT1 xplab'''''' 192.168.56.203 {}''''''''' 32''' 0
CLIENT1 xplab'''''' 192.168.56.203 {}''''''''' 32''' 1
The Source property is the name of the computer I am running this from, and Destination is the remote desktop. As you see, pretty similar results. It is possible that desktop firewalls may be configured to not respond to ICMP requests or pings so don't assume no reply means the computer is down or there is a problem. But assuming firewalls aren't an issue you'll receive errors if the computer is not running or if there are other problems such as name resolution.

NSLookup

Every computer in your Active Directory domain should be registered automatically with the DNS infrastructure that supports your domain. This should be automatic. Regardless, a computer without a valid name entry can run into problems or may be difficult to manage. The command line tool to test this is NSLOOKUP.EXE.
C:\>nslookup xplab
Server:' coredc01.jdhlab.local
Address:' 192.168.56.102
Name:''' xplab.jdhlab.local
Address:' 192.168.56.203
A name and address means the record in the forward lookup zone exits. Otherwise you would have received an error like this:
C:\>nslookup foo
Server:' coredc01.jdhlab.local
Address:' 192.168.56.102
*** coredc01.jdhlab.local can't find foo: Non-existent domain
The forward lookup record is just one half of the name resolution check. While not required, a reverse look up record should exist. This record takes an IP address and returns the name.
C:\>nslookup 192.168.56.203
Server:' coredc01.jdhlab.local
Address:' 192.168.56.102
*** coredc01.jdhlab.local can't find 192.168.56.203: Non-existent domain
Uh-oh. It would seem I'm missing a reverse lookup record.

Figure 1 Missing Reverse Lookup
Once corrected, I now get the expected NSLOOKUP result.
C:\>nslookup 192.168.56.203
Server:' coredc01.jdhlab.local
Address:' 192.168.56.102
Name:''' xplab.jdhlab.local
Address:' 192.168.56.203

RPC Connectivity

This is the type of connectivity that Windows computers had before TCP/IP became the networking standard. However, it is still vital because most remote management tools require RPC (Remote Procedure Call) connectivity. I'm going to lump a few things together in this category because in my experience they are related.
One easy way to test that you have RPC connectivity is to use the Computer Management console to connect to a remote computer. I take a short cut and click Start, Run, then type compmgmt.msc /computer:xplab. Assuming XPLAB is running and RPC is ok, I should get the computer management console.
Another test is to verify that the administrative shares exist. When File and Print sharing is enabled, which you often need for remote management, you should also get at least 2 hidden shares designed for administrators. The root of C:\ is shared as C$ and the Windows directory is shared as Admin$
C:\>dir \\xplab\c$
 Volume in drive \\xplab\c$ has no label.
 Volume Serial Number is 540A-24D4

 Directory of \\xplab\c$

12/10/2010' 08:07 AM''' ''''''''' 6d0a9979688d692da4562fcc1da3
12/21/2010' 11:01 AM'''''''''' 346,294 acme.txt
12/09/2010' 03:06 PM'''''''''''''''' 0 AUTOEXEC.BAT
12/09/2010' 03:06 PM'''''''''''''''' 0 CONFIG.SYS
12/10/2010' 07:48 AM''' ''''''''' Documents and Settings
01/17/2011' 04:02 PM''' ''''''''' Program Files
12/22/2010' 03:55 PM''' ''''''''' scripts
12/21/2010' 02:49 PM''''''''''' 10,986 test.txt
12/19/2010' 05:21 PM''' ''''''''' WINDOWS
12/22/2010' 04:01 PM''' ''''''''' work
'''''''''''''' 4 File(s)''''''' 357,280 bytes
'''''''''''''' 6 Dir(s)'' 4,636,114,944 bytes free
C:\>dir \\xplab\admin$
 Volume in drive \\xplab\admin$ has no label.
 Volume Serial Number is 540A-24D4

 Directory of \\xplab\admin$

12/19/2010' 05:21 PM''' ''''''''' .
12/19/2010' 05:21 PM''' ''''''''' ..
12/10/2010' 08:46 AM''' ''''''''' $NtUninstallKB968930$
01/17/2011' 03:31 PM'''''''''''''''' 0 0.log
12/09/2010' 09:54 AM''' ''''''''' addins
12/10/2010' 08:14 AM''' ''''''''' AppPatch
04/14/2008' 07:00 AM'''''''''''' 1,272 Blue Lace 16.bmp
12/10/2010' 02:30 PM'''''''''''''' 369 certmmc.log
04/14/2008' 07:00 AM''''''''''' 82,944 clock.avi
If I can see these shares then I know I should be able to remotely manage these computers. In PowerShell, this is even easier because I can use the Test-Path cmdlet.
PS C:\> test-path \\xplab\c$
True
PS C:\> test-path \\xplab\admin$
True
The last RPC-related task I might run is to use the NBTSTAT.EXE command line tool.
C:\>nbtstat -a xplab
Local Area Connection 2:
Node IpAddress: [192.168.56.202] Scope Id: []
NetBIOS Remote Machine Name Table
Name'''''''''''''' Type'''''''' Status
---------------------------------------------
XPLAB''''''''' <00>' UNIQUE''''' Registered
XPLAB''''''''' <20>' UNIQUE''''' Registered
JDHLAB'''''''' <00>' GROUP'''''' Registered
JDHLAB'''''''' <1E>' GROUP'''''' Registered
JDHLAB'''''''' <1D>' UNIQUE''''' Registered
..__MSBROWSE__.<01>' GROUP'''''' Registered
MAC Address = 08-00-27-84-C5-DC
The parameter is case-sensitive. Use 'a when using a computer name and 'A when using an IP address. The result shows me the associated Netbios names as well as the MAC address, ie the network adapter's physical address, which I think is a real bonus. If fact, sometimes this is such a handy piece of information that you might also use the GETMAC.EXE command line tool
C:\>getmac /s xplab
Physical Address''' Transport Name
=================== ====================================================
08-00-27-84-C5-DC'' \Device\Tcpip_{D9EEAE75-BAAA-4F84-896A-0F9032818EA3}

Windows Management Instrumentation

Perhaps no technology is more important to Windows management than WMI (Windows Management Instrumentation). It is important to verity that the WMI service is running and that you can query the WMI repository. If the wingmt service is not running, you will almost certainly run into problems. You can remotely check the service status using the SC.EXE command line tool.
C:\>sc \\xplab query winmgmt
SERVICE_NAME: winmgmt
TYPE'''''''''''''' : 20' WIN32_SHARE_PROCESS
STATE''''''''''''' : 4' RUNNING
(STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE''' : 0' (0x0)
SERVICE_EXIT_CODE' : 0' (0x0)
CHECKPOINT'''''''' : 0x0
WAIT_HINT''''''''' : 0x0
You can also use Windows PowerShell and the Get-Service cmdlet.
PS C:\> get-service winmgmt -ComputerName xplab
Status'' Name'''''''''''''' DisplayName
------'' ----'''''''''''''' -----------
Running' winmgmt''''''''''' Windows Management Instrumentation
By the way, this does not require PowerShell 2.0 or remoting on the remote computer, but it does require RPC connectivity.
Or you can use the graphical Services management console to connect to the remote machine and verify. I typically use the command shortcut services.msc /computer:COMPUTERNAME to launch and connect. Thus to check XPLAB I'd run services.msc /computer:xplab. Using the GUI you're looking for the Windows Management Instrumentation service.
A running service is only half of WMI. We also need to verify we can get information. One way to test is to use the WBEMTest utility. Launch it from Start-Run with the command wbemtest.


Figure 2 Launching WBEMTest

Click the connect button.


Figure 3 Connecting to a remote machine

In the Namespace field, enter computernamerootcimv2. The connection will be made with your current credentials which should have administrator rights on the remote computer. Optionally, you can enter in an alternate credential for User. Use the format domainusername. Then enter a password. You can leave everything else as is. Assuming everything is configured property, you should get something like Figure 4. Any errors should be clear enough to guide you in troubleshooting.


Figure 4 A Successful WMI Connection

Now let's execute a query. Click the Query button and enter a WMI query like 'Select * from win32_OperatingSystem'. Then click Apply.


Figure 5 A WMI Query

Assuming a valid query, you should get a result like Figure 6.


Figure 6 A WMI Query Result

At this point I've verified that WMI is running correctly on XPLAB. If you want to see the details, double click an entry in the Query Result window.


Figure 7 A WMI Object

To exit, simple close all the windows. An easier way to test WMI is to use Windows PowerShell and the Get-WMIObject cmdlet. Here's the same result but with an easy one-line command.
PS C:\> Get-WmiObject win32_operatingsystem -ComputerName xplab
SystemDirectory : C:\WINDOWS\system32
Organization''' : JDHLab
BuildNumber'''' : 2600
RegisteredUser' : Jeff
SerialNumber''' : 76487-341-0533244-22849
Version'''''''' : 5.1.2600
In this situation I'm not so much interested in the result as much as that I successfully returned something.

WinRM

One final network check which is vital if you are planning on leveraging the remoting features in PowerShell 2.0 is to verify that WinRM is configured and running. There are two components you will want to test. First, the WinRM service must be running. Again, we'll use the Get-Service cmdlet.
PS C:\> get-service winrm -ComputerName xplab
Status'' Name'''''''''''''' DisplayName
------'' ----'''''''''''''' -----------
Running' winrm''''''''''''' Windows Remote Management (WS-Manag...
The other piece of the puzzle is to verify the WS-MAN protocol using the Test-WSMan cmdlet.
PS C:\> test-wsman -ComputerName xplab
wsmid'''''''''' : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor'' : Microsoft Corporation
ProductVersion' : OS: 0.0.0 SP: 0.0 Stack: 2.0
You should get a result. To verify the WinRM configuration use the command line tool WinRM like this:
C:\>winrm get winrm/config -machine:xplab
Or use PowerShell. First connect to the remote computer.
PS C:\> Connect-WSMan xplab
This will create a new container in the WSMAN PSDrive.
PS C:\> cd wsman:
PS WSMan:\> dir
WSManConfig:
ComputerName''''''''''''''''''''''''''''''''' Type
------------''''''''''''''''''''''''''''''''' ----
xplab'''''''''''''''''''''''''''''''''''''''' Container
localhost'''''''''''''''''''''''''''''''''''' Container
You can look at different settings with a simple DIR command.
PS C:\> dir wsman:xplab
WSManConfig: Microsoft.WSMan.Management\WSMan::xplab
Name''''''''''''''' Value''''' Type
----''''''''''''''' -----''''' ----
MaxEnvelopeSizekb'' 150''''''' System.String
MaxTimeoutms''''''' 60000''''' System.String
MaxBatchItems'''''' 32000''''' System.String
MaxProviderRequests 4294967295 System.String
Client'''''''''''''''''''''''' Container
Service''''''''''''''''''''''' Container
Shell''''''''''''''''''''''''' Container
Listener'''''''''''''''''''''' Container
Plugin'''''''''''''''''''''''' Container
ClientCertificate''''''''''''' Container
PS C:\> dir wsman:xplab\client
Name'''''''''''' Value Type
----'''''''''''' ----- ----
NetworkDelayms'' 5000' System.String
URLPrefix''''''' wsman System.String
AllowUnencrypted false System.String
Auth'''''''''''''''''' Container
DefaultPorts'''''''''' Container
TrustedHosts'''' *'''' System.String
PS C:\> dir wsman:xplab\listener
WSManConfig: Microsoft.WSMan.Management\WSMan::xplab\Listener
Name''''''''''''''''''''' Type'''''''''''''''' Keys
----''''''''''''''''''''' ----'''''''''''''''' ----
Listener_641507880''''''' Container''''''''''' {Address=*, Transport=HTTP}
If all of this checks out with error, then PowerShell remoting should work for you.

A PowerShell Alternative

If you are like me, you don't necessarily want to manually have to run each of these network tests, tools and checks. Wouldn't it be nicer to have a command line tool so you could check the network health of a computer at a glance? I thought so which is why I wrote a PowerShell function called Get-NetworkStatus. You can download the complete file here.
This PowerShell script takes one or more computer names as parameters, or you can pipe a collection of names to it. The script runs through all of the tests I've discussed in this article in addition to a few other useful tidbits such as DHCP lease information. It then writes a custom object to the pipeline. Here's an example.
PS C:\> S:\Get-NetworkStatus.ps1 XPLAB
CShare''''''''' : False
Computername''' : XPLAB
LeaseObtained'' : 1/19/2011 9:22:58 AM
WMI'''''''''''' : False
AdapterHostname : xplab
Ping''''''''''' : True
AdminShare''''' : False
DHCPServer''''' : 192.168.56.102
WinRM'''''''''' : False
LeaseExpires''' : 1/27/2011 9:22:58 AM
DNSDomain'''''' : jdhlab.local
MACAddress''''' : 08-00-27-AD-81-3E
IPAddress'''''' : 192.168.56.203
ReverseLookup'' : True
DNSHostName'''' : XPLAB.jdhlab.local
I ran this command from another computer. I can tell that I have some issues with this machine that might cause problems later on such as a lack of access to administrative shares. It also looks like I can't get remote service information. Once I've corrected the misconfigurations on XPLAB, running my script again shows everything in order.
PS C:\> S:\Get-NetworkStatus.ps1 XPLAB
CShare''''''''' : True
Computername''' : XPLAB
LeaseObtained'' : 1/19/2011 9:22:58 AM
WMI'''''''''''' : True
AdapterHostname : xplab
Ping''''''''''' : True
AdminShare''''' : True
DHCPServer''''' : 192.168.56.102
WinRM'''''''''' : True
LeaseExpires''' : 1/27/2011 9:22:58 AM
DNSDomain'''''' : jdhlab.local
MACAddress''''' : 08-00-27-AD-81-3E
IPAddress'''''' : 192.168.56.203
ReverseLookup'' : True
DNSHostName'''' : XPLAB.jdhlab.local
Because this is PowerShell, you can incorporate it into more complex expressions. I leave you with an example that queries my Desktop computer organizational unit using the Active Directory module, then testing every computer. If the computer replies to a ping, then all of the network status information is exported to a CSV file.
PS C:\> import-module ActiveDirectory
PS C:\> Get-ADComputer -Filter * -SearchBase "OU=Desktops,DC=jdhlab,DC=local" |
>> Foreach {S:\Get-Networkstatus $_.Name} | Where {$_.Ping} |
>> Export-CSV -Path C:\Work\Desktop-Net-Report.csv -NoTypeInformation
This will take a while to run so you might prefer to use a background job. But the end result is CSV file you can open in Microsoft Excel for further reporting or analysis.