近日在做一個投票系統中有這樣一個需求:為了防止惡意拉票或刷票,需要通過遠程用戶端的IP地址
來擷取用戶端網卡的MAC地址。晚上找了很多資料,終於有點收穫。
如何取得網卡mac地址,就不得不講到dos命令:NBTSTAT,下面簡單介紹下:
1. 具體功能
該命令用於顯示本機電腦和遠端電腦的基於 TCP/IP(NetBT) 協議的 NetBIOS 統計資料、 NetBIOS 名稱表和 NetBIOS 名稱緩衝。 NBTSTAT 可以重新整理 NetBIOS 名稱緩衝和註冊的 Windows Internet 名稱服務 (WINS) 名稱。使用不帶參數的 NBTSTAT 顯示協助。
2. 文法詳解
nbtstat [-a remotename] [-A IPaddress] [-c] [-n] [-r] [-R] [-RR] [-s] [-S] [Interval]
3. 參數說明
-a remotename 顯示遠端電腦的 NetBIOS 名稱表, 其中, remote name 是遠端電腦的 NetBIOS 電腦名稱。 NetBIOS 名稱表是運行在該電腦上的應用程式使用的 NetBIOS 名稱列表。
-A IPaddress 顯示遠端電腦的 NetBIOS 名稱表, 其名稱由遠端電腦的 IP 位址指定 ( 以小數點分隔 ) 。
-c 顯示 NetBIOS 名稱緩衝內容、 NetBIOS 名稱表及其解析的各個地址。
-n 顯示本機電腦的 NetBIOS 名稱表。 Registered 中的狀態表明該名稱是通過廣播或 WINS 伺服器註冊的。
-r 顯示 NetBIOS 名稱解析統計資料。 在配置為使用 WINS 的 Windows 電腦上,該參數將返回已通過廣播和 WINS 解析和註冊的名稱號碼。
-R 清除 NetBIOS 名稱緩衝的內容並從 Lmhosts 檔案中重新載入帶有 #PRE 標記的項目。
-RR 重新釋放並重新整理通過 WINS 註冊的本機電腦的 NetBIOS 名稱。
-s 顯示 NetBIOS 客戶和伺服器會話,並試圖將目標 IP 位址轉化為名稱。
-S 顯示 NetBIOS 客戶和伺服器會話,只通過 IP 位址列出遠端電腦。
Interval 重新顯示選擇的統計資料,可以中斷每個顯示之間的 Interval 中指定的秒數。 按Ctrl+C 停止重新顯示統計資訊。如果省略該參數, NBTSTAT 將只顯示一次當前的配置資訊。
我們試下它的功能:在DOS視窗下,輸入:
nbtstat -a 192.168.168.242
這裡的192.168.168.242是我的本機IP,測試中發現呆會的程式並不能取得非本地的mac地址,也就是說只能取得伺服器的網卡mac地址,而不能取得用戶端的網卡mac地址,記得以前用一些駭客軟體的時候可以辦到擷取對方的網卡mac地址的,有空研究下。結果如:
看到網卡的MAC地址了吧!也就是:
MAC Address = 00-18-F3-A7-E1-56
所以在asp.net中我們也是根據這個原理,先取得指定Ip的所有資訊後,再用正則取得我們要的mac地址。
詳細代碼請參考下面,代碼多有參考網路,為我所用,非我所想。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//引入相應的空間資訊
using System.Text.RegularExpressions;
using System.Diagnostics;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//此處輸入Ip地址,你可以做成接受文字框的值進行查詢
Response.Write(GetCustomerMac("192.168.168.242"));
}
//這裡是關鍵函數了
public string GetCustomerMac(string IP)
{
string dirResults="";
ProcessStartInfo psi = new ProcessStartInfo();
Process proc = new Process();
psi.FileName = "nbtstat";
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.Arguments = "-a " + IP;
psi.UseShellExecute = false;
proc = Process.Start(psi);
dirResults = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
//匹配mac地址
Match m = Regex.Match(dirResults, "\\w+\\-\\w+\\-\\w+\\-\\w+\\-\\w+\\-\\w\\w");
//若匹配成功則返回mac,否則返回找不到主機資訊
if (m.ToString() != "")
{
return m.ToString();
}
else
{
return "找不到主機資訊";
}
}
}