2011-03-30 3 views

답변

14

드라이브를 포맷하는 곳 일련 번호는 OS에 의해 생성 할 수 있으며 제조업체 일련 번호가 아니다. 현재 시간 정보를 기반으로 즉석에서 만들어지기 때문에 독특합니다. 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 Script를 격리하고 실행했는데 여전히 잘못되었습니다.)에서 부정적인 결과를 얻었으므로 코드가 올바르게 작동하지 않습니다. – Alex

+1

@Alex 저는 여러분이 우리보다 더 천재라고 생각합니다 ... 누군가가 대답을 수락하면 그 사람이 그 사람을 위해 일했음을 알게 될 것입니다 ... 먼저 대답 정의를 읽은 다음 downvote를 읽으십시오. 내가 알 겠어? –

+0

제 답변이 잘못되어 있다면 설명해주십시오. 그러나 아이러니 컬하게 의견을 말하지 마십시오. 옆에 나는 나의 이전의 의견 (내가 전체의 물건을 다시 읽었던 것에 따라)과 나의 downvote를 간직한다. – Alex

1

C 또는 C++에서이 기능을 구현하고 JNI를 사용하여 Java에서 액세스해야한다고 생각합니다.

1
  1. 윈도우 : This은 VBS를 호출하는 자바를 사용하여 Windows 의존 솔루션입니다.
  2. Linux : this c 프로그램을 시도하고 Java 용 JNI를 사용하십시오.
+0

윈도우 솔루션은 Pankaj Kumar가 게시 한 것과 비슷합니다 ... 그래서 좋지 않습니다. – Alex

4

Java는 하드 드라이브가없는 가상 컴퓨터에서 파일 및 파일 시스템 만 실행합니다. Java에서 approriate 명령 행 유틸리티를 실행하여이 정보를 얻을 수 있어야합니다.

한 리눅스는

hdparm -i /dev/hda 
1

당신이 Win7에의 SP1 이상 인 Windows OS를 사용하는 경우, 당신은 단순히 WMIC를 통해, 자바 프로그램에서 다음 cmd를 명령을 실행하여 얻을 수 있습니다.

wmic diskdrive get serialnumber 

이 명령 반환 "잘못된 XML 내용.는"당신이 here에 설명 된대로 핫픽스 파일을 적용하고 싶어 할 수 있습니다 경우

.

2

좋은 소식 FileStore 개체에 대한 volume:vsn 특성이 있습니다. 그들은 WindowsFileStore jdk8u source, 말

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

출력은 int 형처럼 보인다 (예를 들어 -1037833820, 194154)

나쁜 소식은 테스트 목적으로에 대한 창 다릅니다. 미래에 다른 플랫폼에서도 작동 할 수 있습니다.

다른 옵션 (JNI, 실행 및 구문 분석 CLI)도 시스템에 따라 다릅니다. 좀 더 자세하지만 런타임을 변경할 때 갑자기 중단되지 않을 수도 있습니다. 그러나 나는 속성 솔루션이 훨씬 더 간단하다고 생각합니다.

1

윈도우 머신에 당신은 당신이 WMI를 사용하여 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; 
    } 
관련 문제