最近在做一個(gè)客戶(hù)端監(jiān)控的功能,需要提取用戶(hù)電腦的CPU編號(hào)和網(wǎng)卡的編號(hào),采集用戶(hù)的登陸數(shù)據(jù),據(jù)我所知道直接通過(guò)Java來(lái)調(diào)用操作系統(tǒng)的信息是非常困難的事情(我好像沒(méi)有發(fā)現(xiàn)JavaAPI提供了這個(gè)功能),那這樣的話只能通過(guò)JNI訪問(wèn)系統(tǒng)的信息了,不過(guò)有個(gè)SWT擴(kuò)展的插件org.eclipse.swt.extension封裝了調(diào)用DLL的JNI方法,主要是負(fù)責(zé)底層操作系統(tǒng)的方法,不過(guò)可能會(huì)對(duì)程序的跨平臺(tái)性有點(diǎn)的影響,目前只能使用于Windows操作系統(tǒng),使用方法很簡(jiǎn)單,接下來(lái)請(qǐng)看:
我們可以從http://www.sourceforge.net 上下載這個(gè)插件,直接搜索 swt extension 就可以搜到,新建一個(gè)工程,比如名稱(chēng)叫org.vwpolo.extend.example,這里要新建成一個(gè)插件項(xiàng)目,如果新建成個(gè)簡(jiǎn)單的Java工程的時(shí)候會(huì)出現(xiàn)個(gè)找不到類(lèi)的異常java.lang.NoClassDefFoundError: org/eclipse/swt/internal/win32/OS,項(xiàng)目新建好了后我們可以寫(xiě)個(gè)類(lèi)來(lái)測(cè)試一下,我寫(xiě)的測(cè)試類(lèi)為:
1 import org.eclipse.swt.internal.extension.Extension;
2
3 /**
4 * 獲得操作系統(tǒng)的信息 。
5 * @author 劉堯興
6 * <p>2009-6-3</p>
7 */
8 public class GetOSInfoApp {
9 public static void main(String[] args) {
10 System.out.println("計(jì)算機(jī)名稱(chēng): "+Extension.GetComputerName());
11 System.out.println("系統(tǒng)登陸帳號(hào): "+Extension.GetUserName());
12 System.out.println("系統(tǒng)CPU編號(hào): " + Extension.GetCPUID());
13 System.out.println("系統(tǒng) MAC編號(hào): " + getMacId());
14 }
public static String getMacID() {
int[] macs = Extension.GetMACAddress(0);
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < macs.length; i++) {
stringBuffer.append(getHexString(macs[i], 2).toUpperCase());
if (i != macs.length - 1)
stringBuffer.append("-");
}
return stringBuffer.toString();
15 }
/**
* 將十進(jìn)制轉(zhuǎn)換成十六進(jìn)制 。
* @author 劉堯興
* @param value
* @param length
* @return String
*/
public static String getHexString(int value, int length) {
String valueStr = Integer.toHexString(value);
if(valueStr.length() == length)
return valueStr;
if(valueStr.length() > length)
return valueStr.substring(0, length);
valueStr = "0000"+valueStr;
return valueStr.substring(valueStr.length()-length);
}
16
這個(gè)類(lèi)功能相當(dāng)?shù)暮?jiǎn)單,我的項(xiàng)目的文件結(jié)構(gòu)為
展使用/P2008-6-29-204450.jpg)
注意要使程序順利運(yùn)行,必須要導(dǎo)入 swt-extension-win32.dll 這個(gè)文件,由于文件下載下來(lái)后有三個(gè)DLL文件,還有兩個(gè)是swt-gdip-win32.dll和swt-win32.dll,如果將他們?nèi)繉?dǎo)入進(jìn)來(lái)結(jié)果會(huì)拋出個(gè)這樣的異常
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.eclipse.swt.internal.C.PTR_sizeof()I
at org.eclipse.swt.internal.C.PTR_sizeof(Native Method)
at org.eclipse.swt.internal.C.<clinit>(C.java:24)
at org.vwpolo.extend.example.GetSystemInfoApp.main(GetSystemInfoApp.java:6)
這個(gè)異常出現(xiàn)的原因是找不到DLL文件或者是多個(gè)DLL文件沖突所造成的,去掉其他的DLL文件只要導(dǎo)入swt-extension-win32.dll, 運(yùn)行,這是控制臺(tái)打印的結(jié)果:
計(jì)算機(jī)名稱(chēng): THINKPAD
系統(tǒng)登陸帳號(hào): vwpolo
系統(tǒng)CPU編號(hào): BFEBFBFF00000F64-0000000000000000
系統(tǒng) MAC編號(hào): 00-01-6C-44-C5-??
不過(guò)值得注意的是用這個(gè)辦法在配置雙網(wǎng)卡的電腦上會(huì)運(yùn)行不正常,我這里就碰到獲取不到網(wǎng)卡的情況,如果你是使用JDK 6.0的話,現(xiàn)在可以通過(guò)這種方式獲得網(wǎng)卡信息:
/**
* JDK1.6新特性獲取網(wǎng)卡MAC地址
* @return String
*/
private static String getMac() {
try {
Enumeration<NetworkInterface> el = NetworkInterface.getNetworkInterfaces();
while (el.hasMoreElements()) {
byte[] mac = el.nextElement().getHardwareAddress();
if (mac == null)
continue;
StringBuilder builder = new StringBuilder();
for (byte b : mac) {
builder.append(hexByte(b));
builder.append("-");
}
builder.deleteCharAt(builder.length() - 1);
return builder.toString();
}
}
catch (Exception exception) {
exception.printStackTrace();
}
return null;
}