現(xiàn)在我們的項(xiàng)目現(xiàn)在加入了身份驗(yàn)證,通過收集客戶端的電腦的CPU編號(hào)、硬盤編號(hào)和網(wǎng)卡編號(hào)然后生成一個(gè)機(jī)器碼,然后使用這個(gè)機(jī)器碼作為身份標(biāo)識(shí),驗(yàn)證客戶端的合法性,我們的項(xiàng)目是RCP架構(gòu),所以使用了SWT Extension這樣的一個(gè)插件(國人開發(fā),而且是BlogJava的會(huì)員),這樣比較方便,獲取CPU編號(hào)、硬盤編號(hào)倒是沒有什么問題,獲取網(wǎng)卡信息的時(shí)候有些電腦居然采集不到信息,采集方式是這樣的:
注意通過Extension.GetMACAddress()方法得到的網(wǎng)卡地址是一個(gè)十進(jìn)制的數(shù)組,需要將他轉(zhuǎn)換成十六進(jìn)制的,這樣才能和操作系統(tǒng)現(xiàn)在的信息一致。
這種采集方式不是萬能,估計(jì)和操作環(huán)境有關(guān)系,我們這個(gè)項(xiàng)目的按照客戶端大概在4000臺(tái)電腦左右,大部分安裝的Windows 2000操作系統(tǒng)、Java運(yùn)行環(huán)境是jre 6.0,通過分析發(fā)現(xiàn)有些電腦是雙網(wǎng)卡,我見得最多的一個(gè)電腦居然配置了9塊網(wǎng)卡(包括虛擬的和禁用掉的),在這種情況下SWT Extension 是無法正常工作了,網(wǎng)絡(luò)上也提供了其他的辦法比如使用
根據(jù)返回的輸入流從里面解析信息,通過使用發(fā)現(xiàn)這種方式也不太管用!。這里重點(diǎn)介紹第三種方式:通過JDK 6.0中的方法來獲取:
我的做法是將這三種方法同時(shí)使用:如果第一種方式獲取不到,換成第二種,第二種方法也無效的話,我就使用第三種,如果第三種方式仍然無效的話,只能建議客戶重裝系統(tǒng)了:你還是升級到XP系統(tǒng)吧
int[] macs = Extension.GetMACAddress(0);
if(macs == null || macs.length ==0) {
macs = Extension.GetMACAddress(1);
}
if(macs == null || macs.length ==0) {
macs = Extension.GetMACAddress(2);
}
if(macs == null || macs.length ==0) {
macs = Extension.GetMACAddress(3);
}
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < macs.length; i++) {
stringBuffer.append(getHexString(macs[i], 2)
if (i != macs.length - 1)
stringBuffer.append("-");
}
System.out.println(stringBuffer.toString.toUpperCase()););
if(macs == null || macs.length ==0) {
macs = Extension.GetMACAddress(1);
}
if(macs == null || macs.length ==0) {
macs = Extension.GetMACAddress(2);
}
if(macs == null || macs.length ==0) {
macs = Extension.GetMACAddress(3);
}
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < macs.length; i++) {
stringBuffer.append(getHexString(macs[i], 2)
if (i != macs.length - 1)
stringBuffer.append("-");
}
System.out.println(stringBuffer.toString.toUpperCase()););
注意通過Extension.GetMACAddress()方法得到的網(wǎng)卡地址是一個(gè)十進(jìn)制的數(shù)組,需要將他轉(zhuǎn)換成十六進(jìn)制的,這樣才能和操作系統(tǒng)現(xiàn)在的信息一致。
這種采集方式不是萬能,估計(jì)和操作環(huán)境有關(guān)系,我們這個(gè)項(xiàng)目的按照客戶端大概在4000臺(tái)電腦左右,大部分安裝的Windows 2000操作系統(tǒng)、Java運(yùn)行環(huán)境是jre 6.0,通過分析發(fā)現(xiàn)有些電腦是雙網(wǎng)卡,我見得最多的一個(gè)電腦居然配置了9塊網(wǎng)卡(包括虛擬的和禁用掉的),在這種情況下SWT Extension 是無法正常工作了,網(wǎng)絡(luò)上也提供了其他的辦法比如使用
String command = "cmd.exe /c ipconfig /all";
Process p = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println("line:"+line);
if (line.indexOf("Physical Address") > 0) {
int index = line.indexOf(":");
index += 2;
address = line.substring(index);
break;
}
}
br.close();
Process p = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println("line:"+line);
if (line.indexOf("Physical Address") > 0) {
int index = line.indexOf(":");
index += 2;
address = line.substring(index);
break;
}
}
br.close();
根據(jù)返回的輸入流從里面解析信息,通過使用發(fā)現(xiàn)這種方式也不太管用!。這里重點(diǎn)介紹第三種方式:通過JDK 6.0中的方法來獲取:
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;
}
這是JDK 6.0的新特性,可以支持多網(wǎng)卡配置,你只需要判斷一下就行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;
}
我的做法是將這三種方法同時(shí)使用:如果第一種方式獲取不到,換成第二種,第二種方法也無效的話,我就使用第三種,如果第三種方式仍然無效的話,只能建議客戶重裝系統(tǒng)了:你還是升級到XP系統(tǒng)吧