使用java获取计算机中硬盘的真实序列号

使用java获取计算机中硬盘的真实序列号,java,hard-drive,serial-number,Java,Hard Drive,Serial Number,我一直在尝试这段代码,但我想知道输出的不是序列号(SN)。结果只包含没有字母的数字。我想,一定是数字和字母的组合 代码如下: import java.io.File; import java.io.FileWriter; import java.io.BufferedReader; import java.io.InputStreamReader; public class DiskUtils { private DiskUtils() { } public static

我一直在尝试这段代码,但我想知道输出的不是序列号(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可能是真的(包含数字和字母)。 下面是我用来检查硬盘真实序列号的教程:

  • 打开命令提示窗口(开始菜单>所有程序>附件>命令提示)
  • 输入:vol
  • 卷序列号是磁盘序列号
  • 代码和教程之间的结果有很大的不同。
    你们知道吗,哪一个是真的?以及如何证明这一点?

    您可能想尝试以下内容:

    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();      }
    }
    

    然后,一旦得到结果,就可以解析它以获得实际的序列号。希望这能有所帮助。

    如果您仍然想要答案

    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

    //InputStream stream=Runtime.getRuntime().exec(“wmic diskdrive获取名称、大小、型号、序列号”).getInputStream();
    
     // 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;
            }*/
        }
    
    列表收集; InputStream stream=Runtime.getRuntime().exec(“wmic diskdrive get SerialNumber”).getInputStream(); try(BufferedReader=new BufferedReader(new InputStreamReader(stream))){ collect=reader.lines().collect(collector.toList()); /*而((line=reader.readLine())!=null){ 模型+=直线; }*/ }

    注意:BufferedReader类为您提供了几种从inputstream获取信息的方法这似乎是一种特定于Windows Power Shell的方法(这可能足以满足您的需要),您将获得什么类型的输出?为什么不直接执行和解析
    vol
    命令的结果呢?我想知道正确的JAVA代码如何在计算机上获取硬盘的序列号。谢谢,这真的很有帮助。但是,我仍然想知道哪一个是正确的硬盘序列号?因为你没有发布脚本文件的内容,我们无法推断它在做什么。此外,vol命令创建的序列号是驱动器初始格式化时操作系统生成的软件。它不是实际的制造商序列号。看看:我读过的其他帖子解释了这一点。我不认为真的有一个确定的方法来获得制造商的序列号。这可能需要进一步调查。因为这是Java,前面的答案是为Windows编写的,而这是为MAC编写的,这真的没有多大帮助。@如果需要在所有平台上都能工作的东西,获取MAC的信息是否有用,您需要为每个受支持的平台编写代码。因为OP显然运行的是Windows,所以它对OP毫无帮助。