2012-09-21 9 views
7

मैं सी # में लिखे गए मेट्रो ऐप पर काम कर रहा हूं और किसी डिवाइस को विशिष्ट रूप से पहचानने के लिए एक तरीका चाहिए। मुझे दस्तावेज में ASHWID मिला जो बहुत अच्छा लग रहा है। सुझाए गए कोड इस प्रकार है:मैं सी # में विंडोज 8 चलाने वाली मशीन के लिए एक अद्वितीय पहचानकर्ता कैसे प्राप्त करूं?

HardwareToken token = HardwareIdentification.GetPackageSpecificToken(null); 
IBuffer hardwareId = token.Id; 
IBuffer signature = token.Signature; 
IBuffer certificate = token.Certificate; 

समस्या यह है कि मैं उस आईबीफ़र को एक स्ट्रिंग में कैसे बदलूं जिसका उपयोग मैं कर सकता हूं?

+1

उद्धरण: 'हालांकि, ASHWID परिवर्तन करता है, तो इस तरह के जब उपयोगकर्ता एक unplugs के रूप में डिवाइस परिवर्तन, के हार्डवेयर प्रोफ़ाइल यूएसबी ब्लूटूथ एडाप्टर'। http://msdn.microsoft.com/en-us/library/windows/apps/jj553431.aspx –

+0

मैंने नोटिस किया कि, लेकिन यह विंडोज 8 में उपलब्ध सर्वोत्तम विकल्प के बारे में प्रतीत होता है। हमारे उपयोगों के लिए यह भी पर्याप्त होगा अगर यह उतना अच्छा नहीं है जितना हम उपयोग करते हैं! :) – StarlitSkies

उत्तर

12

वास्तव में जेएस या सी ++ में सुझावों के माध्यम से बहुत सारे शिकार के बाद मुझे अंत में एक जवाब मिला!

private string GetHardwareId() 
{ 
    var token = HardwareIdentification.GetPackageSpecificToken(null); 
    var hardwareId = token.Id; 
    var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(hardwareId); 

    byte[] bytes = new byte[hardwareId.Length]; 
    dataReader.ReadBytes(bytes); 

    return BitConverter.ToString(bytes); 
} 

धन्यवाद इस ब्लॉग पर जाने - http://bartwullems.blogspot.co.uk/2012/09/windows-8-uniquely-identifying-device.html

+6

ध्यान दें कि यह आईडी ** ** स्थिर नहीं है! यदि आप हवाई जहाज मोड चालू करते हैं, तो आपको एक अलग आईडी मिलती है। –

+0

@ थॉमस लेवेस्क्यू मेरा मानना ​​है कि हार्डवेयर में बदलाव किए जाने पर आप आईडी स्थानांतरण के बारे में सही हैं, लेकिन मैंने अभी कोशिश की है (Win10 में UWP) और एयरप्लेन मोड के साथ उसी मूल्य को चालू या बंद कर रहा हूं और जब मैं माउस को अनप्लग करता हूं, तो यह कम से कम इस मंच पर, जैसा कि आप यहां दावा करते हैं उतना संवेदनशील नहीं लगता है। – ruffin

+0

@ruffin, मैंने देखा कि WinRT में, यह UWP –

4

यह रूप में अच्छी तरह से काम करना चाहिए, लेकिन मैं नहीं है Windows 8 के साथ परीक्षण करने के लिए ...

private string GetHardwareId() 
{ 
    return BitConverter.ToString(Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray()); 
} 

और अगर आप इसे कहते एक बार से अधिक है, तो आप एक Lazy<T>

private static Lazy<string> _hardwareId = new Lazy<string>(() => BitConverter.ToString(Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray()), true); 

public string HardwareId() 
{ 
    return _hardwareId.Value; 
} 

या बस mak में यह रहना चाहते हो सकता है ई यह स्थिर यदि आप जानते हैं कि यह हमेशा कहा जाएगा:

public static readonly string HardwareId = BitConverter.ToString(Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray())); 
+0

अलास में, "विंडोज़ सिस्टम। प्राइफाइल। हार्डवेयर इडेंटिफिकेशन। गेटपेकेज स्पेसिफिक टोकन (शून्य) आईडी। टोएरे()" काम नहीं करता है - विंडोज 8 में आईबीफर पर कोई "ToArray()" विधि नहीं है। – StarlitSkies

+0

I अलग होना सीखें ... http://msdn.microsoft.com/en-us/library/hh582182।एएसपीएक्स –

+0

ठीक है, अगर मैं अपनी परियोजना में अपना पहला सुझाव कॉपी/पेस्ट करता हूं तो मुझे यह त्रुटि मिलती है: 'विंडोज़.स्टॉरेज.स्ट्रीम। आईबफर' में 'टोएरे' की परिभाषा नहीं है और कोई एक्सटेंशन विधि 'ToArray' पहले स्वीकार नहीं करती है 'Windows.Storage.Streams.IBuffer' प्रकार का तर्क पाया जा सकता है। – StarlitSkies

3

आप HardwareIdentification.GetPackageSpecificToken(null) उपयोग कर सकते हैं, को देखने के http://msdn.microsoft.com/en-us/library/windows/apps/jj553431.aspx

कि समारोह आप जानकारी का एक बहुत कुछ देता है, आप जितने चाहें फ़िल्टर कर सकते हैं कि। उदाहरण के लिए:

public static string GetMachineId() 
{ 
    var hardwareToken = 
     HardwareIdentification.GetPackageSpecificToken(null).Id.ToArray(); 
    var count = hardwareToken.Length/4; 
    ulong id = 0ul; 
    for (int i = 0; i < count; i++) 
    { 
     switch (BitConverter.ToUInt16(hardwareToken, i * 4)) 
     { 
      case 1: 
       // processor 
      case 2: 
       // memory 
      case 9: 
       // system BIOS 
       id = (id << 12)^BitConverter.ToUInt16(hardwareToken, i * 4 + 2); 
       break; 
     } 
    } 
    return Convert.ToBase64String(BitConverter.GetBytes(id)); 
} 

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

एक और विकल्प स्थानीय (गैर रोमिंग) भंडारण में एक GUID उत्पन्न और स्टोर करना है, और इसे अपनी मशीन आईडी के रूप में उपयोग करना है। आपको सटीक जरूरतों के आधार पर, यह एक बेहतर समाधान हो सकता है।

0

एक GUID आईडी आप ऊपर जवाब देने के लिए एक विस्तार के रूप निम्न कर सकते हैं के लिए

private Guid GetHardwareId() 
    { 
     var token = HardwareIdentification.GetPackageSpecificToken(null); 
     var hardwareId = token.Id; 
     var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(hardwareId); 

     byte[] bytes = new byte[hardwareId.Length]; 
     dataReader.ReadBytes(bytes); 

     byte[] deviceId = new byte[16]; 
     Array.Copy((byte[])bytes, deviceId, deviceId.Length); 

     return new Guid(deviceId); 
    } 
+0

यह एक बुरा विचार की तरह लगता है। मेरा मतलब था निम्नलिखित था: स्थानीय भंडारण में एक फ़ाइल की तलाश करें। अगर (और केवल अगर) यह वहां नहीं है, तो इसे बनाएं और Guid.NewGuid() का उपयोग करके बनाई गई एक नई ग्रिड रखें। उस मशीन को अपने मशीन पहचानकर्ता के रूप में प्रयोग करें। अगले भाग पर, इसे फ़ाइल से ले जाएं। Https://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx देखें –

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