एक अद्वितीय मशीन आईडी बनाना


104

मुझे एक फ़ंक्शन लिखने की ज़रूरत है जो एक आईडी उत्पन्न करता है जो विंडोज ओएस चलाने वाले किसी दिए गए मशीन के लिए अद्वितीय है।

वर्तमान में, मैं विभिन्न हार्डवेयर मापदंडों को क्वेरी करने के लिए WMI का उपयोग कर रहा हूं और उन्हें एक साथ मिलाता हूं और अद्वितीय आईडी प्राप्त करने के लिए उन्हें हैश करता हूं। मेरा प्रश्न यह है कि मुझे सुझाए गए मापदंडों का क्या उपयोग करना चाहिए? वर्तमान में, मैं अद्वितीय आईडी जनरेट करने के लिए bios \ cpu \ disk डेटा के संयोजन का उपयोग कर रहा हूं। और प्रत्येक मैट्रिक के लिए कई परिणाम होने पर पहले परिणाम का उपयोग कर रहे हैं।

हालाँकि, मैं एक ऐसे मुद्दे पर भाग गया जहाँ एक मशीन जो कि दो अलग-अलग विंडोज़ ओएस में डुअल बूट करती है, प्रत्येक ओएस पर अलग-अलग साइट कोड बनाती है, जो आदर्श रूप से नहीं होना चाहिए।

संदर्भ के लिए, मैं वर्तमान में उपयोग कर रहे मैट्रिक्स हैं:

Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name

जवाबों:


25

SMBIOS को पार्स करें और इसे एक मनमानी लंबाई के लिए है। उपलब्ध सभी SMBIOS संरचनाओं के लिए पीडीएफ विनिर्देश देखें ।

Windows से SMBIOS जानकारी का उपयोग करने के लिए EnumSystemFirmwareEntries, EnumSystemFirmwareTablesऔर GetSystemFirmwareTable

IIRC, सीपीयू अनुदेश से "यूनिक आईडी" पी 3 और नए से हटा दिया गया है।


14
ध्यान दें कि इन कार्यों के लिए कम से कम Windows Vista, Windows XP Professional x64 संस्करण, Windows Server 2008 या SP1 के साथ Windows Server 2003 की आवश्यकता होती है।
जकॉफलैंड

33
मैंने जो किया, वह करने के लिए एक नोट, जिसे GetSystemFirmwareTable ('RSMB' ...) को कॉल करना था; और संपूर्ण SMBIOSTableData बफ़र है। जब तक मैं एक कार्य केंद्र में नहीं चला गया, जब तक उस टेबल पर अपना सीपीयू आंतरिक तापमान लिखा था, जिसका अर्थ है कि मेरी अनोखी आईडी हर कुछ सेकंड में बदल गई।
थॉमस

क्या इस समाधान के लिए कोई स्रोत कोड उपलब्ध है?
जस्ट

@ थोमस तो आपने आखिर किस उपाय को चुना?
स्मिथ

@ मेरे लक्ष्य में एक छोटा सा 8 अक्षर आईडी था। युक्ति को पढ़ते हुए, मैंने निर्णय लिया कि कौन से क्षेत्र अलग-अलग हो सकते हैं और उन्हें बाहर रखा जा सकता है। फिर कई वर्षों में मैंने और अधिक क्षेत्रों की छंटनी की जो मशीनों से स्थिर नहीं हैं। अंत में, मैंने इनपुट के रूप में उपयोग किए जाने वाले कच्चे डेटा की एक एन्क्रिप्टेड प्रतिलिपि को संग्रहीत किया और एक closeEnoughफ़ंक्शन बनाया ताकि मैं गैर-मिलान आईडी को स्वीकार कर सकूं अगर यह केवल 2 क्षेत्रों में भिन्न हो। मैं अपने हैश में प्रोसेसर और सिस्टम हार्डड्राइव के बारे में विवरण भी शामिल करता हूं क्योंकि जल्दी ही मेरे पास समान सिस्टम के बीच टकराव थे।
थॉमस

72

