Abrufen der Windows-Seriennummer (war: Abrufen von MachineGuid aus der Registrierung)

8

Ich versuche, MachineGuid aus der Registrierung zu holen, um eine gewisse Bindung mit dem Betriebssystem für mein Lizenzsystem zu erstellen. Aus der Dokumentation kann ich

verwenden %Vor%

um es zu bekommen. Außerdem sagen mir die Dokumente, dass ich "default" bekomme, wenn der Name nicht gefunden wird, oder null , wenn der Schlüssel nicht existiert. Ich sollte eine Sicherheitsausnahme erhalten, wenn ich keinen Zugriff habe.

Der obige Code gibt mir "default" , was bedeutet, dass der Name nicht gefunden wird. Wenn ich jedoch mit RegEdit in der Registrierung nachschaue, ist es da. Wie bekomme ich den Wert MachineGuid von einer Anwendung ohne Administratorrechte?

Update : Bei Verwendung von reg.exe habe ich keine Probleme, den Wert zu erhalten.

Update : Ich habe den Titel aktualisiert, damit auch Leute auf der Suche nach einer einzigartigen Möglichkeit zur Bestimmung der Windows-Installation sind.

    
Bart Friederichs 08.01.2013, 10:35
quelle

3 Antworten

15

Wie andere Leute bereits gesagt haben, sollten Sie diesen Wert nicht direkt aus der Registry bekommen (wahrscheinlich funktioniert er deshalb unter verschiedenen Windows-Versionen nicht zuverlässig).

Eine kleine Suche führte mich zum Win32_OperatingSystem WMI-Klasse . Mit dieser Klasse können Sie tatsächlich die Windows-Seriennummer abrufen. Ich brauchte ein wenig Suchen und Experimentieren, um es richtig zu machen, aber so kann es in C # verwendet werden.

Stellen Sie sicher, dass Sie die System.Management.dll Referenz in Ihrem Projekt haben:

%Vor%

Mit dem Operator [] können Sie eine beliebige Eigenschaft in der Klasse abrufen.

    
Bart Friederichs 08.01.2013, 11:30
quelle
15
  

weshalb es unter verschiedenen Windows-Versionen wahrscheinlich nicht zuverlässig funktioniert

Nein, das ist nicht der Grund. Dieses Problem wird durch die Auswahl des Plattformziels für Ihr EXE-Projekt verursacht. Projekt + Eigenschaften, Registerkarte Erstellen, Plattform-Ziel-Combobox. Sie haben es auf x86 anstelle von AnyCPU festgelegt. In VS2012 ist das Kontrollkästchen "32-Bit bevorzugen" wichtig. Diese Einstellung zwingt Ihr Programm im 32-Bit-Modus auf einer 64-Bit-Version von Windows ausgeführt. Was eine Reihe von Nebenwirkungen hat, ist die, dass der Zugriff auf Registrierungsschlüssel umgeleitet wird. Ihr Programm liest tatsächlich den Wert von HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Cryptography \ MachineGuid. Was nicht existiert.

Die x86-Auswahl ist die Standardeinstellung für VS2010 und höher, zuvor war AnyCPU die Standardeinstellung. Microsoft bevorzugt x86, Visual Studio arbeitet besser mit 32-Bit-Modus-Prozessen. Insbesondere beim Debugging ist VS selbst ein 32-Bit-Prozess, so dass der Remote-Debugger erforderlich ist, wenn das Programm im 64-Bit-Modus ausgeführt wird. Das hat einige Einschränkungen wie nicht unterstützte Debugging im gemischten Modus. Und die Edit + Continue-Funktion funktioniert nur für 32-Bit-Code. Ihr Programm selbst funktioniert jedoch "besser", wenn Sie die Einstellung bei AnyCPU haben, einschließlich der Tatsache, dass Sie nicht von den in Windows integrierten Dateisystem- und Registrierungsumleitungs-Appcompat-Funktionen gebissen werden.

Wenn Sie wirklich im x86-Modus stecken, weil Sie normalerweise von 32-Bit-Code abhängig sind, den Sie nicht aktualisieren können, verwenden Sie als Nächstes die .NET 4+ RegistryKey.OpenBaseKey () -Methode. Damit können Sie RegistryView.Registry64 übergeben und sicherstellen, dass Sie die nicht umgeleiteten Schlüssel lesen.

Sicher, die Verwendung von WMI ist eine Problemumgehung. Denken Sie daran, dass Sie nicht dieselben Informationen lesen, wenn Sie Win32_OperatingSystem.SerialNumber verwenden. Inwieweit dieser Schlüssel auf verschiedenen Rechnern zuverlässig zufällig ist, ist mir nicht klar, sagen wir einfach, dass dieser Wert ein ziemlich attraktives Ziel für die Art von Benutzern ist, die nicht sehr daran interessiert sind, die Lizenzgebühr für Ihr Produkt zu zahlen.

Bedenken Sie nicht zuletzt, dass es ziemlich einfach ist, eine eigene eindeutige ID zu generieren, die gar nicht von Windows abhängig ist. Mit dem großen Vorteil, dass Sie Ihren Kunden nicht verärgern, wenn er Windows auf seinem Rechner aktualisiert. Verwenden Sie Guid.NewGuid () einmal und speichern Sie den Wert in einer Datei. Das geht verloren, wenn das Laufwerk schlecht wird, aber das nimmt normalerweise auch dein Produkt weg.

    
Hans Passant 08.01.2013 13:45
quelle
6

Ich meine bescheidene Meinung keine der Antworten erfüllt die Frage; ist ziemlich direkt nach einer Möglichkeit fragen, um die MachineGuid aus der Registrierung zu lesen ... also hier ist meine Antwort: Sie müssen einen Verweis auf "Microsoft.Win32" hinzufügen. Dieser Code wurde zu Demonstrationszwecken geschrieben und sollte entsprechend angepasst werden. BEARBEITEN: Jemand hat falsch angegeben, dass der x64-Code nutzlos ist. Im 64-Bit-Betriebssystem wird der Correcty-Schlüssel gefunden. Diese Antwort ist also die einzige, die die Frage erfüllt.

%Vor%

Hoffe, das hilft jemandem.

    
Darkonekt 01.12.2013 18:25
quelle