2009-08-20 9 views
6

Welche Art von 'eindeutigen' Systembezeichner können leicht mit C# (zum Hash und dann zur eindeutigen Identifizierung eines Systems) erhalten werden? Ich könnte nur HDD-Größe und solche Dinge hash, aber ich muss Computer identifizieren und unterscheiden, die alle von den gleichen Komponenten gebaut werden, so dass ich nicht gehen kann.Erhalten Sie eindeutige Systembezeichner in C#

Tipps, Ideen, Beispielcode schätzen!

+0

Ich wäre vorsichtig damit, dass Sie Ihre Kunden nicht hassen. Sie sollten in der Lage sein, Netzwerkkarten, Festplatten und Speichergröße zu ändern, ohne Ihnen davon zu erzählen. –

+4

Oh, diese Anforderung kommt tatsächlich * vom * Kunden :) – Alex

Antwort

8

Hier ist ein guter Anfang mit WMI ...

// Win32_CPU will work too 
var search = new ManagementObjectSearcher("SELECT * FROM Win32_baseboard"); 
var mobos = search.Get(); 

foreach (var m in mobos) 
{ 
    var serial = m["SerialNumber"]; // ProcessorID if you use Win32_CPU 
} 

Sie können das tun, mit vielen Stücken Hardware und erstelle eine Lösung.

+0

Ich habe das versucht ... aber ich sehe, dass diese Tage keine der seriellen Nos werden beibehalten. Hauptplatine, Prozessor ... MAC wird geändert, indem NIC geändert wird ... was soll ich wählen? – Rick2047

+0

Da das Win32_BaseBoard SerialNumber in den meisten Fällen keinen Wert mehr zurückgibt, ist Ihre beste Wette ProcessorID in Win32_Processor – CJxD

+0

Beachten Sie, dass ProcessorID für alle Prozessoren desselben Typs gleich ist. Wenn Sie zwei i7-FooBar-Prozessoren testen, haben beide dieselbe ID. – ANeves

2

Sie können WMI mit C# verwenden, um eine ganze Reihe von Informationen über die Hardware zu erhalten.

Festplatten-IDs und Ethernet-MAC-Adresse sind zwei häufig verwendete eindeutige Kennungen, die in Systemidentifikationsschemata verwendet werden. Die MAC-Adresse ist theoretisch pro Netzwerkkarte eindeutig.

+1

In der Theorie, aber in der Praxis gibt es keine einzige eindeutige ID, die verwendet werden könnte, da es Tonnen und leicht zugänglich sind, ist es am besten, zwei oder drei zu greifen kombinieren Sie sie, um eine eindeutige Zeichenfolge (oder Hash) zu erstellen –

+0

Ja, ich stimme zu. Das ist, warum die "in der Theorie" :) –

8

Sie können den System.Management Namespace verwenden, um alle Sachen im Zusammenhang mit der Hardware, ProcessorId, MAC-Adressen und viel mehr Informationen zu erhalten, die Sie dann zusammen Hash.

Werfen Sie einen Blick auf diesen Artikel:

http://www.codeproject.com/KB/system/GetHardwareInformation.aspx

+0

Um auf diese und andere Antworten ein wenig zu erweitern: Die MAC-Adresse der Netzwerkkarte (n) wird einzigartig sein, auch wenn die Maschinen alle die gleichen Komponenten verwenden. Ich würde damit anfangen. Zweitens, Sie sollten in der Lage sein, Motherboard und CPU-Seriennummern zu bekommen, wie JP sagte. Diese und die MAC-Adresse der physischen NICs sollten einfach genug sein, um eine Maschine eindeutig zu identifizieren. Beachten Sie jedoch, dass sich alle Teile ändern können, wenn Teile ausgetauscht werden. –

+0

Die MAC-Adresse einer Netzwerkkarte kann per Software festgelegt werden, Sie können also nicht davon ausgehen, dass sie eindeutig ist. Auf der anderen Seite denke ich, dass Main Disk + MAC-Adresse + Prozessor-ID + Motherboard eine sichere Wette sein könnte. –

2

Sie sprechen über Windows Vorausgesetzt, dann wird jeder Windows-Installation hat ein einzigartiges Produkt-ID (die Sie sehen können, wenn Sie die Eigenschaften von Arbeitsplatz sehen) . Ich denke, das ist in HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion:ProductId(REG_SZ) gespeichert. Ich nehme an, du willst mehr als das?

+0

Das sieht kool aus. – Rick2047

0

Sie könnten in aussehen GUID's

+2

+1 Die Microsoft-Implementierung von GUIDs verwendet die MAC-Adresse und die aktuelle Zeit, so dass sie eine garantierte Möglichkeit zum Erstellen von Bezeichnern sind, die für jeden Computer eindeutig sind. –

2

Netzwerkkarte MAC-Adresse:

foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 
{ 
    // probably need to do some filtering on ni.NetworkInterfaceType here 
    Console.WriteLine(ni.GetPhysicalAddress()); 
} 
+1

während dies eine gute Idee ist, würde ich es scheitern, wenn das System nicht NIC hat! – Smith

+1

Dies ist keine gute Idee, da diese ID ändert, wenn der Benutzer eine Verbindung deaktiviert oder wenn eine Software eine virtuelle Verbindung installiert –