2012-11-16 14 views
6

मैं जावा का उपयोग कर एक विशिष्ट कंप्यूटर आईडी उत्पन्न करने की कोशिश कर रहा हूं। मैंने हार्ड ड्राइव सीरियल, या विंडोज सीरियल कीज, सीपीयू आईडी, या मैक पते जैसी चीज़ों के बारे में सोचा है, लेकिन अन्य कंप्यूटरों के पास समान हो सकता है .. उदाहरण के लिए, अगर कोई विंडोज 7 की प्रतिलिपि बनाता है तो वे एक ही धारावाहिक हो सकते हैं किसी के रूप में .. मैं सोच रहा था कि कोई मुझे कंप्यूटर विशिष्ट आईडी उत्पन्न करने का कोई तरीका दे सकता है जो कभी नहीं बदला जाता है और जावा का उपयोग करके पुनर्प्राप्त किया जा सकता है?कंप्यूटर विशिष्ट आईडी?

मैंने कुछ शोध किया और कुछ उपयोगी कार्यों को पाया। और, मैं ऐसा कुछ सोच रहा था। लेकिन अगर वे अपने हार्डवेयर को बदलते हैं, तो यह कंप्यूटर आईडी बदल देगा। किसी को भी कुछ पता है जिसका मैं उपयोग कर सकता हूँ?

public String getComputerID(){ 
    InetAddress ip = InetAddress.getLocalHost(); 
    NetworkInterface network = NetworkInterface.getByInetAddress(ip); 
    byte[] mac = network.getHardwareAddress(); 
    String sn = getSerialNumber("C"); 
    String cpuId = getMotherboardSN(); 
    return MD5(mac + sn + cpuId); 
} 


public String MD5(String md5) { 
try { 
     java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); 
     byte[] array = md.digest(md5.getBytes()); 
     StringBuffer sb = new StringBuffer(); 
     for (int i = 0; i < array.length; ++i) { 
     sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3)); 
    } 
     return sb.toString(); 
    } catch (java.security.NoSuchAlgorithmException e) { 
    } 
    return null; 
} 

