如何使用Java获取计算机特定的ID号码

11

我希望使用与MAC地址不同的机器特定ID号创建UUID哈希,以验证运行Java应用程序的计算机。在Java 1.8中是否有可能实现?如果可以,我应该选择哪个选项最佳?如果能够在Windows和Unix平台上使用,则更加有助于解决。


为什么不是MAC地址? - Federico klez Culloca
如果计算机没有安装网络卡。 - GeekySelene
你认为这在你的目标计算机中很常见吗,还是你只是非常谨慎? - Federico klez Culloca
4
可能是[如何在Java中获取唯一计算机标识符(例如磁盘ID或主板ID)]的重复问题。 - Georg Muehlenberg
嘿,请查看这个问题的答案。你可以获取各种序列号,例如主板的序列号。 - Georg Muehlenberg
显示剩余3条评论
3个回答

7

是的,您可以在PC和Linux系统中不使用MAC地址来完成此操作。

我将把该过程分解成步骤。
第一步:确定操作系统
在您的Java代码中,可以像这样识别所使用的操作系统:

private static String OS = System.getProperty("os.name").toLowerCase();
if(OS.indexOf("win") >= 0)
//your code for windows OS.
else if(OS.indexOf("mac") >= 0)
//your code for MAC OS.
else if(OS.indexOf("sunos") >= 0)
//your code for Solaris OS
else if(OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0 )
//your code for unix OS's

步骤2:使用必要的命令获取系统的UUID
什么是UUID?

通用唯一标识符(UUID)是一个128位数,用于在计算机系统中识别信息。

对于Windows操作系统

Runtime.exec("wmic csproduct get UUID");

命令行命令wmic csproduct get UUID可返回PC [windows]的UUID。

对于Linux系统
使用以下内核命令:Runtime.exec("YOUR COMMAND")

# cat /sys/class/dmi/id/product_uuid

要了解更多关于 Runtime.exec 的内容,请查看这个java.lang.Runtime.exec
java.lang.Runtime.exec : 通过此方法,您可以为任何基础环境(如MAC、Windows、Linux等)提供适当的shell命令。


谢谢。你救了我的一天。当命令需要权限运行时,你能指定如何将命令输出转换为字符串吗? - GeekySelene

6

是的...您可以使用Java获取计算机特定的ID号。您可以使用系统的UUID来作为计算机特定的ID号。

要使用Java获取系统的UUID,请参考以下代码:

    String command = "wmic csproduct get UUID";
    StringBuffer output = new StringBuffer();

    Process SerNumProcess = Runtime.getRuntime().exec(command);
    BufferedReader sNumReader = new BufferedReader(new InputStreamReader(SerNumProcess.getInputStream()));

    String line = "";
    while ((line = sNumReader.readLine()) != null) {
        output.append(line + "\n");
    }
    String MachineID=output.toString().substring(output.indexOf("\n"), output.length()).trim();;
    System.out.println(MachineID);

}

您可以使用以下代码仅获取Windows系统的UUID。

如果您想使用Java获取MAC OS的UUID,请参考以下代码:

    String command = "system_profiler SPHardwareDataType | awk '/UUID/ { print $3; }'";

    StringBuffer output = new StringBuffer();


    Process SerNumProcess = Runtime.getRuntime().exec(command);

    BufferedReader sNumReader = new BufferedReader(new InputStreamReader(SerNumProcess.getInputStream()));

    String line = "";

    while ((line = sNumReader.readLine()) != null) {
        output.append(line + "\n");
    }

    String MachineID=output.toString().substring(output.indexOf("UUID: "), output.length()).replace("UUID: ", "");

    SerNumProcess.waitFor();

    sNumReader.close();

    System.out.println(MachineID);
} 

谢谢你。


请从您的回答中删除问题。这不是一个普通的论坛,而是一个具有明确问题和答案区分的问答网站。要获得您的问题的答案,请将其作为新问题提出 :) - geisterfurz007

4

就像这样,根据平台,UUID可以作为字符串进行检索。

String OS = System.getProperty("os.name").toLowerCase();
String machineId = null;
if (OS.indexOf("win") >= 0) {
    StringBuffer output = new StringBuffer();
    Process process;
    String[] cmd = {"wmic", "csproduct", "get", "UUID"};  
    try {
        process = Runtime.getRuntime().exec(cmd);
        process.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = "";
        while ((line = reader.readLine()) != null) {
            output.append(line + "\n");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    machineId = output.toString();
} else if (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0) {

    StringBuffer output = new StringBuffer();
    Process process;
    String[] cmd = {"/bin/sh", "-c", "echo <password for superuser> | sudo -S cat /sys/class/dmi/id/product_uuid"};
    try {
        process = Runtime.getRuntime().exec(cmd);
        process.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = "";
        while ((line = reader.readLine()) != null) {
            output.append(line + "\n");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    machineId = output.toString();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接