如何在Java中获取唯一的计算机标识符(例如磁盘ID或主板ID)?

69

我想使用Java在Windows、MacOS和可能的Linux上获取与计算机唯一相关的id。可以是磁盘UUID、主板序列号等。

Runtime.getRuntime().exec可以被使用(它不是一个applet)。

有什么想法吗?


1
这是为了反盗版计划吗? - Mark Byers
3
可能会是一个JNI调用,没有本地Java代码。 - curtisk
1
是的,这是用于类似反盗版方案的东西,用于识别计算机。 - Gohu
6
只要可以通过exec()运行的东西都可以被替换。用户只需要创建一个程序,始终返回预期结果即可。这只是从工作机器中获取数据并编写输出相同结果的程序(例如从文件中读取)的问题。 - Peter Lawrey
11个回答

0
在我编写的发布版Java程序中,我使用了主板序列号(我认为Windows也是这样做的);然而,这只适用于Windows,因为我的函数创建了一个临时VB脚本,该脚本使用WMI来检索该值。
public static String getMotherboardSerial() {
      String result = "";
        try {
          File file = File.createTempFile("GetMBSerial",".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_ComputerSystemProduct\") \n"
            + "For Each objItem in colItems \n"
            + "    Wscript.Echo objItem.IdentifyingNumber \n"
            + "Next \n";

          fw.write(vbs);
          fw.close();
          Process gWMI = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
          BufferedReader input = new BufferedReader(new InputStreamReader(gWMI.getInputStream()));
          String line;
          while ((line = input.readLine()) != null) {
             result += line;
             System.out.println(line);
          }
          input.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        result = result.trim();
        return result;
      }

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