none
.net中如何获取客户端mac地址? RRS feed

  • 问题

  • 如题,要在ASP.net(c#)中能跑的。
    我试了两种方法。
    1.js
    <head runat="server">
        <title></title>
        <script type="text/jscript" language="jscript" event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for="foo">
         document.forms[0].txtMACAddr.value=unescape(MACAddr);
         document.forms[0].txtIPAddr.value=unescape(IPAddr);
         document.forms[0].txtDNSName.value=unescape(sDNSName);
         //document.formbar.submit();
        </script>
    
        <script type="text/jscript" language="jscript" event="OnObjectReady(objObject,objAsyncContext)" for="foo" >
           if (objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)   
           {
               if (objObject.MACAddress != null && objObject.MACAddress != "undefined") {
                   MACAddr = objObject.MACAddress;
               }
               if (objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined") {
                   IPAddr = objObject.IPAddress(0);
               }
               if (objObject.DNSHostName != null && objObject.DNSHostName != "undefined") {
                   sDNSName = objObject.DNSHostName;
               }
            }
      </script>
    
    <meta content="MSHTML 6.00.2800.1106" name="GENERATOR" />
        
    </head>
    <body>
        <object id="locator" classid="CLSID:76A64158-CB41-11D1-8B02-00600806D9B6" viewastext></object>
        <object id="foo" classid="CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223"></object>
        <script language="jscript" type="text/jscript">
            var service = locator.ConnectServer();
            var MACAddr;
            var IPAddr;
            var DomainAddr;
            var sDNSName;
            service.Security_.ImpersonationLevel = 3;
            service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
       </script>
        <form id="formfoo" name="formbar" action="index.do" method="post">
            <input  name="txtMACAddr" />
            <input  name="txtIPAddr" />
            <input name="txtDNSName" />
        </form>
    可是在vs2008中运行总报locator.ConnectServer 对象不支持此属性或方法

    2.
    public string getLocalMac()
            {
                string userip = System.Web.HttpContext.Current.Request.UserHostAddress;
                string strClientIP = System.Web.HttpContext.Current.Request.UserHostAddress.ToString().Trim();
                Int32 ldest = inet_addr(strClientIP); //目的地的ip 
                Int32 lhost = inet_addr("");   //本地服务器的ip 
                Int64 macinfo = new Int64();
                Int32 len = 6;
                int res = SendARP(ldest, 0, ref macinfo, ref len);
                string mac_src = macinfo.ToString("X");
                if (mac_src == "0")
                {
                    if(userip=="127.0.0.1")
                       Response.Write ("正在访问Localhost!");
                    else
                     Response.Write ("欢迎来自IP为" + userip + "的朋友!" + "<br>");
                     return;
                }
    
                while (mac_src.Length < 12)
                {
                    mac_src = mac_src.Insert(0, "0");
                }
    
                string mac_dest = "";
    
                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));
                        }
                    }
                }
                return mac_dest;
    
            }
    可是这只能在相同网段执行,过了路由就不行了。

    请问各位高手有办法解决吗?
    2009年10月16日 1:34

答案

  • 你好!

    ASP.NET 过了路由是不能获取客户端的 MAC 的,要获取只能能过 ActiveX

    知识改变命运,奋斗成就人生!
    • 已标记为答案 KeFang Chen 2009年10月19日 2:30
    2009年10月16日 1:40
    版主
  • 需要降低客户端的安全性,不是每一个用户都愿意降低的,并且只有IE支持,所以,依赖这些功能来实现业务,是不可取的


    【孟子E章】
    • 已标记为答案 KeFang Chen 2009年10月19日 2:30
    2009年10月16日 6:39
    版主
  • 如果没有特殊的需要~还是不要使用客户端MAC地址比较好~
    你的第二个方法是使用ARP协议根据目的主机的IP地址来获取目的主机的MAC地址~ARP请求包只会广播到局域网中的每一个主机~不会发送到局域网之外~所以过了路由当然就不行了咯~
    • 已标记为答案 KeFang Chen 2009年10月19日 2:30
    2009年10月16日 17:46
    版主

全部回复

  • 你好!

    ASP.NET 过了路由是不能获取客户端的 MAC 的,要获取只能能过 ActiveX

    知识改变命运,奋斗成就人生!
    • 已标记为答案 KeFang Chen 2009年10月19日 2:30
    2009年10月16日 1:40
    版主
  • 那怎么使用ActiveX啊?我对ActiveX不怎么了解!能具体介绍一下吗?

    2009年10月16日 1:56
  • AcitveX 会受客户端的安全限制,如果没有必要,建议使用IP的方式。
    知识改变命运,奋斗成就人生!
    2009年10月16日 2:15
    版主
  • 需要降低客户端的安全性,不是每一个用户都愿意降低的,并且只有IE支持,所以,依赖这些功能来实现业务,是不可取的


    【孟子E章】
    • 已标记为答案 KeFang Chen 2009年10月19日 2:30
    2009年10月16日 6:39
    版主
  • 如果没有特殊的需要~还是不要使用客户端MAC地址比较好~
    你的第二个方法是使用ARP协议根据目的主机的IP地址来获取目的主机的MAC地址~ARP请求包只会广播到局域网中的每一个主机~不会发送到局域网之外~所以过了路由当然就不行了咯~
    • 已标记为答案 KeFang Chen 2009年10月19日 2:30
    2009年10月16日 17:46
    版主