2012-09-21 4 views
7

Ich arbeite an einer in C# geschriebenen Metro-App und benötige eine Möglichkeit, ein Gerät eindeutig zu identifizieren. Ich habe die ASHWID in der Dokumentation gefunden, die gut aussieht. Der vorgeschlagene Code lautet wie folgt:Wie erhalte ich in C# eine eindeutige Kennung für einen Computer, auf dem Windows 8 ausgeführt wird?

Das Problem ist, wie mache ich diesen IBuffer in eine Zeichenfolge, die ich verwenden kann?

+1

Quote der folgenden als Erweiterung der obigen Antwort tun können: 'Aber die ASHWID ändert sich, wenn das Hardwareprofil des Geräts ändert, beispielsweise wenn der Benutzer eine unplugs USB Bluetooth Adapter'. http://msdn.microsoft.com/en-us/library/windows/apps/jj553431.aspx –

+0

Ich habe das bemerkt, aber es scheint über die beste Option in Windows 8 zu sein. Für unsere Anwendungen wird es sogar ausreichen wenn es nicht ganz so gut ist, wie wir es gewohnt sind! :) – StarlitSkies

Antwort

12

Nach viel Jagd durch Vorschläge, die eigentlich in JS oder C++ waren, fand ich endlich eine Antwort!

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); 
} 

Dank diesen Blog gehen - http://bartwullems.blogspot.co.uk/2012/09/windows-8-uniquely-identifying-device.html

+6

Beachten Sie, dass diese ID ** nicht ** konstant ist! Wenn Sie den Flugzeugmodus aktivieren, erhalten Sie eine andere ID. –

+0

@ThomasLevesque Ich glaube, du hast Recht mit der ID-Verschiebung, wenn Änderungen an der Hardware vorgenommen werden, aber ich habe es gerade versucht (UWP in Win10) und bekomme den gleichen Wert mit dem Flugzeugmodus ein- oder ausgeschaltet & wenn ich eine Maus ausstoße, so ist es scheint nicht ganz so sensibel zu sein, wie Sie hier behaupten, zumindest auf dieser Plattform. – ruffin

+0

@ruffin, ich habe festgestellt, dass in WinRT, könnte es in UWP ändern –

4

Dies sollte auch funktionieren, aber ich habe nicht Windows 8 mit ...

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

zu testen, und wenn man es so nennen mehr als einmal, können Sie es in einem 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; 
} 

Oder nur mak Stick e es statisch, wenn Sie es wissen, wird immer aufgerufen werden:

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

Leider funktioniert "Windows.System.Profile.HardwareIdentification.GetPackageSpecificToken (null) .Id.ToArray()" nicht - Es gibt keine "ToArray()" -Methode auf dem IBuffer in Windows 8. – StarlitSkies

+0

I zu unterscheiden ... http://msdn.microsoft.com/en-us/library/hh582182.aspx –

+0

Nun, wenn ich Ihren ersten Vorschlag in mein Projekt kopieren/kopieren, bekomme ich diesen Fehler: 'Windows.Storage.Streams.Biuffer' enthält keine Definition für 'ToArray' und keine Erweiterungsmethode 'ToArray' eine erste zu akzeptieren Argument des Typs 'Windows.Storage.Streams.BIBuffer' konnte gefunden werden. – StarlitSkies

3

Sie HardwareIdentification.GetPackageSpecificToken(null) verwenden können, finden http://msdn.microsoft.com/en-us/library/windows/apps/jj553431.aspx

Diese Funktion gibt Ihnen eine Menge Informationen, die Sie filtern können, wie Sie möchten. Zum Beispiel:

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)); 
} 

jedoch bedenken, dass diese Funktion, und die zugrunde liegende API, nicht absolute Einzigartigkeit über alle Maschinen mit dem Internet verbunden garantieren. Sie würden dies normalerweise mit Informationen über den Benutzer kombinieren.

Eine weitere Option ist das Generieren und Speichern einer GUID in einem lokalen (nicht-servergespeicherten) Speicher, und verwenden Sie diese als Ihre Rechner-ID. Abhängig von Ihren genauen Bedürfnissen kann dies eine bessere Lösung sein.

0

Für eine guid id Sie

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

Das klingt nach einer schlechten Idee. Was ich meinte, war folgendes: Suche nach einer Datei im lokalen Speicher. Wenn (und nur wenn) es nicht da ist, erstelle es und lege dort ein neues Guid ein, das mit Guid.NewGuid() erstellt wurde. Verwenden Sie diese Guid als Ihre Maschinen-ID. Nimm es beim nächsten Lauf aus der Datei. Siehe https://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx –

Verwandte Themen