Introduction
The AdapterInfo project is a simple C# .NET project that will report the "friendly" adapter name, the IP address assigned, and the physical (MAC) address for the user. This is helpful when an application needs to retrieve the MAC address for a certain IP address, or vice versa, when having only one piece of the puzzle. The project also demonstrates simple registry reads.
Project highlights
I found it advantageous to write this application because of the fact that the MAC address of a network adapter is not stored in an easy to get to location, such as the Registry. So, I needed a mechanism to connect the IP address of an adapter to the MAC address of it. Once the two are "matched", I then have the MAC address for my use. This is done by retrieving the "AdapterName
" field form the IP_Adapter_Addresses
data structure.
IntPtr PAdaptersAddresses = new IntPtr();
bool AdapterFound = false;
uint pOutLen = 100;
PAdaptersAddresses = Marshal.AllocHGlobal(100);
uint ret = GetAdaptersAddresses(0, 0, (IntPtr)0,
PAdaptersAddresses, ref pOutLen);
if (ret == 111)
{
Marshal.FreeHGlobal(PAdaptersAddresses);
PAdaptersAddresses = Marshal.AllocHGlobal((int) pOutLen);
ret = GetAdaptersAddresses(0, 0, (IntPtr)0,
PAdaptersAddresses, ref pOutLen);
}
IP_Adapter_Addresses adds = new IP_Adapter_Addresses();
IntPtr pTemp = PAdaptersAddresses;
IntPtr pTempIP = new IntPtr();
while (pTemp != (IntPtr)0)
{
Marshal.PtrToStructure(pTemp, adds);
string adapterName = Marshal.PtrToStringAnsi(adds.AdapterName);
string FriendlyName = Marshal.PtrToStringAuto(adds.FriendlyName);
string tmpString = string.Empty;
for (int i = 0; i < 6; i++)
{
tmpString += string.Format("{0:X2}", adds.PhysicalAddress[i]);
if (i < 5)
{
tmpString += ":";
}
}
RegistryKey theLocalMachine = Registry.LocalMachine;
RegistryKey theSystem = theLocalMachine.OpenSubKey(@"SYSTEM\Current" +
@"ControlSet\Services\Tcpip\Parameters\Interfaces");
RegistryKey theInterfaceKey = theSystem.OpenSubKey(adapterName);
if (theInterfaceKey != null)
{
string DhcpIPAddress = (string)theInterfaceKey.GetValue("DhcpIPAddress");
if (DhcpIPAddress != null)
{
string tArray = (string)
theInterfaceKey.GetValue("DhcpIPAddress", theInterfaceKey);
AdapterInfoTextBox.Text += "Network adapter: " +
FriendlyName.ToString() + "\r\n";
AdapterInfoTextBox.Text += "IP Address: " + tArray + "\r\n";
AdapterInfoTextBox.Text += "MAC Address: " + tmpString + "\r\n\r\n";
AdapterFound = true;
}
else
{
string[] tArray = (string[])
theInterfaceKey.GetValue("IPAddress", theInterfaceKey);
AdapterInfoTextBox.Text += "Network adapter: " +
FriendlyName.ToString() + "\r\n";
for (int Interface = 0; Interface < tArray.Length; Interface++)
{
AdapterInfoTextBox.Text += "IP Address: " +
tArray[Interface] + "\r\n";
AdapterFound = true;
}
AdapterInfoTextBox.Text += "MAC Address: " + tmpString + "\r\n\r\n";
}
}
pTemp = adds.Next;
}
if (AdapterFound != true)
{
AdapterInfoTextBox.Text += "No network adapters configured/present\r\n";
}
Wisconsin native living in Phoenix, AZ and enjoying the sun.
Software design and architecture for desktop and web solutions.
brian.d.riek@gmail.com