Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算机特定ID?_Java - Fatal编程技术网

Java 计算机特定ID?

Java 计算机特定ID?,java,Java,我正在尝试使用Java生成一个特定的计算机id。我曾经考虑过硬盘序列、Windows序列键、CPU ID或MAC地址,但其他计算机也可能有相同的。。例如,如果有人盗用Windows 7的副本,他们可能与其他人拥有相同的序列号。。我想知道是否有人能给我一种方法来生成一个计算机特定的ID,它永远不会改变,并且可以使用Java检索 我做了一些研究,发现了一些有用的函数。我在想这样的事情。但是如果他们改变了硬件,就会改变计算机ID。有人知道我可以用什么吗 public String getCompute

我正在尝试使用Java生成一个特定的计算机id。我曾经考虑过硬盘序列、Windows序列键、CPU ID或MAC地址,但其他计算机也可能有相同的。。例如,如果有人盗用Windows 7的副本,他们可能与其他人拥有相同的序列号。。我想知道是否有人能给我一种方法来生成一个计算机特定的ID,它永远不会改变,并且可以使用Java检索

我做了一些研究,发现了一些有用的函数。我在想这样的事情。但是如果他们改变了硬件,就会改变计算机ID。有人知道我可以用什么吗

public String getComputerID(){
    InetAddress ip = InetAddress.getLocalHost();
    NetworkInterface network = NetworkInterface.getByInetAddress(ip);
    byte[] mac = network.getHardwareAddress();
    String sn = getSerialNumber("C");
    String cpuId = getMotherboardSN();
    return MD5(mac + sn + cpuId);
}


public String MD5(String md5) {
try {
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(md5.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
        sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
    }
        return sb.toString();
    } catch (java.security.NoSuchAlgorithmException e) {
    }
    return null;
}

public String getSerialNumber(String drive) {
String result = "";
    try {
    File file = File.createTempFile("realhowto",".vbs");
    file.deleteOnExit();
    FileWriter fw = new java.io.FileWriter(file);

  StringBufferring 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);
    FileWriter.close();
      Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
      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();
}

public String getMotherboardSN() {
String result = "";
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.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();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
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();
}
公共字符串getComputerID(){
InetAddress ip=InetAddress.getLocalHost();
NetworkInterface网络=NetworkInterface.getByInetAddress(ip);
字节[]mac=network.getHardwareAddress();
字符串sn=getSerialNumber(“C”);
字符串cpuId=getMotherboardSN();
返回MD5(mac+sn+cpuId);
}
公共字符串MD5(字符串MD5){
试一试{
java.security.MessageDigest md=java.security.MessageDigest.getInstance(“MD5”);
字节[]数组=md.digest(md5.getBytes());
StringBuffer sb=新的StringBuffer();
对于(int i=0;i
我确实认为您应该使用硬件配置文件中的内容
计算机可以看作是一组硬件,包括网络接口。 一个典型的模式可以是MAC地址和通过网络管理计算机的管理系统生成的ID的组合
在向管理系统注册过程中唯一标识机器的MAC地址
作为注册的结果,管理系统可以返回生成的唯一ID,
存储在注册到它的计算机上,并将在以后使用
成功注册后,您可以更换网络接口卡,因为计算机不依赖于要识别的MAC地址
您也可以考虑使用Linux dMIDECODE实用工具
(对于Linux机器,
,因为您提供了一个基于WINDOWS的解决方案,
所以对于我们的Linux读者来说,
我想推荐一个Linux替代品)(如果您想要唯一标识的机器有Linux和DMIDECOE安装)。BR> 使用dmidecoe,您可以获得更多的硬件配置文件,并对其执行一些哈希函数,并生成一个唯一的ID,该ID将唯一地(准确地说是高概率地)标识您的机器
阅读更多关于dmidecode的信息
当然,如果您采用“从操作系统获取硬件信息”的方法(即dmidecode或您在获取MAC地址后的部分建议的方法,
您需要一个跨平台的代码来检查java程序运行的操作系统是什么,您可以使用以下命令来完成:

System.getProperty("os.name");
在查看了每个人的输入和不少谷歌搜索之后,我得出了这个结论

从技术上讲,如果您移除一个组件并替换它,它将是一台全新的计算机,要生成一个真正的计算机特定ID,您必须从系统中的每个组件(即序列号)中获取一个特定变量,将它们全部合并,这将是一个“计算机特定ID”。但是,由于计算机很容易发生更改,因此最接近的可能是使用最不可能更改的组件,并使用其中的特定变量作为计算机ID。这通常是主板或其他不可能更改的组件。因此,最接近的可能是序列号(或其他一些子组件)的主板..在我个人看来

为什么主板最不可能更改?

似乎主板是人们考虑改变的最后一部分,特别是在新的计算机上。除非绝对需要,否则它们不会正常改变。另一个可行的选择是NIC。
    /**
     * Execute system console command 'vol' and retrieve volume serial number
     *
     * @param driveLetter - drive letter in convetion 'X:'
     * @return - Volume Serial Number, typically: 'XXXX-XXXX'
     * @throws IOException
     * @throws InterruptedException
     */
    static final String getVolumeSerial(String driveLetter) throws IOException, InterruptedException {
        Process process = Runtime.getRuntime().exec("cmd /C vol " + driveLetter);
        InputStream inputStream = process.getInputStream();
        InputStream errorStream = process.getErrorStream();
        if (process.waitFor() != 0) {
            Scanner sce = new Scanner(errorStream);
            throw new RuntimeException(sce.findWithinHorizon(".*", 0));
        }
        Scanner scn = new Scanner(inputStream);
        // looking for: ': XXXX-XXXX' using regex
        String res = scn.findWithinHorizon(": \\w+-\\w+", 0);
        return res.substring(2).toUpperCase().trim();
    }