获取电脑唯一标识,硬盘序列号,主板序列号,CPU序列号

在生产环境中,有时候会需要获取电脑唯一标识进行程序管理验证,比如一个程序,在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 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("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() {
		//主板id
		String mainboard=null;
		//C盘id
		String disk=null;
		//macid
		String 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


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值