How to retrieve Network Interfaces using C#

.NET programming topics
Post Reply
User avatar
Saman
Lieutenant Colonel
Lieutenant Colonel
Posts: 828
Joined: Fri Jul 31, 2009 10:32 pm
Location: Mount Lavinia

How to retrieve Network Interfaces using C#

Post by Saman » Thu Mar 11, 2010 1:13 am

The following code is used to retrieve the network interfaces in C#. You may recognize the network interfaces as Network and Dial-up Connections: You can access them by using "Start > Setting > Network and Dial-up Connections". C# does not provide a simple way of retrieving this list. The solution includes two main steps, which follow:

Step 1: Retrieve the Network Adapters
Get all the Network Adapters, which are IP-enabled, and their Setting ID. We use the ManagementClass: Win32_NetworkAdapterConfiguration to achieve this. The "SettingID" property of the ManagementObject is actually the Registry key.

Step 2: Extract information from the Registry
According the "SettingID", extract the following value from the Registry:

Code: Select all

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\control\Network\{xxxxxx}\<SettingID>\connection
Where {xxxxxx} is an unknown value, there for we go over all the keys under SYSTEM\CurrentControlSet\control\Network\ and <SettingID> is the values we found in Step 1.

Code: Select all

using Microsoft.Win32;
using System.Management;

// holds the network interfaces names (such as "Local Area Connection")
private string[] networkInterfaces = new string[MAX_CONNECTIONS];

// holds the network interface Registry key (which is the SettingID
// of the adapter, such as: B76D5407-4610-499A-A8A5-50AAD2A2297E)
private string[] networkInterfacesSettingId = new string[MAX_CONNECTIONS];

// holds the number of network interfaces found
private int numberOfNetworkInterfaces = 0;

// extract all the IP-enabled adapters and get their SettingID
// (which is the Registry key)
ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection objMOC = objMC.GetInstances();

foreach(ManagementObject objMO in objMOC)
{
	if( Convert.ToBoolean(objMO["ipEnabled"]) == false )
		continue;

	string SettingID = "";
	try
	{
		networkInterfacesSettingId[numberOfNetworkInterfaces] = (string)objMO["SettingID"];
		++numberOfNetworkInterfaces;
	}
	catch{}
}

if(numberOfNetworkInterfaces == 0)
{
	MessageBox.Show("No Network Interface were found on this local machine", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
	return;
}

int j=0;

// The network interfaces are in the following path in the Registry:
// HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\control\Network\{xxxxxx}\SettingID\connection

RegistryKey networkRegistry = currentMachineRegistry.OpenSubKey("SYSTEM\\CurrentControlSet\\control\\Network");
int num = networkRegistry.SubKeyCount;
string[] tmp = networkRegistry.GetSubKeyNames();
for(int i=0; i<num; ++i)
{
	// get all the {xxxxxx} keys under 'Network'
	RegistryKey conReg = networkRegistry.OpenSubKey(tmp[i]);
	if(conReg != null)
	{
		string[] tmp1 = conReg.GetSubKeyNames();
		if(tmp1.Length > 0)
		{
			for(int k=0; k<tmp1.Length; ++k)
			{
				// get all the <SettingID> keys under 'Network\{xxxxxx}'
				RegistryKey reg = conReg.OpenSubKey(tmp1[k]);
				if(reg != null)
				{
					int gg = Array.BinarySearch(
					networkInterfacesSettingId, 0, 
					numberOfNetworkInterfaces, tmp1[k]);
					if(gg >= 0)
					{
						// This subkey was found in the
						// networkInterfacesSettingId array - which means
						// that this is a valid network interface -
						// let's get the interface name
						// get the 'connection' key under
						// 'Network\{xxxxxx}\<SettingID>'
						RegistryKey r = reg.OpenSubKey("connection");
						if(r != null)
						{
							Object obj = r.GetValue("Name");
							networkInterfaces[gg] = obj.ToString();
						}
					}
				}
			}
		}
	}
}
FrmNetworkConnection.zip
(3.01 KiB) Downloaded 345 times
Post Reply

Return to “.NET Programming”