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

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

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; //添加引用,并导入命名空间 using System.Management; namespace WebApp { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Write("计算机名称: " + System.Net.Dns.GetHostName() + "<br>"); //调用GetMacAddress函数,获取网卡地址信息 Response.Write("MAC地址: " + GetMacAddress()); } /// <summary> /// 获取网卡地址信息 /// </summary> /// <returns></returns> string GetMacAddress() { try { string mac = ""; ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true) { mac = mo["MacAddress"].ToString(); break; } } moc = null; mc = null; return mac; } catch { return "unknow"; } } } }

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

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


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

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; //导入命名空间 using System.Runtime.InteropServices; namespace WebApp { public partial class WebForm2 : System.Web.UI.Page { [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 void Page_Load(object sender, System.EventArgs e) { try { string userip = Request.UserHostAddress; string strClientIP = Request.UserHostAddress.ToString().Trim(); Int32 ldest = inet_addr(strClientIP); //目的地的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)); } } } Response.Write("欢迎来自IP为" + userip + "<br>" + ",MAC地址为" + mac_dest + "的朋友!" + "<br>"); } catch (Exception err) { Response.Write(err.Message); } } } }

运行结果:
正在访问Localhost!

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

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

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

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

前台代码:(WebForm3.aspx)

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="WebApp.WebForm3" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> <mce:script language="javascript"><!-- document.write("<OBJECT id='locator' classid='CLSID:76A64158-CB41-11D1-8B02-00600806D9B6' VIEWASTEXT></OBJECT>"); document.write("<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>"); var MACAddr, IPAddr, sDNSName function getObject(objObject, objAsyncContext) { try { if (MACAddr == null && objObject.IPEnabled) { 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; } } catch (err) { } } function setValue(hResult, pErrorObject, pAsyncContext) { createTxt("txtMAC", MACAddr); createTxt("txtIp", IPAddr); createTxt("txtPCName", sDNSName); } function createTxt(txtName, txtValue) { var macTxt = document.createElement("INPUT"); macTxt.name = txtName; macTxt.value = txtValue; macTxt.type = "hidden"; try { document.forms[0].appendChild(macTxt); } catch (err) { //获取失败 } } document.getElementById("foo").attachEvent("OnObjectReady", getObject); document.getElementById("foo").attachEvent("OnCompleted", setValue); try { var service = locator.ConnectServer(); var MACAddr; var IPAddr; var DomainAddr; var sDNSName; service.Security_.ImpersonationLevel = 3; service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration'); } catch (err) { //获取失败 } // --></mce:script> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" /> </div> </form> </body> </html>

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

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApp { public partial class WebForm3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } /// <summary> /// 获取mac地址 /// </summary> /// <returns></returns> public string GetMACs() { try { return Request.Form["txtMAC"].ToString(); } catch { return ""; } } protected void Button1_Click(object sender, EventArgs e) { Response.Write(GetMACs()); } } }

运行提示:

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

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

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

运行结果:

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

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

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