मुझे भी यही समस्या थी और थोड़ी खोजबीन के बाद मैंने तय किया कि सबसे अच्छा MachineGuidरजिस्ट्री कुंजी में पढ़ना होगा HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, जैसा कि @Agnus ने सुझाव दिया था। यह OS स्थापना के दौरान उत्पन्न होता है और जब तक आप एक और ताज़ा OS स्थापित नहीं करते तब तक यह नहीं बदलेगा। ओएस संस्करण के आधार पर इसमें नेटवर्क एडेप्टर मैक एड्रेस एम्बेडेड हो सकता है (प्लस यादृच्छिक सहित कुछ अन्य नंबर), या एक छद्म आयामी संख्या, बाद में नए ओएस संस्करणों के लिए (XP SP2 के बाद, मुझे विश्वास है, लेकिन निश्चित नहीं है)। यदि यह सैद्धांतिक रूप से एक छद्म आयामी है तो इसे जाली बनाया जा सकता है - यदि दो मशीनों में एक ही प्रारंभिक अवस्था होती है, जिसमें वास्तविक समय घड़ी भी शामिल है। व्यवहार में, यह दुर्लभ होगा, लेकिन जागरूक रहें यदि आप इसे सुरक्षा के लिए एक आधार होने की उम्मीद करते हैं जो कट्टर हैकर्स द्वारा हमला किया जा सकता है।

बेशक एक GUID बनाने के लिए किसी के द्वारा भी रजिस्ट्री प्रविष्टि को आसानी से बदला जा सकता है, लेकिन मुझे जो मिला वह यह है कि यह विंडोज के इतने सारे घटकों के सामान्य संचालन को बाधित करेगा कि ज्यादातर मामलों में कोई भी नियमित उपयोगकर्ता ऐसा नहीं करेगा (फिर से, बाहर देखें) कट्टर हैकर्स के लिए)।


6
मुझे लगता है कि आपको हमेशा रजिस्ट्री कुंजी का "वास्तविक" संस्करण मिलता है, यह सुनिश्चित करने के लिए आप KEY_WOW64_64KEY ध्वज का उपयोग कर सकते हैं।
कोलन

13
यदि आप एक ड्राइव छवि को क्लोन करते हैं तो यह वही रहेगा। तो यह बिल्कुल नहीं है और बहुत असुरक्षित है।
बिटकॉइन

19
बिंदु को स्पष्ट करने के लिए, जब मैं सॉफ्टवेयर में DRM उपाय डालता हूं, तो मेरा मुख्य लक्ष्य लोगों को एक दरार बनाने से रोकना है जो बिना किसी सीमा के सॉफ़्टवेयर की अवैध प्रतियां बेचने के लिए 'पेशेवर' समुद्री डाकू को सक्षम बनाता है। मैं एक सामयिक हैकर के बारे में चिंतित नहीं हूं जो अपने दोस्त की ड्राइव को क्लोन करता है ताकि वह मेरे सॉफ़्टवेयर का उपयोग कर सके। ऐसे मामलों में उन लोगों के पास आमतौर पर पैसे से अधिक समय होता है, और वे इसके लिए भुगतान नहीं करेंगे। यदि सॉफ़्टवेयर की कीमत $ 100 है और आपका वेतन $ 50 / h से अधिक है, तो आप इसके लिए भुगतान करते हैं। परेशानी 2h से अधिक आपका समय लेगी।
फाबियो सेकोनेलो

7
विशेष रूप से, ऐसे वातावरण में जहां मास्टर मशीन की छवि को क्लोन करके विंडोज स्थापित किया जाता है, मशीनग्यूइड उन सभी के लिए समान होगा।
nandhp

8
ऐसा नहीं है अगर आप सही और कानूनी तौर पर, sysprep और सभी का उपयोग कर रहे हैं। उन लोगों के लिए जिनके पास खिड़कियों और "बस क्लोन" की पायरेटेड प्रतियां हैं, यह एक और मामला है। लेकिन वे आसानी से, वैसे भी नहीं रोका जाएगा।
Fabio Ceconello

34

