【问题标题】:Get the real serial number of Hard-Disk in computer using java使用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的教程:

  1. 打开命令提示符窗口(开始菜单 > 所有程序 > 附件 > 命令提示符)。
  2. 输入:卷。
  3. 卷序列号是磁盘序列号。

代码和教程之间的结果确实有很大的不同。 大家知道哪一个是真的吗?以及如何证明?

【问题讨论】:

  • 这似乎是特定于 Windows Power Shell 的方法(这可能足以满足您的需要),您得到什么类型的输出?为什么不直接执行并解析vol命令的结果呢?
  • 我想知道正确的JAVA代码如何获取计算机上硬盘的SN。

标签: java hard-drive serial-number


【解决方案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 类为您提供了几种从输入流获取信息的方法

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 2011-05-04
    • 2016-06-10
    • 1970-01-01
    • 2011-05-10
    • 2010-11-24
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多