如何使用Java获取硬盘序列号?

5

如何使用Java获取硬盘的序列号?


3
顺便提一句,如果你这样做是为了防止别人盗取软件,那么你已经“输了”。 - Andrew Thompson
@thompson,你的评论是什么意思? - developer
2
他可能是指很容易伪造序列号来欺骗你的代码。 - Stephen C
7个回答

5

Java运行在虚拟机上,没有硬盘只有文件和文件系统。您可以通过从Java运行适当的命令行实用程序来获取此信息。

在Linux上,您可以执行以下操作:

hdparm -i /dev/hda 

4

好消息,FileStore对象有一个volume:vsn属性。

for (FileStore store: FileSystems.getDefault().getFileStores()) {
     System.out.format("%-20s vsn:%s\n", store, store.getAttribute("volume:vsn"));
}

输出结果看起来像一个 int (例如 -1037833820194154)。
不幸的消息是这个方法只能在 Windows 操作系统下使用,而且仅用于测试。如 WindowsFileStore jdk8u 源代码 所述。该方法可能会在其他平台和未来得以运行,也可能无法运行。
其他选项(JNI、执行和解析 CLI)也与系统相关。虽然更复杂但不会突然出现运行时改变。但我认为属性解决方案更简单,所以我将继续采用它,直到找到更好的方法。

2

在 Windows 机器上,您可以使用

public static String getSerialKey(Character letter) throws Exception{
        String line = null;
        String serial = null;
        Process process = Runtime.getRuntime().exec("cmd /c vol "+letter+":");
        BufferedReader in = new BufferedReader(
                new InputStreamReader(process.getInputStream()) );
        while ((line = in.readLine()) != null) {
            if(line.toLowerCase().contains("serial number")){
                String[] strings = line.split(" ");
                serial = strings[strings.length-1];
            }
        }
        in.close();
        return serial;
    }

2

如果您使用的是Windows操作系统,版本为Win7 SP1或更高版本,则可以通过在Java程序中执行以下cmd命令来获取它,通过wmic。

wmic diskdrive get serialnumber

如果这个命令返回“无效的XML内容”,您可能需要按照此处描述的方式应用热修复文件。请注意保留HTML标签。

1
  1. Windows: 是一个依赖于Windows的解决方案,使用Java调用VBS。
  2. Linux: 尝试这个C程序,并使用JNI来调用Java。

窗口解决方案与Pankaj Kumar发布的类似...所以它没有用。 - Alex

0

对于 Windows 机器,您可以使用参数执行 wmic,然后像以下代码片段中所做的那样解析结果:

public static String getNumeroDisq() throws IOException {
    Runtime runtime = Runtime.getRuntime();
    String[] commands = {"wmic", "diskdrive", "get", "SerialNumber"};
    Process process = runtime.exec(commands);
    String chain = null;
    try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        String serialNumber= null;
        while ((serialNumber = bufferedReader.readLine()) != null) {
            if (serialNumber.trim().length() > 0) {
                chain = serialNumber;
            }
        }
        return chain.trim();
    }
}

0
我想你需要用C或C++实现该功能,并使用JNI从Java中访问它。

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