2011-03-30 29 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; 
    } 
相關問題