2014-09-01 56 views
2

我想製作一個java程序,它將通過cmd或終端的硬盤的序列。我試圖在操作系統(Windows,Linux)上。我遇到了Linux的問題,它會返回一個空格,當我在終端中鍵入hdparm -I /dev/sda | grep Serial它顯示硬盤的序列號。java越來越硬盤序列

問題如何獲取或顯示序列號。

這裏是我的代碼:

private static String OS= System.getProperty("os.name").toLowerCase(); 
    private static String system; 
    private static String serial; 
    private void getVol(String drive) 
    { 
     String query=new String(); 
     if(isWindows()) 
     { 
      query="cmd /c"+" vol "+drive+":"; 
     } 
     else if(isUnix()) 
     { 
      query="hdparm -I /dev/sda | grep Serial"; 
     } 
     try 
     { 
      Runtime rt=Runtime.getRuntime(); 
      InputStream is=rt.exec(query).getInputStream(); 
      InputStreamReader isr=new InputStreamReader(is); 
      BufferedReader br=new BufferedReader(isr); 
      String line; 
      if(isWindows()) 
      { 
       br.readLine(); 
       line=br.readLine(); 
       line=line.substring(line.lastIndexOf(" ")+1); 
       serial=line; 
      } 
      else if(isUnix()) 
      { 
       line=br.readLine(); 
       serial=line; 
      } 
     }catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    private static boolean isWindows() { 
     return (OS.indexOf("win") >= 0); 
    } 
    private static boolean isUnix() 
    { 
     return (OS.indexOf("nux") >= 0); 
    } 

    public static void main(String args[]) 
    { 
     MainClass f=new MainClass(); 
     f.getVol("C"); 
     System.out.println(serial); 
    } 
+0

你從'系統獲得什麼樣的價值。 。的getProperty( 「os.name」)toLowerCase();'? – 2014-09-01 06:06:35

+0

它在windows中返回windows 8.1並且在centOS(linux)中返回linux – askManiac 2014-09-01 06:07:57

+0

在你的Linux操作系統上,我的意思是。那是給你的問題,對吧? – 2014-09-01 06:10:16

回答

0

你的問題是幾乎可以肯定的是運行hdparm需要root權限。它不能由普通用戶運行。

此外,您在Windows上讀取的「序列號」是主文件系統的卷序列號,而不是的硬盤驅動器。它可以很容易地改變(例如,使用VolumeID)。

+0

以及我目前正在以root身份運行,但仍然無法正常工作... – askManiac 2014-09-01 06:45:23

+0

有關如何將其作爲非'rootro'運行,請參閱http://stackoverflow.com/questions/7619483/getting-hdd-serial-上Linux的無根的權限 – Raedwald 2014-09-01 06:51:31

0

自發布以來已有一段時間了,但@ giusc解決方案對我無效,因此將我的研究發佈給其他人。

獲取在Linux上的硬盤驅動器序列號:

public static void main(String[] args) throws Exception { 

    String sc = "/sbin/udevadm info --query=property --name=sda"; // get HDD parameters as non root user 
    String[] scargs = {"/bin/sh", "-c", sc}; 

    Process p = Runtime.getRuntime().exec(scargs); 
    p.waitFor(); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line; 
    StringBuilder sb = new StringBuilder(); 

    while ((line = reader.readLine()) != null) { 
     if (line.indexOf("ID_SERIAL_SHORT") != -1) { // look for ID_SERIAL_SHORT or ID_SERIAL 
      sb.append(line); 
     }  
    } 

    System.out.println("HDD Serial number:" + sb.toString().substring(sb.toString().indexOf("=") + 1)); 
} 

獲取硬盤序列號(製造)的Windows:

public static void main(String[] args) { 
    String sc = "cmd /c" + "wmic diskdrive get serialnumber"; 

    Process p = Runtime.getRuntime().exec(sc); 
    p.waitFor(); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

    String line; 
    StringBuilder sb = new StringBuilder(); 

    while ((line = reader.readLine()) != null) { 
     sb.append(line); 
    } 

    System.out.println("HDD Serial number: " + sb.substring(sb.toString().lastIndexOf("r") + 1).trim()); 
}