3

我想获取登录系统(Web 应用程序)的用户的 IP 地址和 MAC 地址。我正在使用这些代码行

    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

我正在使用这种方法来获取 MAC 地址,但问题是我正在获取计算机所有适配器的 MAC 地址。

我怎么知道哪一个是正确的?,如何获得连接到我网站的设备的正确 MAC 地址?

以及如何获取适配器的 IP。

当我在我的电脑上试用它时,它会提供 8 个带有 8 个 MAC 地址的适配器

我正在我的电脑上尝试,我有一个连接到 IntraNet 的有线连接,以及一个连接到 Internet 的无线连接。

4

6 回答 6

4

您永远无法获得连接到您网站的用户的 MAC 地址,当目标(您的网站的服务器)和源(客户端的计算机)之间发生套接字连接时,您只能获得源 IP 地址,因为 MAC 地址永远不会通过套接字连接(客户端 <--> 服务器)发送,以获取用户的 IP 地址:

using System.Net;

Private string GetIP()
{
string strHostName = "";
strHostName = System.Net.Dns.GetHostName();

IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);

IPAddress[] addr = ipEntry.AddressList;

return addr[addr.Length-1].ToString();

}

来源:这里

于 2012-04-29T13:24:33.740 回答
1
using System.Runtime.InteropServices;

[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;
}

这段代码会帮助你:)

于 2017-09-21T03:55:43.940 回答
0

您可以使用以下代码段获取 MAC 地址。要实现此功能,您需要在应用程序中添加 System.Management 命名空间。如果它不可用,您需要从项目的“添加引用”中添加它的引用。

using System.Management;
using System.IO;

public string GetMACAddress()
{
    string mac_src = "";
    string macAddress = "";

    foreach (System.Net.NetworkInformation.NetworkInterface nic in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up)
        {
            mac_src += nic.GetPhysicalAddress().ToString();
            break;
        }
    }

    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)
            {
                macAddress = macAddress.Insert(macAddress.Length, mac_src.Substring(i, 2));
            }
            else
            {
                macAddress = macAddress.Insert(macAddress.Length, mac_src.Substring(i, 2)) + "-";
            }
        }
    }
    return macAddress;
} 
于 2019-07-29T10:00:46.453 回答
0

当 IIS 使用代码部署此应用程序时..运行成功

   public string GetIPAddress()
    {
        System.Web.HttpContext context = System.Web.HttpContext.Current;
        string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ipAddress))
        {
            string[] addresses = ipAddress.Split(',');
            if (addresses.Length != 0)
            {
                return addresses[0];
            }
        }

        return context.Request.ServerVariables["REMOTE_ADDR"];
    }
    [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;
    }

 protected void Button1_Click1(object sender, EventArgs e)
    {  
        Label1.Text = GetClientMAC(GetIPAddress());
    }
于 2021-06-26T05:27:59.427 回答
0

.NET 和 JS 应用程序都无法访问 MAC 地址。MAC地址它永远不会通过套接字连接发送,只有IP地址,所以你只能获取IP,使用以下代码:

public string GetIPAddress()
{
    System.Web.HttpContext context = System.Web.HttpContext.Current;
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
}
于 2022-01-04T16:54:47.573 回答
-3

首先,很高兴知道您为什么想要客户(用户)的 MAC 地址,因为Mac 地址不是唯一的

您只能使用 .NET Framework 来获取 SERVER 连接,而不能使用它自己的用户,为此,为了获取客户端 MAC 地址,您只能依靠 javascript 和 ActiveX 控件,只能在 Internet Explorer 上用作 Firefox几年前已经弃用了它对 ActiveX 控件的支持。

可以在这篇文章中找到有关这方面的好读物。

于 2012-04-29T13:34:48.790 回答