如何在 C# 中查找内部设备的 MAC 地址而不是路由器的 MAC 地址?

6

出于某些安全原因,我希望能够获取软件用户在网络中的物理地址(MAC地址),但是目前只能通过以下方式获取路由器的MAC地址。

public string GetMACAddress()
    {
        NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
        String sMacAddress = string.Empty;
        foreach (NetworkInterface adapter in nics)
        {
            if (sMacAddress == String.Empty)// only return MAC Address from first card  
            {
                IPInterfaceProperties properties = adapter.GetIPProperties();
                sMacAddress = adapter.GetPhysicalAddress().ToString();
            }
        } return sMacAddress;
    }

我需要获取访问我的软件的系统的特定MAC地址,以及该路由器的内部设备。通过C#是否可以实现?

3个回答

3

这个对我有用!

string macAddress = NetworkInterface
.GetAllNetworkInterfaces()
.Where( nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback )
.Select( nic => nic.GetPhysicalAddress().ToString() )
.FirstOrDefault();

https://dev59.com/x3RA5IYBdhLWcg3wuAYo#t6KdEYcBWogLw_1b9Kjt - user9401448
感谢 @Mihir,但是这个字符串获得的是我的路由器的 MAC 地址。我需要的是该路由器内部设备的 MAC 地址。 - Ali Imran
所以你能解释一下,“该路由器的内部设备”是什么意思吗?你在路由器上运行你的C#代码吗? - Mihir Dave

1
static string GetMacAddress()
{
    string macAddresses = "";
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) {
        // Only consider Ethernet network interfaces, thereby ignoring any
        // loopback devices etc.
        if (nic.NetworkInterfaceType != NetworkInterfaceType.Ethernet) continue;
        if (nic.OperationalStatus == OperationalStatus.Up) {
            macAddresses += nic.GetPhysicalAddress().ToString();
            break;
        }
    }
    return macAddresses;
}

这里获取,只需快速谷歌搜索即可。

1

这种方法是获取用户Mac地址的最佳方式。

[DllImport("Iphlpapi.dll")]
        private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
        [DllImport("Ws2_32.dll")]
        private static extern Int32 inet_addr(string ip);
        private static string GetClientMAC(string strClientIP)
        {
            string mac_dest = "";
            try
            {
                Int32 ldest = inet_addr(strClientIP);
                Int32 lhost = inet_addr("");
                Int64 macinfo = new Int64();
                Int32 len = 6;
                int res = SendARP(ldest, 0, ref macinfo, ref len);
                string mac_src = macinfo.ToString("X");

                while (mac_src.Length < 12)
                {
                    mac_src = mac_src.Insert(0, "0");
                }

                for (int i = 0; i < 11; i++)
                {
                    if (0 == (i % 2))
                    {
                        if (i == 10)
                        {
                            mac_dest = mac_dest.Insert(0, mac_src.Substring(i, 2));
                        }
                        else
                        {
                            mac_dest = "-" + mac_dest.Insert(0, mac_src.Substring(i, 2));
                        }
                    }
                }
            }
            catch (Exception err)
            {
                throw new Exception("Lỗi " + err.Message);
            }
            return mac_dest;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接