हमारे लाइसेंसिंग टूल के साथ हम निम्नलिखित घटकों पर विचार करते हैं

  • मैक पते
  • CPU (सीरियल नंबर नहीं, लेकिन वास्तविक सीपीयू प्रोफाइल जैसे स्टेपिंग और मॉडल)
  • सिस्टम ड्राइव सीरियल नंबर (वॉल्यूम लेबल नहीं)
  • स्मृति
  • CD-ROM मॉडल और विक्रेता
  • वीडियो कार्ड मॉडल और विक्रेता
  • आईडीई नियंत्रक
  • SCSI नियंत्रक

हालांकि, केवल घटकों को हैशिंग और पास / फेल सिस्टम बनाने के बजाय, हम एक तुलनीय फिंगरप्रिंट बनाते हैं जिसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि दो मशीन प्रोफाइल कितने अलग हैं। यदि अंतर रेटिंग एक निर्दिष्ट सहिष्णुता से ऊपर है, तो उपयोगकर्ता को फिर से सक्रिय करने के लिए कहें।

हमने पिछले 8 वर्षों में सैकड़ों-हज़ार अंतिम-उपयोगकर्ता इंस्टॉल के साथ उपयोग किया है कि यह संयोजन वर्चुअल मशीन और क्लोन किए गए ओएस इंस्टॉल के लिए भी एक मज़बूती से अद्वितीय मशीन आईडी प्रदान करने के लिए अच्छी तरह से काम करता है।


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

हम सभी भौतिक एनआईसी का उपयोग करते हैं - आभासी एनआईसीएस, ब्लू-टूथ आदि को छोड़कर, वे सभी संयुक्त हैश बनाने के लिए हैं।
पॉल अलेक्जेंडर

आप सीपीयू सीरियल नंबर का उपयोग न करने की सलाह क्यों देते हैं?
Mojtaba Rezaeian

3
सीपीयू सीरियल नंबर को सालों तक इंटेल चिप में सक्षम नहीं किया गया है। सिस्टम कॉल अभी भी मौजूद है, लेकिन यह एक स्थिर मूल्य नहीं लौटाता है। मुझे याद नहीं है कि यह क्या लौटाता है - या तो डमी डेटा या सभी मशीनों के लिए समान मूल्य। किसी भी तरह से यह एक विश्वसनीय हार्डवेयर मीट्रिक नहीं है।
पॉल अलेक्जेंडर

1
@PaulAlexander आपके द्वारा उल्लिखित सभी मापदंडों को मान्य करने के लिए जिस टूल को संदर्भित करता है या उनमें से कुछ काम करेंगे? क्योंकि अब सिस्टम में एक दिन में आमतौर पर एक CD-ROM नहीं होता है
FaizanHussainRabbani

3

प्रोसेसर के यूनिकआईडी का उपयोग करने के बारे में क्या?


14
क्या इन दिनों एक मूल्यह्रास संपत्ति नहीं है?
जेक विल्सन

15
शायद उसका मतलब है 'पदावनत' ... सीपीयू निर्माताओं ने एक चरण में अद्वितीय आईडी डालना शुरू कर दिया था, लेकिन गोपनीयता के मामलों पर प्रतिक्रिया के कारण, वे फिर से बंद हो गए। तो आप पाएंगे कि कुछ के पास एक विशिष्ट आईडी है लेकिन अधिकांश आधुनिक सीपीयू नहीं हैं।
ट्रिपलएन्जेन

1
संदर्भ के लिए, केवल पेंटियम III के एक संक्षिप्त बैच में सीपीयू सीरियल नंबर थे जिन्हें पढ़ा जा सकता था। जबकि बाद के संस्करणों में एक सीरियल नंबर था जो डिफ़ॉल्ट रूप से अक्षम था। पेंटियम IV और बाद में सीपीयू ने इसका बिल्कुल समर्थन नहीं किया।
पॉल अलेक्जेंडर

2

मुझे उस लड़के से नफरत है जो कहता है, "तुम बस गलत कर रहे हो" (मैं हमेशा उस आदमी से नफरत करता हूं;) लेकिन ...

