最近在做一個客戶端監控的功能,需要提取用戶電腦的CPU編號和網卡的編號,采集用戶的登陸數據,據我所知道直接通過Java來調用操作系統的信息是非常困難的事情(我好像沒有發現JavaAPI提供了這個功能),那這樣的話只能通過JNI訪問系統的信息了,不過有個SWT擴展的插件org.eclipse.swt.extension封裝了調用DLL的JNI方法,主要是負責底層操作系統的方法,不過可能會對程序的跨平臺性有點的影響,目前只能使用于Windows操作系統,使用方法很簡單,接下來請看:
我們可以從http://www.sourceforge.net 上下載這個插件,直接搜索 swt extension 就可以搜到,新建一個工程,比如名稱叫org.vwpolo.extend.example,這里要新建成一個插件項目,如果新建成個簡單的Java工程的時候會出現個找不到類的異常java.lang.NoClassDefFoundError: org/eclipse/swt/internal/win32/OS,項目新建好了后我們可以寫個類來測試一下,我寫的測試類為:
1 import org.eclipse.swt.internal.extension.Extension;
2
3 /**
4 * 獲得操作系統的信息 。
5 * @author 劉堯興
6 * <p>2009-6-3</p>
7 */
8 public class GetOSInfoApp {
9 public static void main(String[] args) {
10 System.out.println("計算機名稱: "+Extension.GetComputerName());
11 System.out.println("系統登陸帳號: "+Extension.GetUserName());
12 System.out.println("系統CPU編號: " + Extension.GetCPUID());
13 System.out.println("系統 MAC編號: " + 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 }
/**
* 將十進制轉換成十六進制 。
* @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
這個類功能相當的簡單,我的項目的文件結構為

注意要使程序順利運行,必須要導入 swt-extension-win32.dll 這個文件,由于文件下載下來后有三個DLL文件,還有兩個是swt-gdip-win32.dll和swt-win32.dll,如果將他們全部導入進來結果會拋出個這樣的異常
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)
這個異常出現的原因是找不到DLL文件或者是多個DLL文件沖突所造成的,去掉其他的DLL文件只要導入swt-extension-win32.dll, 運行,這是控制臺打印的結果:
計算機名稱: THINKPAD
系統登陸帳號: vwpolo
系統CPU編號: BFEBFBFF00000F64-0000000000000000
系統 MAC編號: 00-01-6C-44-C5-??
不過值得注意的是用這個辦法在配置雙網卡的電腦上會運行不正常,我這里就碰到獲取不到網卡的情況,如果你是使用JDK 6.0的話,現在可以通過這種方式獲得網卡信息:
/**
* JDK1.6新特性獲取網卡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;
}