| package com.zy.asrs.wms.system.license.entity.license;  | 
|   | 
| import java.io.*;  | 
| import java.net.*;  | 
| import java.util.*;  | 
|   | 
| public class SerialNumberUtil {  | 
|   | 
|   | 
|     /**  | 
|      * 获取主板序列号  | 
|      *  | 
|      * @return  | 
|      */  | 
|     public static String getMotherboardSN() {  | 
|         String result = "";  | 
|         try {  | 
|             File file = File.createTempFile("realhowto", ".vbs");  | 
|             file.deleteOnExit();  | 
|             FileWriter fw = new FileWriter(file);  | 
|   | 
|             String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n" + "Set colItems = objWMIService.ExecQuery _ \n" + "   (\"Select * from Win32_BaseBoard\") \n" + "For Each objItem in colItems \n" + "    Wscript.Echo objItem.SerialNumber \n" + "    exit for  ' do the first cpu only! \n" + "Next \n";  | 
|   | 
|             fw.write(vbs);  | 
|             fw.close();  | 
|             String path = file.getPath().replace("%20", " ");  | 
|             Process p = Runtime.getRuntime().exec("cscript //NoLogo " + path);  | 
|             BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));  | 
|             String line;  | 
|             while ((line = input.readLine()) != null) {  | 
|                 result += line;  | 
|             }  | 
|             input.close();  | 
|         } catch (Exception e) {  | 
|             e.printStackTrace();  | 
|         }  | 
|         return result.trim();  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取硬盘序列号(该方法获取的是 盘符的逻辑序列号,并不是硬盘本身的序列号)  | 
|      * 硬盘序列号还在研究中  | 
|      *  | 
|      * @param drive 盘符  | 
|      * @return  | 
|      */  | 
|     public static String getHardDiskSN(String drive) {  | 
|         String result = "";  | 
|         try {  | 
|             File file = File.createTempFile("realhowto", ".vbs");  | 
|             file.deleteOnExit();  | 
|             FileWriter fw = new FileWriter(file);  | 
|   | 
|             String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n" + "Set colDrives = objFSO.Drives\n" + "Set objDrive = colDrives.item(\"" + drive + "\")\n" + "Wscript.Echo objDrive.SerialNumber"; // see note  | 
|             fw.write(vbs);  | 
|             fw.close();  | 
|             String path = file.getPath().replace("%20", " ");  | 
|             Process p = Runtime.getRuntime().exec("cscript //NoLogo " + path);  | 
|             BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));  | 
|             String line;  | 
|             while ((line = input.readLine()) != null) {  | 
|                 result += line;  | 
|             }  | 
|             input.close();  | 
|         } catch (Exception e) {  | 
|             e.printStackTrace();  | 
|         }  | 
|         return result.trim();  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取CPU序列号  | 
|      *  | 
|      * @return  | 
|      */  | 
|     public static String getCPUSerial() {  | 
|         String result = "";  | 
|         try {  | 
|             File file = File.createTempFile("tmp", ".vbs");  | 
|             file.deleteOnExit();  | 
|             FileWriter fw = new FileWriter(file);  | 
|             String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n" + "Set colItems = objWMIService.ExecQuery _ \n" + "   (\"Select * from Win32_Processor\") \n" + "For Each objItem in colItems \n" + "    Wscript.Echo objItem.ProcessorId \n" + "    exit for  ' do the first cpu only! \n" + "Next \n";  | 
|   | 
|             // + "    exit for  \r\n" + "Next";  | 
|             fw.write(vbs);  | 
|             fw.close();  | 
|             String path = file.getPath().replace("%20", " ");  | 
|             Process p = Runtime.getRuntime().exec("cscript //NoLogo " + path);  | 
|             BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));  | 
|             String line;  | 
|             while ((line = input.readLine()) != null) {  | 
|                 result += line;  | 
|             }  | 
|             input.close();  | 
|             file.delete();  | 
|         } catch (Exception e) {  | 
|             e.fillInStackTrace();  | 
|         }  | 
|         if (result.trim().length() < 1 || result == null) {  | 
|             result = "无CPU_ID被读取";  | 
|         }  | 
|         return result.trim();  | 
|     }  | 
|   | 
|     private static List<String> getLocalHostLANAddress() throws UnknownHostException, SocketException {  | 
|         List<String> ips = new ArrayList<String>();  | 
|         Enumeration<NetworkInterface> interfs = NetworkInterface.getNetworkInterfaces();  | 
|         while (interfs.hasMoreElements()) {  | 
|             NetworkInterface interf = interfs.nextElement();  | 
|             Enumeration<InetAddress> addres = interf.getInetAddresses();  | 
|             while (addres.hasMoreElements()) {  | 
|                 InetAddress in = addres.nextElement();  | 
|                 if (in instanceof Inet4Address) {  | 
|                     System.out.println("v4:" + in.getHostAddress());  | 
|                     if (!"127.0.0.1".equals(in.getHostAddress())) {  | 
|                         ips.add(in.getHostAddress());  | 
|                     }  | 
|                 }  | 
|             }  | 
|         }  | 
|         return ips;  | 
|     }  | 
|   | 
|     /**  | 
|      * MAC  | 
|      * 通过jdk自带的方法,先获取本机所有的ip,然后通过NetworkInterface获取mac地址  | 
|      *  | 
|      * @return  | 
|      */  | 
|     public static String getMac() {  | 
|         try {  | 
|             String resultStr = "";  | 
|             List<String> ls = getLocalHostLANAddress();  | 
|             for (String str : ls) {  | 
|                 InetAddress ia = InetAddress.getByName(str);// 获取本地IP对象  | 
|                 // 获得网络接口对象(即网卡),并得到mac地址,mac地址存在于一个byte数组中。  | 
|                 byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();  | 
|                 // 下面代码是把mac地址拼装成String  | 
|                 StringBuilder sb = new StringBuilder();  | 
|                 for (int i = 0; i < mac.length; i++) {  | 
|                     if (i != 0) {  | 
|                         sb.append("-");  | 
|                     }  | 
|                     // mac[i] & 0xFF 是为了把byte转化为正整数  | 
|                     String s = Integer.toHexString(mac[i] & 0xFF);  | 
|                     sb.append(s.length() == 1 ? 0 + s : s);  | 
|                 }  | 
|                 // 把字符串所有小写字母改为大写成为正规的mac地址并返回  | 
|                 resultStr += sb.toString().toUpperCase() + ",";  | 
|             }  | 
|             return resultStr;  | 
|         } catch (Exception ex) {  | 
|             ex.printStackTrace();  | 
|         }  | 
|         return null;  | 
|     }  | 
|   | 
|     /***************************linux*********************************/  | 
|   | 
|     public static String executeLinuxCmd(String cmd) {  | 
|         try {  | 
|             //System.out.println("got cmd job : " + cmd);  | 
|             Runtime run = Runtime.getRuntime();  | 
|             Process process;  | 
|             process = run.exec(cmd);  | 
|             InputStream in = process.getInputStream();  | 
|             BufferedReader bs = new BufferedReader(new InputStreamReader(in));  | 
|             StringBuffer out = new StringBuffer();  | 
|             byte[] b = new byte[8192];  | 
|             for (int n; (n = in.read(b)) != -1; ) {  | 
|                 out.append(new String(b, 0, n));  | 
|             }  | 
|             in.close();  | 
|             process.destroy();  | 
|             return out.toString();  | 
|         } catch (Exception e) {  | 
|             e.printStackTrace();  | 
|         }  | 
|         return null;  | 
|     }  | 
|   | 
|     /**  | 
|      * @param cmd    命令语句  | 
|      * @param record 要查看的字段  | 
|      * @param symbol 分隔符  | 
|      * @return  | 
|      */  | 
|     public static String getSerialNumber(String cmd, String record, String symbol) {  | 
|         String execResult = executeLinuxCmd(cmd);  | 
|         String[] infos = execResult.split("\n");  | 
|   | 
|         for (String info : infos) {  | 
|             info = info.trim();  | 
|             if (info.indexOf(record) != -1) {  | 
|                 info.replace(" ", "");  | 
|                 String[] sn = info.split(symbol);  | 
|                 return sn[1];  | 
|             }  | 
|         }  | 
|   | 
|         return null;  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取CPUID、硬盘序列号、MAC地址、主板序列号  | 
|      *  | 
|      * @return  | 
|      */  | 
|     public static Map<String, String> getAllSn() {  | 
|         String os = System.getProperty("os.name");  | 
|         os = os.toUpperCase();  | 
|         System.out.println(os);  | 
|   | 
|         Map<String, String> snVo = new HashMap<String, String>();  | 
|   | 
|         if (os.contains("LINUX")) {  | 
|             System.out.println("=============>for linux");  | 
|             String cpuid = getSerialNumber("dmidecode -t processor | grep 'ID'", "ID", ":");  | 
|             System.out.println("cpuid : " + cpuid);  | 
|             String mainboardNumber = getSerialNumber("dmidecode |grep 'Serial Number'", "Serial Number", ":");  | 
|             System.out.println("mainboardNumber : " + mainboardNumber);  | 
|             String diskNumber = getSerialNumber("fdisk -l", "Disk identifier", ":");  | 
|             System.out.println("diskNumber : " + diskNumber);  | 
|             String mac = getSerialNumber("ifconfig -a", "ether", " ");  | 
|   | 
|             snVo.put("cpuid", cpuid.toUpperCase().replace(" ", ""));  | 
|             snVo.put("diskid", diskNumber.toUpperCase().replace(" ", ""));  | 
|             snVo.put("mac", mac.toUpperCase().replace(" ", ""));  | 
|             snVo.put("mainboard", mainboardNumber.toUpperCase().replace(" ", ""));  | 
|         } else {  | 
|             System.out.println("=============>for windows");  | 
|             String cpuid = SerialNumberUtil.getCPUSerial();  | 
|             String mainboard = SerialNumberUtil.getMotherboardSN();  | 
|             String disk = SerialNumberUtil.getHardDiskSN("c");  | 
|             String mac = SerialNumberUtil.getMac();  | 
|   | 
|             System.out.println("CPU  SN:" + cpuid);  | 
|             System.out.println("主板  SN:" + mainboard);  | 
|             System.out.println("C盘   SN:" + disk);  | 
|             System.out.println("MAC  SN:" + mac);  | 
|   | 
|             snVo.put("cpuid", cpuid.toUpperCase().replace(" ", ""));  | 
|             snVo.put("diskid", disk.toUpperCase().replace(" ", ""));  | 
|             snVo.put("mac", mac.toUpperCase().replace(" ", ""));  | 
|             snVo.put("mainboard", mainboard.toUpperCase().replace(" ", ""));  | 
|         }  | 
|   | 
|         return snVo;  | 
|     }  | 
|   | 
|     /**  | 
|      * linux  | 
|      * cpuid : dmidecode -t processor | grep 'ID'  | 
|      * mainboard : dmidecode |grep 'Serial Number'  | 
|      * disk : fdisk -l  | 
|      * mac : ifconfig -a  | 
|      *  | 
|      * @param args  | 
|      */  | 
|     public static void main(String[] args) {  | 
|         getAllSn();  | 
|     }  | 
| }  |