您的位置:首页 > 编程语言 > ASP

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

2011-01-16 00:46 716 查看
方式一:利用.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());
        }
    }
}


运行提示:




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



运行结果:





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





参考:http://www.xueit.com/asp.net/show-6092-1.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: