2011-03-30 34 views
3

如何使用java获取硬盘的序列号?如何使用java获取硬盘序列号?

+0

对于您可以使用WMI窗口。 – 2011-03-30 06:58:57

+2

顺便说一句 - 如果你这样做是为了防止盗窃软件的人,你已经'失去了'。 – 2011-03-30 07:13:59

+0

@thompson您对该评论的含义是什么? – developer 2011-03-30 07:17:21

回答

14

该序列号是由操作系统创建的,其中格式化驱动器,它不是制造商编号。它是独一无二的,因为它是基于当前时间信息即时创建的。 AFAIK,没有返回制造商SN的API。充其量,HD固件的SN可以被读取,但是这将涉及一些非常低级别的API调用。请记住,即使您获得该号码,也不保证它是唯一的,因为每个制造商都可以按照他们的意愿分配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); 
    } 
} 
+0

1.首先请求硬盘序列号的人,而不是分区之一 2。其次,你的代码工作不正常,因为我的Win7系统+ Java 7甚至产生了负面结果(我甚至隔离了Visual Basic脚本并执行,仍然是错误的) – Alex 2012-12-05 13:25:22

+1

@Alex我认为你比我们更天才... 。你应该知道当某人接受答案时意味着它对他有效......先阅读答案定义,然后倒退。我清楚了吗? – 2012-12-05 15:13:34

+0

如果我的答案错了,请解释它,但不要提出讽刺意见。除了我保留我以前的意见(因为我重新阅读整个东西)和我的downvote。 – Alex 2012-12-05 20:20:26

1

我想你会不得不在C或C++中实现该功能,并使用JNI从Java访问它。

1
  1. Windows:This是一个使用调用VBS的Java的依赖于窗口的解决方案。
  2. Linux:尝试this c程序并使用JNI for Java。
+0

Window解决方案类似于Pankaj Kumar发布的一个...所以它不好 – Alex 2012-12-05 13:28:29

4

Java在没有硬盘驱动器的虚拟机上运行只有文件和文件系统。您应该能够通过运行Java的approriate命令行实用程序来获取此信息。

一个Linux可以做

hdparm -i /dev/hda 
1

如果您使用的是Windows操作系统是Win7的SP1或更高版本,你可以简单地在Java程序中执行以下cmd命令,通过WMIC得到它。

wmic diskdrive get serialnumber 

如果该命令返回“无效的XML内容。”你可能想在here描述应用的修补程序文件。

2

好消息是FileStore对象的volume:vsn属性。

for (FileStore store: FileSystems.getDefault().getFileStores()) { 
    System.out.format("%-20s vsn:%s\n", store, store.getAttribute("volume:vsn")); 
} 

输出看起来像一个int(例如-1037833820194154

坏消息是专用于测试目的窗口,因为他们在WindowsFileStore jdk8u source说。可能在其他平台以及未来工作,或者不在。

其他选项(JNI,执行和解析CLI)也取决于系统。更精巧但更改运行时可能不会突然中断。但我认为属性解决方案非常简单,我完全赞同它,直到我有更好的东西。

1

Windows机器上,你可以使用

public static String getSerialKey(Character letter) throws Exception{ 
     String line = null; 
     String serial = null; 
     Process process = Runtime.getRuntime().exec("cmd /c vol "+letter+":"); 
     BufferedReader in = new BufferedReader(
       new InputStreamReader(process.getInputStream())); 
     while ((line = in.readLine()) != null) { 
      if(line.toLowerCase().contains("serial number")){ 
       String[] strings = line.split(" "); 
       serial = strings[strings.length-1]; 
      } 
     } 
     in.close(); 
     return serial; 
    } 
相关问题