public String getSerialNumber(String drive) { 
String result = ""; 
    try { 
    File file = File.createTempFile("realhowto",".vbs"); 
    file.deleteOnExit(); 
    FileWriter fw = new java.io.FileWriter(file); 

    StringBufferring 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); 
    FileWriter.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 String getMotherboardSN() { 
String result = ""; 
try { 
File file = File.createTempFile("realhowto",".vbs"); 
file.deleteOnExit(); 
FileWriter fw = new java.io.FileWriter(file); 

String vbs = 
"Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n" 
+ "Set colItems = objWMIService.ExecQuery _ \n" 
+ " (\"Select * from Win32_BaseBoard\") \n" 
+ "For Each objItem in colItems \n" 
+ " Wscript.Echo objItem.SerialNumber \n" 
+ " exit for ' do the first cpu only! \n" 
+ "Next \n"; 

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(); 
} 
+0

तो आप कंप्यूटर विशिष्टता कैसे परिभाषित करते हैं? मुझे लगता है कि अगर वे हार्डवेयर बदलते हैं तो वे अपनी आईडी बदलते हैं। –

+0

बिल्कुल, और मैं एक कंप्यूटर आईडी उत्पन्न करने का एक तरीका खोजने का प्रयास कर रहा हूं जो उनके हार्डवेयर को बदलने पर नहीं बदलेगा .. –

+2

यह कॉपीराइट मालिकों और हर जगह डीआरएम रचनाकारों द्वारा आयोजित एक फंतासी की समाप्ति होगी। समस्या जटिल है, असीमित, "गेटचास", और समझौता के साथ। सौभाग्य! –

उत्तर

4

मुझे वास्तव में विश्वास है कि आपको हार्डवेयर प्रोफ़ाइल से कुछ उपयोग करना चाहिए।
नेटवर्क इंटरफ़ेस सहित हार्डवेयर के टुकड़ों के सेट के रूप में कंप्यूटर को माना जा सकता है। एक सामान्य पैटर्न एक मैक पते और एक प्रबंधन प्रणाली द्वारा जेनरेट आईडी का संयोजन हो सकता है जो नेटवर्क पर कंप्यूटर प्रबंधित करता है।
मैक पता प्रबंधन प्रणाली को पंजीकरण प्रक्रिया के दौरान विशिष्ट रूप से मशीन की पहचान करने के लिए।
पंजीकरण के परिणामस्वरूप, प्रबंधन प्रणाली उस जेनरेट किए गए अनन्य आईडी,
को पंजीकृत कंप्यूटर पर संग्रहीत करने के लिए वापस कर सकती है, और बाद में इसका उपयोग किया जाएगा।
सफल पंजीकरण के बाद, आप नेटवर्क इंटरफेस कार्ड को प्रतिस्थापित कर सकते हैं, क्योंकि कंप्यूटर पहचानने के लिए मैक पते पर निर्भर नहीं है।
तुम भी linux dmidecode उपयोगिता
उपयोग करने पर विचार कर सकते हैं (यदि मशीन आप चाहते हैं (linux मशीनों के लिए,
के रूप में आप एक जीत के आधार पर समाधान प्रदान,
तो हमारे linux पाठकों के लिए,
मैं एक linux alternaties सुझाव देना चाहते हैं) विशिष्ट रूप से पहचानने के लिए लिनक्स और dmidecoe स्थापित है)।
dmidecoe का उपयोग करके आप अधिक हार्डवेयर प्रोफ़ाइल प्राप्त कर सकते हैं, और उस पर कुछ हैश फ़ंक्शन निष्पादित कर सकते हैं, और एक अद्वितीय आईडी उत्पन्न कर सकते हैं जो आपकी मशीन को विशिष्ट रूप से (उच्च संभावना के साथ, सटीक होने के साथ) पहचान लेगा।
dmidecode here के बारे में और पढ़ें।
बेशक, यदि आप "ऑपरेटिंग सिस्टम से हार्डवेयर पर जानकारी प्राप्त करते हैं" दृष्टिकोण (जो डीएमआईडीकोड है या मैक पते प्राप्त करने के बाद आपने जो सुझाव दिया है,
आपको यह देखने के लिए एक क्रॉस प्लेटफ़ॉर्म कोड की आवश्यकता है ओएस जावा कार्यक्रम पर चलता है, तो आप यह है कि इस का उपयोग कर कार्य करें:

System.getProperty("os.name"); 
+0

केंद्रीय प्रबंधन प्रणाली रखने की अवधारणा जो अद्वितीय आईडी प्रदान करती है और क्लाइंट मशीन पर उस आईडी को संग्रहीत करती है वह ठोस है। हालांकि, पोस्टर ने अपने उपयोग के मामले को पर्याप्त विस्तार से समझाया नहीं है यह निर्धारित करने के लिए कि क्या वह समाधान उसके मामले में लागू होता है। मुझे नहीं लगता कि आप इस परिदृश्य में क्लाइंट मशीन के मैक पते या अन्य हार्डवेयर गुणों का उपयोग क्यों करेंगे। –

1

हर किसी के इनपुट को देखने के बाद, और काफी कुछ गूगल खोज मैं इस निष्कर्ष

पर आए हैं तकनीकीता में , जैसा कि आपने एक घटक हटा दिया है और इसे प्रतिस्थापित किया है, यह एक पूरी तरह से नया कंप्यूटर होगा, एक वास्तविक कंप्यूटर विशिष्ट आईडी उत्पन्न करने के लिए आपको सिस्टम में प्रत्येक घटक से एक विशिष्ट चर प्राप्त करना होगा, (यानी। सीरियल नंबर), उन सभी को गठबंधन करें, और यह एक "कंप्यूटर विशिष्ट आईडी" होगा। हालांकि, चूंकि एक कंप्यूटर बदलने के लिए इतना संवेदनशील है, सबसे निकटतम व्यक्ति को घटक को बदलने के लिए सबसे कम समय लेना होगा, और कंप्यूटर आईडी के लिए हम इसे एक विशिष्ट चर से लेना चाहते हैं। यह आमतौर पर मदरबोर्ड या एक अन्य घटक होगा जो बदलने की संभावना नहीं है। तो, सबसे नज़दीकी व्यक्ति मदरबोर्ड का सीरियल नंबर (या कुछ अन्य बच्चा घटक) प्राप्त कर सकता है .. मेरी व्यक्तिगत राय में।

मदरबोर्ड कम से कम बदलने की संभावना क्यों है?

ऐसा लगता है कि मदरबोर्ड आखिरी हिस्सा है जो लोग बदलते हैं, खासकर नए कंप्यूटर पर। वे इसे सामान्य रूप से तब तक नहीं बदलेंगे जब तक कि यह पूरी तरह से आवश्यक न हो। एक और व्यवहार्य विकल्प एनआईसी होगा। यह ईमानदारी से आप पर निर्भर करता है कि आप किस हार्डवेयर का उपयोग करते हैं, लेकिन उपयोग करने के लिए सबसे अच्छा वह होगा जो आपको लगता है कि बदलने की संभावना कम होगी।

1

डिस्क/खंड के लिए यह हो सकता है:

/** 
    * Execute system console command 'vol' and retrieve volume serial number 
    * 
    * @param driveLetter - drive letter in convetion 'X:' 
    * @return - Volume Serial Number, typically: 'XXXX-XXXX' 
    * @throws IOException 
    * @throws InterruptedException 
    */ 
    static final String getVolumeSerial(String driveLetter) throws IOException, InterruptedException { 
     Process process = Runtime.getRuntime().exec("cmd /C vol " + driveLetter); 
     InputStream inputStream = process.getInputStream(); 
     InputStream errorStream = process.getErrorStream(); 
     if (process.waitFor() != 0) { 
      Scanner sce = new Scanner(errorStream); 
      throw new RuntimeException(sce.findWithinHorizon(".*", 0)); 
     } 
     Scanner scn = new Scanner(inputStream); 
     // looking for: ': XXXX-XXXX' using regex 
     String res = scn.findWithinHorizon(": \\w+-\\w+", 0); 
     return res.substring(2).toUpperCase().trim(); 
    } 
+0

हैलो, क्षमा करें अगर यह सवाल बेवकूफ़ लगता है, लेकिन यह जवाब केवल विंडोज़ के लिए है, सही? – SpencerD

+0

हां, दुर्भाग्य से केवल खिड़कियां। – user3158918

संबंधित मुद्दे