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 getLocalHostLANAddress() throws UnknownHostException, SocketException { List ips = new ArrayList(); Enumeration interfs = NetworkInterface.getNetworkInterfaces(); while (interfs.hasMoreElements()) { NetworkInterface interf = interfs.nextElement(); Enumeration 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 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 getAllSn() { String os = System.getProperty("os.name"); os = os.toUpperCase(); System.out.println(os); Map snVo = new HashMap(); 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(); } }