在生产环境中,有时候会需要获取电脑唯一标识进行程序管理验证,比如一个程序,在A电脑上面只能允许正常登陆一年,到期后提示联系管理员等情况。就是获取电脑唯一标识后将该值存入授权数据库,默认给当前电脑的使用时期为当前时间后一年,一年后登陆时不能正常登陆(记录第一次使用这种场景)
java代码
package org.wj.common.tool;
import java.io.*;
import java.net.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
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 notefw.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地址拼装成StringStringBuilder 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("LINUX".equals(os)) {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();}/*** @Description:获取唯一标识* @Param: []* @return: java.lang.String* @Author: wj* @Date: 2019-09-04*/public static String getmainboard() {//主板idString mainboard=null;//C盘idString disk=null;//macidString mac=null;Map<String, String> sno=SerialNumberUtil.getAllSn();for(String key : sno.keySet()){String value = sno.get(key);if(("mainboard").equals(key)){mainboard=value;}else if(("diskid").equals(key)){disk=value;}}return mainboard+disk;}public static String nextYear(){Date date = new Date();Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.YEAR, 1);//增加一年SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);//java.util.Date对象Date date1=new Date();try {date1 = (Date) sdf.parse(cal.getTime().toString());} catch (ParseException e) {e.printStackTrace();}String formatStr2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date1);return formatStr2;}
``代码链接:
https://download.csdn.net/download/weixin_44244991/12477368