• ASP.NET获取客户端网卡使用的MAC地址信息


    方式一:利用.NET自带的类库直接就可以获得

    [c-sharp] view plaincopy

    1. using System; 

    2. using System.Collections.Generic; 

    3. using System.Linq; 

    4. using System.Web; 

    5. using System.Web.UI; 

    6. using System.Web.UI.WebControls; 

    7. //添加引用,并导入命名空间

    8. using System.Management; 

    9. namespace WebApp 

    10. { 

    11. public partial class WebForm1 : System.Web.UI.Page 

    12.     { 

    13. protected void Page_Load(object sender, EventArgs e) 

    14.         { 

    15.             Response.Write("计算机名称: " + System.Net.Dns.GetHostName() + "<br>"); 

    16. //调用GetMacAddress函数,获取网卡地址信息

    17.             Response.Write("MAC地址: " + GetMacAddress()); 

    18.         } 

    19. /// <summary>

    20. /// 获取网卡地址信息

    21. /// </summary>

    22. /// <returns></returns>

    23. string GetMacAddress() 

    24.         { 

    25. try

    26.             { 

    27. string mac = ""; 

    28.                 ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 

    29.                 ManagementObjectCollection moc = mc.GetInstances(); 

    30. foreach (ManagementObject mo in moc) 

    31.                 { 

    32. if ((bool)mo["IPEnabled"] == true

    33.                     { 

    34.                         mac = mo["MacAddress"].ToString(); 

    35. break

    36.                     } 

    37.                 } 

    38.                 moc = null

    39.                 mc = null

    40. return mac; 

    41.             } 

    42. catch

    43.             { 

    44. return "unknow"; 

    45.             } 

    46.         } 

    47.     } 

    48. } 

    运行结果:
    计算机名称: lenovo-05d886ff
    MAC地址: 00:26:22:05:8C:C7

    注意:上传到服务器测试,发现获得的是服务器的MAC地址

    方式二:通过win32特性获得
    优点:无需在客户端设置;
    缺点:无法获取服务器的mac(经测试总为0,其实感觉没有必要获取服务器的mac,所以也不算缺点)(能否跨网段获取还没有测试)

    [c-sharp] view plaincopy

    1. using System; 

    2. using System.Collections.Generic; 

    3. using System.Linq; 

    4. using System.Web; 

    5. using System.Web.UI; 

    6. using System.Web.UI.WebControls; 

    7. //导入命名空间

    8. using System.Runtime.InteropServices; 

    9. namespace WebApp 

    10. { 

    11. public partial class WebForm2 : System.Web.UI.Page 

    12.     { 

    13.         [DllImport("Iphlpapi.dll")] 

    14. private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length); 

    15.         [DllImport("Ws2_32.dll")] 

    16. private static extern Int32 inet_addr(string ip); 

    17. private void Page_Load(object sender, System.EventArgs e) 

    18.         { 

    19. try

    20.             { 

    21. string userip = Request.UserHostAddress; 

    22. string strClientIP = Request.UserHostAddress.ToString().Trim(); 

    23.                 Int32 ldest = inet_addr(strClientIP); //目的地的ip

    24.                 Int64 macinfo = new Int64(); 

    25.                 Int32 len = 6; 

    26. int res = SendARP(ldest, 0, ref macinfo, ref len); 

    27. string mac_src = macinfo.ToString("X"); 

    28. if (mac_src == "0") 

    29.                 { 

    30. if (userip == "127.0.0.1") 

    31.                     { 

    32.                         Response.Write("正在访问Localhost!"); 

    33.                     } 

    34. else

    35.                     { 

    36.                         Response.Write("欢迎来自IP为" + userip + "的朋友!" + "<br>"); 

    37.                     } 

    38. return

    39.                 } 

    40. while (mac_src.Length < 12) 

    41.                 { 

    42.                     mac_src = mac_src.Insert(0, "0"); 

    43.                 } 

    44. string mac_dest = ""; 

    45. for (int i = 0; i < 11; i++) 

    46.                 { 

    47. if (0 == (i % 2)) 

    48.                     { 

    49. if (i == 10) 

    50.                         { 

    51.                             mac_dest = mac_dest.Insert(0, mac_src.Substring(i, 2)); 

    52.                         } 

    53. else

    54.                         { 

    55.                             mac_dest = "-" + mac_dest.Insert(0, mac_src.Substring(i, 2)); 

    56.                         } 

    57.                     } 

    58.                 } 

    59.                 Response.Write("欢迎来自IP为" + userip + "<br>" + ",MAC地址为" + mac_dest + "的朋友!" + "<br>"); 

    60.             } 

    61. catch (Exception err) 

    62.             { 

    63.                 Response.Write(err.Message); 

    64.             } 

    65.         } 

    66.     } 

    67. } 

    运行结果:
    正在访问Localhost!

    注意:上传到服务器测试,发现获得的是服务器的MAC地址

    方式三:通过javascript加载ActiveX来实现:

    优点:任意获取mac地址(可以跨网段获取);

    缺点:需要在客户端浏览器中将activeX的选项全部打开,否则获取不到,所以不怎么稳定;

    前台代码:(WebForm3.aspx)

    [xhtml] view plaincopy

    1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="WebApp.WebForm3" %>

    2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    3. <html xmlns="http://www.w3.org/1999/xhtml" >

    4. <head runat="server">

    5. <title></title>

    6. <mce:script language="javascript"><!-- 

    7.         document.write("<OBJECT id='locator' classid='CLSID:76A64158-CB41-11D1-8B02-00600806D9B6' VIEWASTEXT></OBJECT>"); 

    8.         document.write("<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>"); 

    9.         var MACAddr, IPAddr, sDNSName 

    10.         function getObject(objObject, objAsyncContext) { 

    11.             try { 

    12.                 if (MACAddr == null && objObject.IPEnabled) { 

    13.                     if (objObject.MACAddress != null && objObject.MACAddress != "undefined") 

    14. MACAddr = objObject.MACAddress; 

    15.                     if (objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined") 

    16. IPAddr = objObject.IPAddress(0); 

    17.                     if (objObject.DNSHostName != null && objObject.DNSHostName != "undefined") 

    18. sDNSName = objObject.DNSHostName; 

    19.                 } 

    20.             } 

    21.             catch (err) 

    22.             { } 

    23.         } 

    24.         function setValue(hResult, pErrorObject, pAsyncContext) { 

    25.             createTxt("txtMAC", MACAddr); 

    26.             createTxt("txtIp", IPAddr); 

    27.             createTxt("txtPCName", sDNSName); 

    28.         } 

    29.         function createTxt(txtName, txtValue) { 

    30.             var macTxt = document.createElement("INPUT"); 

    31. macTxt.name = txtName; 

    32. macTxt.value = txtValue; 

    33. macTxt.type = "hidden"; 

    34.             try { 

    35.                 document.forms[0].appendChild(macTxt); 

    36.             } 

    37.             catch (err) { 

    38.                 //获取失败

    39.             } 

    40.         } 

    41.         document.getElementById("foo").attachEvent("OnObjectReady", getObject); 

    42.         document.getElementById("foo").attachEvent("OnCompleted", setValue); 

    43.         try { 

    44.             var service = locator.ConnectServer(); 

    45.             var MACAddr; 

    46.             var IPAddr; 

    47.             var DomainAddr; 

    48.             var sDNSName; 

    49. service.Security_.ImpersonationLevel = 3; 

    50.             service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration'); 

    51.         } 

    52.         catch (err) { 

    53.             //获取失败

    54.         } 

    55.

    56. // --></mce:script>

    57. </head>

    58. <body>

    59. <form id="form1" runat="server">

    60. <div>

    61.

    62. <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />

    63.

    64. </div>

    65. </form>

    66. </body>

    67. </html>

    后台代码:(WebForm3.aspx.cs)

    [c-sharp] view plaincopy

    1. using System; 

    2. using System.Collections.Generic; 

    3. using System.Linq; 

    4. using System.Web; 

    5. using System.Web.UI; 

    6. using System.Web.UI.WebControls; 

    7. namespace WebApp 

    8. { 

    9. public partial class WebForm3 : System.Web.UI.Page 

    10.     { 

    11. protected void Page_Load(object sender, EventArgs e) 

    12.         { 

    13.         } 

    14. /// <summary>

    15. /// 获取mac地址

    16. /// </summary>

    17. /// <returns></returns>

    18. public string GetMACs() 

    19.         { 

    20. try

    21.             { 

    22. return Request.Form["txtMAC"].ToString(); 

    23.             } 

    24. catch

    25.             { 

    26. return ""; 

    27.             } 

    28.         } 

    29. protected void Button1_Click(object sender, EventArgs e) 

    30.         { 

    31.             Response.Write(GetMACs()); 

    32.         } 

    33.     } 

    34. } 

    运行提示:

    clip_image001

    启用未标记为可安全执行脚本的ActiveX
    第一步:工具->Internet选项
    第二步:安全->Internet->自定义级别
    第三步:启用“对未标记为可安全执行脚本的ActiveX控件初始化并执行”,如下图所示:

    clip_image002

    运行结果:

    clip_image003

    总结:感觉第一种方法还是方便,第二种方法获得不到服务器的MAC地址,第三种方法还需设置,两个字“不爽”。

    参考:http://www.xueit.com/asp.net/show-6092-1.aspx

  • 相关阅读:
    图数据库的选择与对比(Neo4j)
    pip install ahocorasick报错以及Requirement already satisfied问题
    从知识图谱到认知图谱: 历史、发展与展望
    kafka(一)—— kafka安装简单使用
    python管理docker
    Javaweb前后端分离项目docker部署
    django + uwsgi + nginx部署(前后端不分离)
    坑(八)—— LayUI框架中append新的元素的问题
    docker(三)—— 避免一直输入sudo
    坑(七)—— 表单提交方式
  • 原文地址:https://www.cnblogs.com/zhangliang1988/p/3683368.html
Copyright © 2020-2023  润新知