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

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

此序列号由操作系统创建,其中格式化驱动器,而不是制造商序列号。 它是独一无二的,因为它是根据当前时间信息动态创建的。 AFAIK,没有返回制造商SN的API。 充其量,可以读取HD固件的SN,但这将涉及一些非常低级的API调用。 请记住,即使您获得该号码,也不能保证它是唯一的,因为每个制造商都可以按照自己的意愿分配SN。

import java.io.File; import java.io.FileWriter; import java.io.BufferedReader; import java.io.InputStreamReader; public class DiskUtils { private DiskUtils() { } public static String getSerialNumber(String drive) { String result = ""; try { File file = File.createTempFile("realhowto",".vbs"); file.deleteOnExit(); FileWriter fw = new java.io.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 note 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(); } public static void main(String[] args){ String sn = DiskUtils.getSerialNumber("C"); javax.swing.JOptionPane.showConfirmDialog((java.awt.Component) null, sn, "Serial Number of C:", javax.swing.JOptionPane.DEFAULT_OPTION); } } 

Java在没有硬盘驱动器的虚拟机上运行,​​只有文件和文件系统。 您应该能够通过从Java运行approriate命令行实用程序来获取此信息。

你可以做一个Linux

 hdparm -i /dev/hda 

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

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

输出看起来像一个int(例如194154

坏消息是Windows专用于测试目的,正如他们在WindowsFileStore jdk8u源中所说的那样 。 可能在其他平台和未来工作,或不。

其他选项(JNI,执行和解析CLI)也取决于系统。 更改精简但更改运行时可能不会突然崩溃。 但我认为属性解决方案要简单得多,而且我会完全接受它,直到我有更好的东西。

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

 wmic diskdrive get serialnumber 

如果此命令返回“ 无效的XML内容。 ”您可能希望应用此处所述的修补程序文件。

在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; } 

我想你必须在C或C ++中实现该function,并使用JNI从Java访问它。

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