使用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获取计算机中硬盘的真实序列号的主要内容,如果未能解决你的问题,请参考以下文章

java 能不能获取CPU的ID号,硬盘的序列号

java 能不能获取CPU的ID号,硬盘的序列号

C# 获取本机CPU序列号,MAC地址,硬盘ID,本机IP地址,计算机名,物理内存,PC类型

获取其中所有硬盘和分区的序列号

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

如何在 C#(无 WMI)中获取硬盘序列号?