क्या इसे अद्वितीय मशीन के लिए बार-बार उत्पन्न किया जाना है? क्या आप सिर्फ पहचानकर्ता को सौंप सकते हैं या एक सार्वजनिक / निजी कुंजी कर सकते हैं? हो सकता है कि यदि आप मूल्य को उत्पन्न और संग्रहीत कर सकते हैं, तो आप इसे एक ही डिस्क पर दोनों ओएस इंस्टॉल से एक्सेस कर सकते हैं?

आपने शायद इन विकल्पों की खोज की है और वे आपके लिए काम नहीं करते हैं, लेकिन यदि नहीं, तो यह विचार करने के लिए कुछ है।

यदि यह उपयोगकर्ता के भरोसे की बात नहीं है, तो आप सिर्फ मैक पते का उपयोग कर सकते हैं।


5
यदि मशीन में नेटवर्क कार्ड नहीं है तो मैक पते काम नहीं करेंगे।
ब्रायन

7
@ ब्रायन - क्या आपको वास्तव में एक ऐसे कंप्यूटर की पहचान करने के लिए एक अद्वितीय मूल्य की आवश्यकता है जिसमें नेटवर्क कार्ड नहीं है? लगता है एक बहुत सुरक्षित शर्त मशीन में एक कार्ड है।
२२:०२

1

आपको नेटवर्क कार्ड पर मैक पते का उपयोग करना चाहिए (यदि यह मौजूद है)। वे आमतौर पर अद्वितीय होते हैं लेकिन गढ़े जा सकते हैं। मैंने सॉफ़्टवेयर का उपयोग किया है जो आपके नेटवर्क एडेप्टर मैक पते के आधार पर अपनी लाइसेंस फ़ाइल उत्पन्न करता है, इसलिए इसे कंप्यूटरों के बीच अंतर करने का एक काफी विश्वसनीय तरीका माना जाता है।


6
नहीं, वे नहीं हैं। बहुत सारे निर्माता आपको उन्हें बदलने की अनुमति देते हैं। क्लस्टर्स के साथ काम करते समय यह बहुत सहायक है क्योंकि कुछ विक्रेता आपको एक ही मैक पते के साथ सभी कंप्यूटर देते हैं (हम कुछ साल पहले इस मुद्दे में भाग गए थे)।
gizmo

यह कई मामलों में मान्य विचार है, सवाल करता है। स्पूफ-प्रॉड्यूस या ऑफलाइन निर्दिष्ट न करें - यदि आप नेटवर्क में पहचान करना चाहते हैं, तो आप सामान्य आईडी चाहते हैं
हुर्दा

एक ही मशीन में कई नेटवर्क डिवाइस होना संभव है; आपको गारंटी नहीं है कि उन्हें हमेशा एक ही क्रम में पता लगाया जाएगा या उन्हें किसी बिंदु पर प्रतिस्थापित नहीं किया जाएगा। कुछ हार्डवेयर का उपयोग करना बेहतर है जो अधिक स्थायी होने की संभावना है।
आगी हैमरथिफ़

1

मेरे किसी एप्लिकेशन के लिए, मैं या तो कंप्यूटर के नाम का उपयोग करता हूं, यदि यह गैर-डोमेन कंप्यूटर है, या डोमेन कंप्यूटर के लिए डोमेन मशीन खाता SID है। मार्क रोसिनोविच इस बारे में इस ब्लॉग पोस्ट में बात करते हैं, मशीन सिड :

अंतिम मामला जहां एसआईडी दोहराव एक मुद्दा होगा अगर एक वितरित आवेदन मशीन SID का उपयोग विशिष्ट रूप से कंप्यूटर की पहचान करने के लिए करता है। कोई Microsoft सॉफ़्टवेयर ऐसा नहीं करता है और मशीन SID का इस तरह से उपयोग करना इस तथ्य के लिए काम नहीं करता है कि सभी DC में एक ही मशीन SID है। सॉफ़्टवेयर जो अद्वितीय कंप्यूटर पहचान पर निर्भर करता है, या तो कंप्यूटर नाम या कंप्यूटर डोमेन SID (डोमेन में कंप्यूटर खातों का SID) का उपयोग करता है।

