天天看點

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" οnclick="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

繼續閱讀