Erste Windows-Seriennummer (war: Erste MachineGuid aus der Registry)
Ich versuche zu Holen MachineGuid
von der Registrierung zu erstellen, die einige level der Bindung mit dem OS für meine Lizenz-system. Aus den Unterlagen, die ich verwenden können,
string key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography";
string r = (string)Registry.GetValue(key, "MachineGuid", (object)"default");
um es zu bekommen. Auch die docs sagen mir, dass ich "default"
wenn der name nicht gefunden, oder null
wenn der Schlüssel nicht existiert. Ich sollte eine security exception, wenn ich keinen Zugriff mehr habe.
Den obigen code gibt mir "default"
, was bedeutet, dass der name nicht gefunden. Allerdings, wenn ich in der registry mit RegEdit, ist es da. Wie bekomme ich die MachineGuid
Wert aus einer Anwendung ohne Administratorrechte?
Update: bei der Verwendung von reg.exe
ich habe keine Probleme damit, den Wert.
Update: ich aktualisierte den Titel, also Menschen auf der Suche nach einer einzigartigen Art und Weise der Ermittlung der Windows-Installation hier so gut.
- Es scheint ein Registry-Umleitung Thema: stackoverflow.com/questions/5262830/.... Als wenn die Registrierung ist nicht kaputt schon genug.
- Sind Sie mit einem 32-bit-Prozess auf einem 64-bit-Maschine?
- welches OS verwenden Sie? wenn Ihr andere version der OP könnte es durchaus einen guten Grund für diese arbeiten für Sie und nicht ihn
- Läuft Win7/32bit.
- welches OS verwenden Sie? war es das gleiche wie Clemens?
- Win7/64 bit Sp1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das ist nicht der Grund. Dieses problem wird verursacht von der Plattform, target-Auswahl für Ihr EXE-Projekt. Project + - Eigenschaften, Register Erstellen, Plattform Ziel combobox. Sie haben es auf x86 statt AnyCPU. Auf VS2012, die "Lieber 32-bit" checkbox Angelegenheiten. Diese Einstellung zwingt Ihr Programm für die Ausführung im 32-bit-Modus auf einem 64-bit-version von Windows. Das hat eine Reihe von Nebenwirkungen, die ein, dass die Dinge hier ist, dass der Zugriff auf registry-Schlüssel, umgeleitet werden. Ihr Programm ist tatsächlich Lesen Sie den Wert von HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography\MachineGuid. Die gibt es nicht.
X86 Auswahl ist die Standardeinstellung für VS2010 und bis, vorher auf AnyCPU war der Standard. Microsoft zieht x86, Visual Studio funktioniert besser mit 32-bit-Modus verarbeitet. Besonders bei der Fehlersuche, VS ist ein 32-bit-Prozess selbst, so erfordert der remote-debugger, wenn Ihr Programm ausgeführt wird, das im 64-bit Modus. Das hat ein paar Einschränkungen wie nicht unterstützt mixed-mode-debugging. Und die Edit + Continue-Funktion funktioniert nur für 32-bit-code. Ihr Programm selbst jedoch arbeitet "besser", wenn Sie die Einstellung auf AnyCPU, einschließlich nicht gebissen zu werden, indem Sie die Datei system-und registry-Umleitung appcompat integrierten Funktionen in Windows.
Wenn Sie wirklich stecken mit x86-Modus, in der Regel, weil Sie eine Abhängigkeit auf 32-bit-native-code, können Sie nicht aktualisieren, dann die nächste Lösung ist die Verwendung den .NET 4+ RegistryKey.OpenBaseKey () - Methode. Die können Sie übergeben RegistryView.Registry64, sicherzustellen, dass Sie Lesen Sie die nicht-Weiterleitung Tasten.
Sicher, mithilfe von WMI ist ein workaround. Nur Bedenken Sie, dass Sie nicht Lesen die gleichen Informationen, wenn Sie verwenden Win32_OperatingSystem.SerialNumber. Bis zu welchem Grad, der Schlüssel ist zuverlässig Zufallsprinzip auf verschiedene Maschinen ist nicht, dass für mich klar, lasst uns einfach sagen, dass dieser Wert ein ziemlich attraktives Ziel für die Art von Benutzern, die nicht sehr daran interessiert, die Zahlung der Lizenz-Gebühr für Ihr Produkt.
Last but not least, denken Sie, dass es ziemlich einfach generieren Sie Ihre eigene, einzigartige id, die nicht angewiesen sind auf allen auf Windows. Mit den erheblichen Vorteil, dass Sie nicht verärgern Ihre Kunden, wenn er Windows updates auf seinem Rechner. Verwenden Sie einfach die Guid.NewGuid() einmal und speichert den Wert in eine Datei. Das wird verloren gehen, wenn die Festplatte schlecht geht, aber in der Regel nimmt Ihr Produkt als gut.
Als andere Menschen haben bereits darauf hingewiesen, Sie sollen nicht zu bekommen, dass die Werte direkt aus der registry (das ist wahrscheinlich, warum es nicht zuverlässig arbeitet unter verschiedenen Windows-Versionen).
Ein wenig suchen, führte mich zu der
Win32_OperatingSystem
WMI-Klasse. Mit dieser Klasse können Sie tatsächlich Holen Sie sich die Windows-Seriennummer. Es hat mich etwas suchen und Experimentieren, um es richtig zu machen, aber das ist, wie es zu benutzen in C#.Stellen Sie sicher, dass die
System.Management.dll
in Ihrem Projekt verweisen:Mithilfe der
[]
Betreiber, können Sie jede Eigenschaft in der Klasse.Meiner bescheidenen Meinung nach keine der Antworten befriedigt sich die Frage; ist ziemlich straight forward zu Fragen, nach einem Weg zu Lesen, der MachineGuid aus der registry... so, hier ist meine Antwort: Sie benötigen zum hinzufügen eines Verweises auf "Microsoft.Win32". Dieser code wurde geschrieben für Demo-Zwecke verwendet und sollte dementsprechend angepasst werden.
EDIT: Jemand falsch angegeben, dass die x64-code ist nutzlos. In 64-bit-OS, das ist, wo der ordnungsgemässen Schlüssel gefunden wird. Also diese Antwort steht als die einzige, die das erfüllt die Frage.
Hoffe das hilft einigen ein.
.Dispose()
Anrufe undvariable = null
Erklärungen. Sie sollten lassen Sie die C# garbage collector verwalten Reinigung dieser Objekte.