C#获取本机网卡MAC和远程服务器网卡

在做 B/S 结构的系统时,我们常常需要获取客户端的一些信息,如 IP 和 MAC ,以结合身份验证。 要获取服务器端的 MAC 很容易,但是要获取客户端的 MAC 的地址确要花费一翻心思,通常的做法是调用 Win32API 或直接调用 nbtstat 命令,这样做有很多问题,而另一种方法就是直接用客户端脚本,我们这里用 Javascript ,这样做的好处是不需要服务器端进行处理,有客户端自行获取,传递到服务器端,且速度和可靠性都比在服务器端获取好。
具体实现的html和javascript如下:
<HTML><HEAD><TITLE>WMI Scripting HTML</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<SCRIPT language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
document.forms[0].txtMACAddr.value=unescape(MACAddr);
document.forms[0].txtIPAddr.value=unescape(IPAddr);
document.forms[0].txtDNSName.value=unescape(sDNSName);
//document.formbar.submit();
</SCRIPT>
<SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo>
if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
{
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;
}
</SCRIPT>

<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
<SCRIPT language=JScript>
var service = locator.ConnectServer();
var MACAddr ;
var IPAddr ;
var DomainAddr;
var sDNSName;
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</SCRIPT>
<FORM id="formfoo" name="formbar" action="index.do" method="post"><INPUT value="00-11-11-B4-52-EF" name="txtMACAddr"> <INPUT value="210.42.38.50" name="txtIPAddr"> <INPUT value="zhupan" name="txtDNSName"> </FORM></BODY></HTML>
其实最关键的还是用到两个ActiveX:
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
不过这两个 ActiveX 都是系统自带,不用去下载或注册。
接下来的工作就是用脚本和 ActiveX 交互


下面说下asp.net如何获取客户端网卡mac地址


using System.Management;
using System.Runtime.InteropServices;

[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);


protected void Page_Load(object sender, EventArgs e)
{
try
{
string userip = Request.UserHostAddress;
Int32 ldest = inet_addr(userip); //目的地的ip
Int32 lhost = inet_addr(""); //本地服务器的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")
userinfo.Text = "正在访问Localhost!";
else
userinfo.Text = "欢迎来自IP为" + userip + "的朋友!";
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))
mac_dest = mac_dest.Insert(0, mac_src.Substring(i, 2));
}
userinfo.Text = "欢迎来自IP为" + userip + ",MAC地址为" + mac_dest + "的朋友!";
}
catch (Exception err)
{
Response.Write(err.Message);
}
}

。但是需要using System.Management;

引入方法是菜单“网站”-“添加引用”-net中的System.Management。。就可以了。。


java,jsp获取客户端网卡物理地址

<HTML><HEAD><TITLE>WMIScriptingHTML</TITLE>
<METAhttp-equiv=Content-Typecontent="text/html;charset=gb2312">
<SCRIPTlanguage=JScriptevent="OnCompleted(hResult,pErrorObject,pAsyncContext)"for=foo>
document.forms[0].txtMACAddr.value=unescape(MACAddr);
document.forms[0].txtIPAddr.value=unescape(IPAddr);
document.forms[0].txtDNSName.value=unescape(sDNSName);
//document.formbar.submit();
 </SCRIPT>
<SCRIPTlanguage=JScriptevent=OnObjectReady(objObject,objAsyncContext)for=foo>
 if(objObject.IPEnabled!=null&&objObject.IPEnabled!="undefined"&&objObject.IPEnabled==true)
 {
  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;
  }
</SCRIPT>
<METAcontent="MSHTML6.00.2800.1106"name=GENERATOR></HEAD>
<BODY>
<OBJECTid=locatorclassid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6VIEWASTEXT></OBJECT>
<OBJECTid=fooclassid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
<SCRIPTlanguage=JScript>
 varservice=locator.ConnectServer();
 varMACAddr;
 varIPAddr;
 varDomainAddr;
 varsDNSName;
 service.Security_.ImpersonationLevel=3;
 service.InstancesOfAsync(foo,'Win32_NetworkAdapterConfiguration');
</SCRIPT>
<FORMid="formfoo"name="formbar"action="index.do"method="post">
  <INPUTvalue="00-11-11-B4-52-EF" name="txtMACAddr"> 
  <INPUTvalue="210.42.38.50" name="txtIPAddr"> 
  <INPUTvalue="zhupan"name="txtDNSName"> 
</FORM></BODY></HTML>
StringMACAddr=request.getParameter("txtMACAddr");
StringIPAddr= request.getParameter("txtIPAddr");
StringDNS=Util.null2String(request.getParameter("txtDNSName"));
StringMac="";
Stringsource=MACAddr;
Stringfrom=":";
Stringto="-";
StringBufferbf=newStringBuffer(""); 
StringTokenizerst=newStringTokenizer(source,from,true); 
while(st.hasMoreTokens()) 
{ 
  Stringtmp=st.nextToken(); 
  //out.println("*"+tmp); 
  if(tmp.equals(from)) 
  { 
    bf.append(to); 
  } 
  else 
  { 
    bf.append(tmp); 
  } 
} 
Mac=bf.toString(); 
out.print(Mac);
//用完之后在网页上,要替换一下":"为"-"


获取服务器MAC网卡asp.net


using System;
using System.Management;
using System.Data;
using System.Configuration;
using System.Collections;
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;
 
public partial class main : System.Web.UI.Page
{
     protected void Page_Load(object sender, EventArgs e)
     {
 
     }
    protected void Button1_Click(object sender, EventArgs e)
     {
         ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
         ManagementObjectCollection moc = mc.GetInstances();
         foreach (ManagementObject mo in moc)
         {
  //Console.WriteLine("Network Card: {0}", mo["Description"]);  获取网卡的产权描述
                 Label1.Text = mo["MacAddress"].ToString();
 
         }
     }
 }

好简单的代码啊。但是需要using System.Management;

引入方法是菜单“网站”-“添加引用”-net中的System.Management。。就可以了。。

转载于:https://www.cnblogs.com/haik/archive/2010/04/29/1724435.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值