在生产环境中,有时候会需要获取电脑唯一标识进行程序管理验证,比如一个程序,在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

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

  1. 易语言-获取电脑唯一标识机器码

    源码: 源码下载地址

  2. Vue获取浏览器唯一标识

    `登陆时候可能需要向后台传输一个唯一标识符 具体实现思路如下: 1.引入js <!-- 获取唯一标识 --> <script type="text/javascript&q ...

  3. Python查询物理机硬盘、主板、BIOS序列号(用于认证Windows设备)

    有些应用场景下我们需要认证设备,对于安装了Windows系统的物理机可以采用WMI获取硬盘.主板.BIOS序列号,从而确认设备的唯一性. 1. 安装依赖库 wmi pip install wmi 2. ...

  4. android设备id完美解决方法,安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题...

    一,先说获取渠道名(这里以友盟为例) /* * 4.5.1新加渠道名字段,用来传给后台去统计各个渠道下载量 * */ public static String getSource() { //获取渠道 ...

  5. 获取android设备唯一编号_android获取设备唯一标识完美解决方案的思考以及实现方式...

    关于Android设备唯一标识符号 前言 由于在开发中需要开发游客模式,在用户没有登录的情况下必须确保设备的唯一性,于是惯性思维想到的肯定是使用DevicesId 来作为设备的唯一标识,用以代替用户登 ...

  6. android获取设备唯一标识完美解决方案

    转自:https://blog.csdn.net/aa1733519509/article/details/50053553 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码. ...

  7. Android 设备获取物理唯一标识码

    唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. import android.provider.Settings.Secure; private String android_id ...

  8. android设备udid,Android下获取设备唯一标识(UDID, DeviceID)

    android下获取设备唯一标识原本非常简单(至少不会像iOS一样禁用这个,禁用那个),但是由于设备的多样性需要考虑的东西也对应复杂起来. 先附上完整代码 protected static final ...

  9. Windows获取系统唯一标识UUID

    Windows获取系统唯一标识UUID  (也叫CSP UUID) 命令行 wmic csproduct get uuid C/C++ 使用CoCreateGuid函数,可以参考官方:https:// ...

最新文章

  1. keras 的 example 文件 neural_doodle.py 解析
  2. 知乎算法团队负责人孙付伟:Graph Embedding在知乎的应用实践
  3. 安卓开发_求好评功能
  4. 开发完成的springboot项目扩展 swagger
  5. matlab2018a安装后帮助文档打不开解决方法
  6. c include 多层目录_Rsync 秒杀一切备份工具,你能手动屏蔽某些目录吗?
  7. 用好这7个VS Code插件,前端编程效率蹭蹭涨
  8. svn导出项目到myeclipse,运行报ClassNotFoundException
  9. 以太网的分层架构_读《企业应用架构模式》记录-分层
  10. vue中style下scope的使用和坑
  11. 用命令打开文件服务器资源管理器,Windows10使用命令参数打开文件资源管理器的方法...
  12. model.train()与model.eval()的用法
  13. oracle 给表空间增加多个数据文件
  14. 苹果公司欲使用3D打印技术进行新产品的测试
  15. android开发集成flash,Android开发之Adobe flash操作工具类
  16. 【聊技术】在Android中实现自适应文本大小显示
  17. 第四部分、JEECG-BOOT 微服部署文档
  18. Selenium 手动安装方法
  19. Linux5配置本地yum源,Rehat Enterprise Linux 5:配置本地yum源
  20. word宏命令批量修改图片大小

热门文章

  1. P2P投资理财项目“百强榜”今夏出炉
  2. 开始做mvc 框架 家庭理财项目。
  3. java jsse ssl 调试_使用Java安全Socket扩展包(JSSE)实现SSL
  4. java 获得某月的第一天和最后一天
  5. Fay控制器及数字人模型,可灵活组合出不同的应用场景:虚拟主播、现场推销货、商品导购、语音助理、远程语音助理、数字人互动、数字人面试官及心理测评、贾维斯、Her
  6. 如何前端实现微信卡片分享
  7. 阿里云python轻应用学习笔记(二)---开发一个LED跑马灯程序
  8. 杀死重装也杀不掉的病毒!
  9. Linux下—自制U盘启动安装Linux系统
  10. HTML语言常用英语,HTML中常用标签及其英文全称