方式一:利用.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());
}
}
}
運作提示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuAVWzgjM2MDMxETN5ITMfBzLcVTMvwVMwETMwIzLcRnbl1GajFGd0F2LcRXZu5ibkN3YukGavw1LcpDc0RHaiojIsJye.gif)
啟用未标記為可安全執行腳本的ActiveX
第一步:工具->Internet選項
第二步:安全->Internet->自定義級别
第三步:啟用“對未标記為可安全執行腳本的ActiveX控件初始化并執行”,如下圖所示:
運作結果:
總結:感覺第一種方法還是友善,第二種方法獲得不到伺服器的MAC位址,第三種方法還需設定,兩個字“不爽”。
參考:http://www.xueit.com/asp.net/show-6092-1.aspx