获取客户端网卡MAC地址的几种方法

24 篇文章 0 订阅
7 篇文章 0 订阅

 

 

在做 B/S 结构的系统时,我们常常需要获取客户端的一些信息,如 IPMAC ,以结合身份验证。在 ASP.NET, 要获取服务器端的 MAC 很容易,但是要获取客户端的 MAC 的地址确要花费一翻心思,通常的做法是调用 Win32API 或直接调用 nbtstat 命令。

方法一:Javascript结合系统的ActiveX

 优点:无需开发额外的代码,轻量级的实现。不需要服务器端进行处理,有客户端自行获取,传递到服务器端,且速度和可靠性都比在服务器端获取好
 缺点:受客服端平台的限制,如安全级别设置较高,则无常正常执行

具体实现的html和javascript如下:
        其实最关键的还是用到两个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都是系统自带,不用去下载或注册。 
< 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 =NICPost.asp  method =post >< INPUT  value =00:05:5D:0E:C7:FA  name =txtMACAddr >   < INPUT  value =192.168.0.2  name =txtIPAddr >   < INPUT  value =typ  name =txtDNSName >   </ FORM ></ BODY ></ HTML >

 方法二:通过插件调用Win32API

 优点:成功率较高,不受客户浏览器的限制。
 缺点:需客户端安装此插件,且只能是Windows系统

 具体实现这里不做说明,不同平台和语言实现方法各不相同,以上只是举例Windows系统。

 方法三:通过后台进程调用nbtstat命令

 优点:无需额外开发组件,不受客户端平台的限制
 缺点:受网络范围的限制,成功率较低,速度慢。

 具体实现原理:通过nbtstat -a IP 命令将对方计算机的信息输出管道,然后捕获管道输出的内容,再通过正则表达式将MAC筛选出来。

 C#代码如下:

using  System;
using  System.Text;
using  System.Text.RegularExpressions;
using  System.Diagnostics;

public   static   class  CustomerMAC
{
    
/// <summary>
    
/// 根据IP获取客户端网卡的MAC
    
/// </summary>
    
/// <param name="IP">客户端IP</param>
    
/// <returns>网卡MAC</returns>

    public static 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();
        dirResults 
= dirResults.Replace(" """).Replace(" """).Replace(" """);

        Regex reg 
= new Regex("MAC[ ]{0,}Address[ ]{0,}=[ ]{0,}(?<key>((.)*?))MAC", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        Match mc 
= reg.Match(dirResults + "MAC");

        
if (mc.Success)
        
{
            
return mc.Groups["key"].Value;
        }

        
else
        
{
            reg 
= new Regex("Host not found", RegexOptions.IgnoreCase | RegexOptions.Compiled);
            mc 
= reg.Match(dirResults);
            
if (mc.Success)
            
{
                
return "Host not found!";
            }

            
else
            
{
                
return "";
            }

        }

    }

}

 本文转自:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1327256

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java获取客户端MAC地址可以通过以下步骤实现: 1. 导入相关的Java类库:需要导入`java.net`包和`java.net.NetworkInterface`类。 2. 使用`NetworkInterface`类获取本机的网络接口列表,可以通过`NetworkInterface.getNetworkInterfaces()`方法实现。这个方法将返回一个枚举类型的网络接口,包含了所有的网络接口,如以太网卡、无线网卡等。 3. 遍历网络接口列表,获取本机的MAC地址。可以通过调用`NetworkInterface.getHardwareAddress()`方法获取MAC地址的字节数组,之后将字节数组转换为十六进制字符串。 下面是利用Java代码实现的示例: ``` import java.net.*; import java.util.*; public class GetMacAddress { public static void main(String[] args) { try { Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = networkInterfaces.nextElement(); byte[] mac = networkInterface.getHardwareAddress(); if (mac != null) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < mac.length; i++) { sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "")); } System.out.println("MAC地址为:" + sb.toString()); } } } catch (SocketException e) { e.printStackTrace(); } } } ``` 以上代码会遍历本机的所有网络接口,获取到对应的MAC地址,并将其以十六进制字符串的形式输出。注意,可能会有多个网络接口,因此可能会输出多个MAC地址。 ### 回答2: 要使用Java获取客户端MAC地址,可以使用Java的网络编程库和系统命令。 一种方法是使用Java的网络编程库来获取客户端的IP地址,然后使用系统命令来获取与该IP地址关联的MAC地址。 首先,可以通过Java的InetAddress类的getLocalHost()方法获取本地IP地址。然后,通过使用NetworkInterface类的getByInetAddress()方法,传入上一步获取的IP地址,来获取与该IP地址关联的网络接口。 接下来,通过调用NetworkInterface类的getHardwareAddress()方法,即可获取MAC地址的字节数组。然后,可以将字节数组转换为十六进制字符串。 下面是示例代码: ```java import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; public class GetMacAddress { public static void main(String[] args) { try { InetAddress ip = InetAddress.getLocalHost(); NetworkInterface network = NetworkInterface.getByInetAddress(ip); byte[] mac = network.getHardwareAddress(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < mac.length; i++) { sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "")); } System.out.println("MAC Address: " + sb.toString()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } } } ``` 注意,此示例中只是获取本地主机的MAC地址。如果要获取远程主机的MAC地址,需要使用不同的方法。 另外,获取MAC地址需要在有相应权限的情况下才能成功运行,特别是在某些操作系统中可能需要管理员权限。 ### 回答3: 在Java中获取客户端MAC地址的方式有两种:使用ARP命令或通过网络接口获取。 第一种方法是使用ARP命令。在Windows系统上,可以通过使用Java的Runtime类来执行系统命令获取客户端MAC地址。具体步骤如下: 1. 使用Runtime.getRuntime().exec()方法执行命令行命令"arp -a"。 2. 读取命令执行的输出流并解析,找到与本机IP地址对应的MAC地址。 第二种方法是通过网络接口获取。可以使用Java的NetworkInterface类来获取网络接口的信息。具体步骤如下: 1. 使用NetworkInterface.getNetworkInterfaces()方法获取所有网络接口的列表。 2. 遍历网络接口列表,找到符合条件的接口,如有IP地址且非回环接口。 3. 使用NetworkInterface.getHardwareAddress()方法获取MAC地址的字节数组。 4. 将字节数组转换为十六进制字符串表示。 需要注意的是,这两种方法都需要在具有相应权限的操作系统上运行。在某些情况下,可能无法获取MAC地址或需要额外的配置或权限。 综上所述,通过ARP命令或网络接口获取MAC地址是在Java中获取客户端MAC地址的常见方法。具体使用哪种方法取决于操作系统和环境的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值