使用java获取计算机中硬盘的真实序列号
Posted
技术标签:
【中文标题】使用java获取计算机中硬盘的真实序列号【英文标题】:Get the real serial number of Hard-Disk in computer using java 【发布时间】:2014-02-08 17:38:14 【问题描述】:我一直在尝试这段代码,但我想知道输出不是序列号 (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);
然后,我也试图证明真实的 SN 可能是真的(包含数字和字母)。 这是我检查硬盘真实SN的教程:
-
打开命令提示符窗口(开始菜单 > 所有程序 > 附件 > 命令提示符)。
输入:卷。
卷序列号是磁盘序列号。
代码和教程之间的结果确实有很大的不同。 大家知道哪一个是真的吗?以及如何证明?
【问题讨论】:
这似乎是特定于 Windows Power Shell 的方法(这可能足以满足您的需要),您得到什么类型的输出?为什么不直接执行并解析vol
命令的结果呢?
我想知道正确的JAVA代码如何获取计算机上硬盘的SN。
【参考方案1】:
您可能想尝试更多类似的方法:
import java.io.*;
public class SerialNumber
public String executeVolCommand()
String NEWLINE = System.getProperty("line.separator");
StringBuffer buffer = new StringBuffer();
try
Process pb = new ProcessBuilder("cmd","/c", "vol").start();
InputStream in = pb.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = br.readLine()) != null)
buffer.append(line + NEWLINE);
catch(Exception e)e.printStackTrace();
return buffer.toString();
然后,一旦得到结果,就可以解析它以获得实际的序列号。希望这会有所帮助。
【讨论】:
谢谢,真的很有帮助。但是,我仍然想知道哪个是正确的硬盘SN? 由于您没有发布脚本文件的内容,我们无法推断它在做什么。此外,您看到的 vol 命令创建的序列号是操作系统在最初格式化驱动器时生成的软件。这不是实际的制造商序列号。查看:en.wikipedia.org/wiki/Volume_serial_number 我读过的其他帖子对此进行了解释。我不认为真的有一个确定的方法来获取制造商的序列号。这可能需要进一步调查。【参考方案2】:如果你还想知道答案...
import java.io.*;
import java.util.*;
public class SerialNumber
public static void main ( String[] args ) throws Exception
Process p = Runtime.getRuntime().exec ( "ioreg -l" );
InputStream is = p.getInputStream();
StringBuilder sb = new StringBuilder();
int i = 0;
while ( ( i = is.read() ) != -1 ) if ( ( char ) i != '|' && ( char ) i != ' ' ) sb.append ( ( char ) i );
InputStream fis = new ByteArrayInputStream ( sb.toString().getBytes() );
Properties pro = new Properties();
pro.load ( fis );
System.out.println ( pro.get ( "\"IOPlatformSerialNumber\"" ).toString().substring ( 1, pro.get ( "\"IOPlatformSerialNumber\"" ).toString().length() - 1 ) );
我正在运行 Mac OSX 10.10
【讨论】:
因为这个是Java,前面的答案是为Windows写的,而这个是为MAC写的,真的没多大用处。 @Will 获取 Mac 的信息很有用,如果您需要适用于所有平台的东西,您需要每个受支持平台的代码。 因为 OP 明明是在运行 Windows,所以对 OP 真的一点帮助都没有。【参考方案3】: // InputStream stream = Runtime.getRuntime().exec("wmic diskdrive get name,size,model,SerialNumber ").getInputStream();
List<String> collect;
InputStream stream = Runtime.getRuntime().exec("wmic diskdrive get SerialNumber ").getInputStream();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream)))
collect = reader.lines().collect(Collectors.toList());
/*while ((line = reader.readLine()) != null)
model += line;
*/
注意:BufferedReader 类为您提供了几种从输入流获取信息的方法
【讨论】:
以上是关于使用java获取计算机中硬盘的真实序列号的主要内容,如果未能解决你的问题,请参考以下文章