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

3

我尝试了这段代码,但是输出的不是序列号(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. 输入:vol。
  3. 卷序列号即为磁盘序列号。

代码和教程之间的结果确实有很大的差异。你们知道哪一个是真实的吗?如何证明呢?


2
这似乎是一个针对Windows Power Shell的特定方法(这可能已经足够满足您的需求),您得到了什么类型的输出?为什么不直接执行和解析“vol”命令的结果呢? - Elliott Frisch
我想知道JAVA中如何获取计算机硬盘的序列号的正确代码。 - user3198020
3个回答

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

然后,一旦您获得结果,您可以解析出实际的序列号。希望这能帮到您。


谢谢,这真的很有帮助。但是,我仍然想知道哪一个是硬盘的正确序列号? - user3198020
1
由于您没有发布脚本文件的内容,我们无法推断它正在做什么。此外,您看到的由vol命令创建的序列号是在驱动器最初格式化时操作系统生成的软件序列号。它不是实际制造商的序列号。请查看:http://en.wikipedia.org/wiki/Volume_serial_number 其他我读过的帖子也解释了这一点。我认为真正获取制造商序列号的方法并不存在。那可能需要进一步调查。 - Alan

0
 // 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类提供了多种从输入流中获取信息的方法。

0

如果你仍然想要答案...

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信息是有用的,但如果需要在所有平台上运行,就需要为每个支持的平台编写代码。 - AmanicA
因为 OP 明显在运行 Windows,这对 OP 没有任何帮助。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接