急......
系统登录需要得到客户端的mac地址,验证满足条件的mac时才可登录。现在如何取客户端mac地址?
1js能实现,但是提示安装acticex插件,不友好。
2通过jnt 调用c来取,未能实现。
3通过applet取,未实现。请教各位大虾,2或3如何实现?能给出提示或实现实例?
高分相赠!!!
系统登录需要得到客户端的mac地址,验证满足条件的mac时才可登录。现在如何取客户端mac地址?
1js能实现,但是提示安装acticex插件,不友好。
2通过jnt 调用c来取,未能实现。
3通过applet取,未实现。请教各位大虾,2或3如何实现?能给出提示或实现实例?
高分相赠!!!
解决方案 »
- 一个页面中两个iframe,如何在左边的iframe中点击连接找开右边的iframe页面?
- spring如何处理DispatchAction
- struts2的问题
- 为什么页面运行段时间就会变得很慢
- [急]转移程序到一个租用的空间上,程序new MultipartFormDataRequest出错.
- 用Javabean 读取mysql数据库中文内容乱码现象。。
- 高分求:用过jni的朋友帮我看看偶的程序错在哪?
- 如果提交这段参数?
- javascript如何接收这样的字符串呀?
- 初学struts 对struts 有两个不明白的问题望指点!
- JSP中如何在每个页面判断用户是否已正常登陆的,不是直接根据URL访问页面的?就像ASP.NET中的User.Identity.IsAuthenticated功能一样功能.
- jsp如何统计服务器上某个文件夹的大小
public String getMAC() {
String tmpStr = "";
String tmpMAC = "";
try {
Process process = Runtime.getRuntime().exec("nbtstat -a " + address);
InputStreamReader isReader = new InputStreamReader(process.getInputStream());
LineNumberReader lnReader = new LineNumberReader(isReader);
for (int i = 1; i < 100; i++) {
tmpStr = lnReader.readLine();
if (tmpStr != null) {
if (tmpStr.indexOf("MAC Address") > 1) {
tmpMAC = tmpStr.substring(tmpStr.indexOf("MAC Address") + 14,
tmpStr.length());
break;
}
}
}
} catch (IOException ex) {
return null;
}
if (tmpMAC.length() < 17) {
return null;
}
mac = tmpMAC.substring(0, 2) + ":" + tmpMAC.substring(3, 5)
+ ":" + tmpMAC.substring(6, 8) + ":" + tmpMAC.substring(9, 11)
+ ":" + tmpMAC.substring(12, 14) + ":"
+ tmpMAC.substring(15, 17);
return mac;
}
public String getMacOnWindow() {
String s = "";
try {
String s1 = "ipconfig /all";
Process process = Runtime.getRuntime().exec(s1);
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String nextLine;
for (String line = bufferedreader.readLine(); line != null; line = nextLine) {
nextLine = bufferedreader.readLine();
if (line.indexOf("Physical Address") <= 0) {
continue;
}
int i = line.indexOf("Physical Address") + 36;
s = line.substring(i);
break;
}
bufferedreader.close();
process.waitFor();
} catch (Exception exception) {
s = "";
}
return s.trim();
}
}
try{
Process process = Runtime.getRuntime().exec ("ipconfig /all");
InputStreamReader ir=new InputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader (ir);
String line;
while ((line = input.readLine ()) != null)
if( line.indexOf("Physical Address")>0 ) {
String MACAddr = line.substring(line.indexOf("-")-2);
System.out.println("MAC address = ["+ MACAddr + "]");
}
}catch (java.io.IOException e){
System.err.println ("IOException " + e.getMessage());
}
}
}
Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的是等待子进程完成后再往下执行。上面的程序在运行时会执行dir命令。如果在Windows95/98下,命令格式可以写成"command.exe /c dir"。开关/C指明后面跟随的字符串是命令,并在执行命令后关闭DOS 窗口。方法exec还可以打开一个不可执行的程序,但该文件存在关联的应用程序。以打开一个word文档Mydoc.doc文件为例,Java中可以有以下两种写法:exec(""cmd /E:ON /c start MyDoc.doc""); exec(" c:Program FilesMicrosoft Officeofficewinword.exe .mydoc.doc");
在第一种方式中,被执行的命令是start Mydoc.doc,开关E:ON 指定DOS 命令处理器允许命令扩展,而start 命令会开启一个单独的窗口执行所提供的命令。执行一个有标准输出的DOS命令,程序执行完后往往不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。导致该现象的原因可能是该命令的输出比较多,而运行窗口的输出缓冲区不够大。解决的办法是,利用Java的Process类提供的方法让Java虚拟机截获DOS运行的标准输出,在waitfor()命令之前读出该缓冲区的内容。以运行命令dir为例,典型的程序如下:: String line; Process process = Runtime.getRuntime().exec("cmd /c dir"); BufferedReader bufferedReader = new BufferedReader ( new InputStreamReader(process.getInputStream())); while ( (line = bufferedReader.readLine()) != -1) System. out.println(line); process.waitFor( ); :3 Process
Runtime.exec方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。抽象类Process封装了一个进程(process),一个正在执行的程序。它主要被当作由Runtime类中的exec( )方法所创建的对象的类型的超类。在抽象类Process中,主要包含了如下一些抽象方法。◆InputStream getInputStream( ):返回一个从进程的out输出流中读输入的输入流。◆OutputStream getOutputStream( ):返回一个从进程的in输入流中写输出的输出流。◆int waitFor( ) throws InterruptedException:返回由进程返回的退出码。这个方法直到调用它的进程中止,才会返回。
4、程序编写我们先来分析ipconfig/all的输出格式:
从图1中我们看到MAC地址包含的行为:“ Physical Address. . . . . . . . . : 00-10-DC-A9-0B-2C”。为了找到MAC地址,我们一行一行读取字符,只要找到字符串“ Physical Address. . . . . . . . . :”,就可以找到MAC地址了。下面是实现的程序片段:: Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader (process.getInputStream())); while ( (line=bufferedReader.readLine()) != null){ if(line.indexOf("Physical Address. . . . . . . . . :") != -1){ if(line.indexOf(":") != -1){ physicalAddress = line.substring(line.indexOf(":")+2); :
在上面的程序中,为了读取命令输出的字符,利用子进程process生成了一个数据流缓冲区。依据上面的代码,我们编写了一个类ReadMAC,见下面程序的源代码:import java.io.*; public class ReadMAC { public static String physicalAddress = "read MAC error!"; public ReadMAC() { } public static String checkPhysicalAddress(){ try{ String line; Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); while ( (line=bufferedReader.readLine()) != null){ if(line.indexOf("Physical Address. . . . . . . . . :") != -1){ if(line.indexOf(":") != -1){ physicalAddress = line.substring(line.indexOf(":")+2); break; //找到MAC,推出循环 } } } process.waitFor(); }catch(Exception e){ e.printStackTrace(); } return physicalAddress; } public static void main(String[] args) { System.out.println("本机的MAC地址是: "+ ReadMAC.checkPhysicalAddress()); } } 由于每一台计算机的MAC地址都不同,所以该程序在不同计算机上运行结果都会不一样。5、结束语作为一个跨平台语言,编写的JAVA程序一般都与硬件无关,因而能运行在不同的操作系统环境。但这给编写底层相关的程序时带来不便。Java的应用程序都存在着一个与其运行环境相联系的Runtime对象,利用该对象可执行外部命令,在WindowsXP/NT/2000环境中的命令IPCONFIG的输出包含有MAC地址。本文编写的Java程序,执行外部命令IPCONFIG,并通过分析该命令的输入流而获得本机的MAC地址。由于IPCONFIG命令是操作系统命令,所以该方法既方便又可靠。以上讨论的程序适合于Windows XP/NT/2000操作系统,因为它是基于该操作系统的命令IPCONFIG格式的。由于不同操作系统读取MAC地址的命令、以及命令输出格式的不同,所以该程序不能直接运用到其它系统。要移植到其它系统只需针对命令的输出格式稍作修改。
当然如果客户没有安装jvm,applet是不可以用的。你有两种方法可以访问客户端MAC地址:
1、修改客户端的安全文件内容。
即:jre目录下的lib\security\java.policy文件,在grant {}中添加permission java.security.AllPermission;
修改完成后,看起来像下面的样子:
grant {
....
permission java.security.AllPermission;
....
}
2.你需要使用applet数字签名
没有jvm,applet没法得到解析,不能运行
<head>
<title>WMI Scripting HTML</title>
<script FOR="foo" EVENT="OnCompleted(hResult,pErrorObject, pAsyncContext)" LANGUAGE="JScript"> 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 FOR="foo" EVENT="OnObjectReady(objObject,objAsyncContext)" LANGUAGE="JScript"> 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>
</head>
<body>
<object classid="CLSID:76A64158-CB41-11D1-8B02-00600806D9B6" id="locator" VIEWASTEXT>
</object>
<object classid="CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223" id="foo">
</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 method="POST" action="" id="formfoo" name="formbar"> <input type=text name="txtMACAddr">
<input type=text name="txtIPAddr">
<input type=text name="txtDNSName"> </form>
</body>
</html>