如何使用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);
}
}
1.首先请求硬盘序列号的人,而不是分区之一 2。其次,你的代码工作不正常,因为我的Win7系统+ Java 7甚至产生了负面结果(我甚至隔离了Visual Basic脚本并执行,仍然是错误的) – Alex 2012-12-05 13:25:22
@Alex我认为你比我们更天才... 。你应该知道当某人接受答案时意味着它对他有效......先阅读答案定义,然后倒退。我清楚了吗? – 2012-12-05 15:13:34
如果我的答案错了,请解释它,但不要提出讽刺意见。除了我保留我以前的意见(因为我重新阅读整个东西)和我的downvote。 – Alex 2012-12-05 20:20:26
我想你会不得不在C或C++中实现该功能,并使用JNI从Java访问它。
Java在没有硬盘驱动器的虚拟机上运行只有文件和文件系统。您应该能够通过运行Java的approriate命令行实用程序来获取此信息。
一个Linux可以做
hdparm -i /dev/hda
如果您使用的是Windows操作系统是Win7的SP1或更高版本,你可以简单地在Java程序中执行以下cmd命令,通过WMIC得到它。
wmic diskdrive get serialnumber
如果该命令返回“无效的XML内容。”你可能想在here描述应用的修补程序文件。
好消息是FileStore对象的volume:vsn
属性。
for (FileStore store: FileSystems.getDefault().getFileStores()) {
System.out.format("%-20s vsn:%s\n", store, store.getAttribute("volume:vsn"));
}
输出看起来像一个int(例如-1037833820
,194154
)
坏消息是专用于测试目的窗口,因为他们在WindowsFileStore jdk8u source说。可能在其他平台以及未来工作,或者不在。
其他选项(JNI,执行和解析CLI)也取决于系统。更精巧但更改运行时可能不会突然中断。但我认为属性解决方案非常简单,我完全赞同它,直到我有更好的东西。
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;
}
对于您可以使用WMI窗口。 – 2011-03-30 06:58:57
顺便说一句 - 如果你这样做是为了防止盗窃软件的人,你已经'失去了'。 – 2011-03-30 07:13:59
@thompson您对该评论的含义是什么? – developer 2011-03-30 07:17:21