当前位置:编程学习 > C#/ASP.NET >>

跨网段,如何获取客户端的MAC地址!求助!

在登录系统时,希望可以获取到客户端的MAC地址,保留到数据库中。 同网段的MAC地址可以获取到,但一旦跨网段或走一下路由就无法获取到MAC地址。郁闷中。。小弟新手,求解。。。。。 --------------------编程问答--------------------    去收一下,网上有很多现成的方法。 --------------------编程问答-------------------- 这个够详细吧

 protected void Page_Load(object sender, EventArgs e)
    {
        //ReadMSG();
       
        if (!IsPostBack)
        {
            Label1.Text =
            "//客户端ip:" +

            Request.ServerVariables.Get("Remote_Addr").ToString() + "<br>" +
               " //客户端主机名:" +
            Request.ServerVariables.Get("Remote_Host").ToString() + "<br>" +
                "//客户端浏览器IE:" +
            Request.Browser.Browser + "<br>" +
                "//客户端浏览器 版本号:" +
            Request.Browser.MajorVersion + "<br>" +
                "//客户端操作系统:" +
            Request.Browser.Platform + "<br>" +
                "//服务器ip:" +
            Request.ServerVariables.Get("Local_Addr").ToString() + "<br>" +
                "//服务器名:" +
            Request.ServerVariables.Get("Server_Name").ToString() + "<br>";

            string stringMAC = "";
            string stringIP = "";
            ManagementClass MC = new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection MOC = MC.GetInstances();

            foreach (ManagementObject MO in MOC)
            {
                if ((bool)MO["IPEnabled"] == true)
                {
                    stringMAC += MO["MACAddress"].ToString(); //获取网卡的地址
                    string[] IPAddresses = (string[])MO["IPAddress"]; //获取本地的IP地址
                    if (IPAddresses.Length > 0)
                        stringIP = IPAddresses[0];
                    Label1.Text += "<br>MAC:" + stringMAC + "/ IP:" + stringIP;
                    if (stringIP == "192.168.1.45")
                           Label1.Text += "<br>I get you :192.168.1.45<br>";
                }
            }


            //在页面上打印出客户端的网卡物理地址(MAC)
            //Response.Write(this.GetMac(Request.UserHostAddress.ToString())+"<br>");
            GetInfo();
        }
    }
    //获取cpu序列号,硬盘ID,网卡MAC地址
    private void GetInfo()
    {
        string cpuInfo = "";//cpu序列号
        ManagementClass cimobject = new ManagementClass("Win32_Processor");
        ManagementObjectCollection moc = cimobject.GetInstances();
        foreach (ManagementObject mo in moc)
        {
            cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
                Label1.Text += "cpu序列号:" + cpuInfo.ToString();
        }

        //获取硬盘ID
        String HDid;
        ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
        ManagementObjectCollection moc1 = cimobject1.GetInstances();
        foreach (ManagementObject mo in moc1)
        {
            HDid = (string)mo.Properties["Model"].Value;
               Label1.Text += "硬盘序列号:" + HDid.ToString();
        }

    }

    //protected void Button1_Click(object sender, EventArgs e)
    //{

    //    try
    //    {
    //        File.Delete(@"D:\html.html");
    //    }
    //    catch (Exception e2)
    //    {
    //        Response.Write(e2.Message);
    //    }
    //    Response.Write("Delete Successed!");

    //}



    //获取远程客户端的网卡物理地址(MAC)
    public string GetMac(string IP)   //para IP is the client's IP
    {
        string dirResults = "";
        ProcessStartInfo psi = new ProcessStartInfo();
        Process proc = new Process();
        psi.FileName = "nbtstat";
        psi.RedirectStandardInput = false;
        psi.RedirectStandardOutput = true;
        psi.Arguments = "-A " + IP;
        psi.UseShellExecute = false;
        proc = Process.Start(psi);
        dirResults = proc.StandardOutput.ReadToEnd();
        proc.WaitForExit();
        dirResults = dirResults.Replace("\r", "").Replace("\n", "").Replace("\t", "");

        Regex reg = new Regex("Mac[ ]{0,}Address[ ]{0,}=[ ]{0,}(?<key>((.)*?))__MAC", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        Match mc = reg.Match(dirResults + "__MAC");

        if (mc.Success)
        {
            return mc.Groups["key"].Value;
        }
        else
        {
            reg = new Regex("Host not found", RegexOptions.IgnoreCase | RegexOptions.Compiled);
            mc = reg.Match(dirResults);
            if (mc.Success)
            {
                return "Host not found!";
            }
            else
            {
                return "";
            }
        }
    }



--------------------编程问答--------------------
引用 2 楼 wisdonlz 的回复:
这个够详细吧


 //获取远程客户端的网卡物理地址(MAC)
    public string GetMac(string IP)   //para IP is the client's IP
    {
        string dirResults = "";
        ProcessStartInfo psi = new ProcessStartInfo();
        Process proc = new Process();
        psi.FileName = "nbtstat";
        psi.RedirectStandardInput = false;
        psi.RedirectStandardOutput = true;
        psi.Arguments = "-A " + IP;
        psi.UseShellExecute = false;
        proc = Process.Start(psi);
        dirResults = proc.StandardOutput.ReadToEnd();
        proc.WaitForExit();
        dirResults = dirResults.Replace("\r", "").Replace("\n", "").Replace("\t", "");

        Regex reg = new Regex("Mac[ ]{0,}Address[ ]{0,}=[ ]{0,}(?<key>((.)*?))__MAC", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        Match mc = reg.Match(dirResults + "__MAC");

        if (mc.Success)
        {
            return mc.Groups["key"].Value;
        }
        else
        {
            reg = new Regex("Host not found", RegexOptions.IgnoreCase | RegexOptions.Compiled);
            mc = reg.Match(dirResults);
            if (mc.Success)
            {
                return "Host not found!";
            }
            else
            {
                return "";
            }
        }
    }


这个返回的是空值呀。我原先就是用这个方法。比如说服务器是在172.*.*.* ;但客户端是通过路由连接的,他的IP是192.*.*.* 这样就取不到了。


网上的那些代码是只能去的本网段的MAC地址。跨网段就不行了。 --------------------编程问答-------------------- 读取网卡地址
using System.Management;

string strMac = string.Empty;
        ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection moc = mc.GetInstances();

        foreach (ManagementObject mo in moc)
        {
            if ((bool)mo["IPEnabled"] == true)
            {
                strMac += mo["MacAddress"].ToString() + "";
            }
        }
        Label1.Text = strMac; --------------------编程问答--------------------
引用 4 楼 zmcici 的回复:
读取网卡地址
using System.Management;

string strMac = string.Empty;
  ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
  ManagementObjectCollection moc = mc.GetInstances(……


问下 ManagementClass 这个类是???
没找到。 --------------------编程问答-------------------- 我也是遇到同样问题,楼主解决了,记得分享下啊 --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 有点黑客味道 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 5 楼 ftart 的回复:
引用 4 楼 zmcici 的回复:
读取网卡地址
using System.Management;

string strMac = string.Empty;
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = ……


不用问。取本地MAC地址,跟你的毫无关系。 --------------------编程问答-------------------- 取不到浏览者的mac地址吧.
要么通过flash看看能实现不? --------------------编程问答-------------------- internet是不传递MAC的,只传递IP。即使是IP,也只是NAT路由器映射的地址和(临时)端口,而不是内网客户机的。

除非客户机部署有你的本地程序。 --------------------编程问答--------------------
引用 11 楼 kkbac 的回复:
取不到浏览者的mac地址吧.
要么通过flash看看能实现不?


按理说,如果flash有这个功能,那么这就是个漏洞。对于silverlight也是一样。

当然这要看具体怎样实现。例如silverlight当切换为桌面应用程序模式时,客户端要弹出严重的警告,而且也要客户确认了才可以切换。 --------------------编程问答-------------------- 有解决的办法吗?现在正在找这解决方案,楼主解决的话,记得分享下啊!谢谢! --------------------编程问答-------------------- 大家解决了没有,我也正需要获取跨网段的MAC,不知有什么好的方法?
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,