आप LDAP के माध्यम से डोमेन मशीन खाते SID तक पहुँच सकते हैं या System.DirectoryServices


1

अपने प्रोग्राम में मैं पहले टर्मिनल सर्वर के लिए जाँच करता हूँ और WTSClientHardwareId का उपयोग करता हूँ। स्थानीय पीसी का मैक पता पर्याप्त होना चाहिए।

क्या तुम सच में संपत्तियों की सूची का उपयोग करना चाहते हैं तो आप बाहर तरह बातें छुट्टी प्रदान की Nameऔर DriverVersion, Clockspeedआदि यह संभवतः ओएस निर्भर है, क्योंकि। दोनों ऑपरेटिंग सिस्टम पर समान जानकारी को आउटपुट करने की कोशिश करें और जो अलग-अलग है उसे छोड़ दें।


1

हार्डवेयर विशिष्ट सूचना प्राप्त करने के लिए एक पुस्तकालय उपलब्ध है: हार्डवेयर सीरियल नंबर एक्सट्रैक्टर (CPU, RAM, HDD, BIOS)


2
यह एक बंद स्रोत वाणिज्यिक पुस्तकालय है।
गाब

@ गैब-सोर्स कोड उपलब्ध है। और DLL (29) की कीमत अन्य पुस्तकालयों के साथ तुलना में कुछ भी नहीं है जो $ 2000 के करीब हैं। तो, हाँ, यह काम करता है।
InNameOfScience

0

अपने नेटवर्क कार्ड के मैक पते का उपयोग क्यों न करें?


14
मैक पते को खराब किया जा सकता है
हेनरी बी

यह कई मामलों में मान्य विचार है, प्रश्न करता है। स्पूफ-प्रॉड्यूस या ऑफलाइन निर्दिष्ट न करें - यदि आप नेटवर्क में पहचान करना चाहते हैं, तो आप सामान्य आईडी चाहते हैं
हुर्दा

0

हो सकता है कि थोड़ा धोखा दे, लेकिन एक मशीन ईथरनेट एडेप्टर का मैक एड्रेस शायद ही इन दिनों मदरबोर्ड को बदले बिना बदलता है।


बहुत सारे निर्माता आपको उन्हें बदलने की अनुमति देते हैं। क्लस्टर्स के साथ काम करते समय यह बहुत सहायक है क्योंकि कुछ विक्रेता आपको एक ही मैक पते के साथ सभी कंप्यूटर देते हैं (हम कुछ साल पहले इस मुद्दे में भाग गए थे)।
gizmo

1
मैक पूरी तरह से अविश्वसनीय है क्योंकि इसे इतनी आसानी से बदला जा सकता है (बस एक Google खोज में और आपको बहुत सारे मुफ्त टूल दिखाई देंगे जो यह कर रहे हैं)। WMI के लिए भी ऐसा ही है।
InNameOfScience

0

क्या आप किसी प्रकार के निर्माता क्रमांक या सेवा टैग को खींच सकते हैं?

हमारी दुकान एक डेल की दुकान है, इसलिए हम सेवा टैग का उपयोग करते हैं जो उन्हें पहचानने के लिए प्रत्येक मशीन के लिए अद्वितीय है। मुझे पता है कि इसे BIOS से कम से कम लिनक्स में क्वेर किया जा सकता है, लेकिन मैं यह नहीं जानता कि इसे विंडोज में कैसे किया जाए।


0

मेरे पास एक अतिरिक्त बाधा थी, मैं .net एक्सप्रेस का उपयोग कर रहा था ताकि मैं मानक हार्डवेयर क्वेरी तंत्र का उपयोग न कर सकूं। इसलिए मैंने क्वेरी करने के लिए पावर शेल का उपयोग करने का निर्णय लिया। पूर्ण कोड इस तरह दिखता है:

Private Function GetUUID() As String
    Dim GetDiskUUID As String = "get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String = ""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function

-1

एक विकल्प के लिए सीपीयूआईडी देखें। मल्टी-सीपीयू सिस्टम के साथ कुछ समस्याएं हो सकती हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.