Moin,
ich versuche gerade meinen Windows-Key auszulesen. Mit Google wird man auch schnell fündig. Allerdings funktionierte das Snippet nicht bei mir. Weil genau der Value "DigitalProductId" nicht gefunden wird:
RegistryKey rKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
foreach (String name in rKey.GetValueNames()) Logging.info("-> RKN: " + name);
byte[] rpk = (byte[])rKey.GetValue("DigitalProductId4", new byte[] { 0xde, 0xad, 0xbe, 0xff });
Ausgabe:
INF - -> RKN: CurrentVersion
INF - -> RKN: CurrentBuild
INF - -> RKN: SoftwareType
INF - -> RKN: CurrentType
INF - -> RKN: InstallDate
INF - -> RKN: RegisteredOrganization
INF - -> RKN: RegisteredOwner
INF - -> RKN: SystemRoot
INF - -> RKN: InstallationType
INF - -> RKN: EditionID
INF - -> RKN: ProductName
INF - -> RKN: CurrentBuildNumber
INF - -> RKN: BuildLab
INF - -> RKN: BuildLabEx
INF - -> RKN: BuildGUID
INF - -> RKN: CSDBuildNumber
INF - -> RKN: PathName
rpk enthält am Ende eben das Steak statt den Windows-Key. Mit etwas Googeln lässt sich auch eine Lösung finden, statt "x86" muss das Ding bei mir auf "AnyCPU" oder "x64" stehen. Und schon lässt sich der Key auslesen. Das Problem ist aber das ich "x86" benötige, da ich auf eine DLL zugreifen muss die nur in 32 Bit vorliegt.
Nun interessiert mich wieso ich von "x86" nicht auf alle Werte in der Registry zugreifen kann?!
hand, mogel
BTW: auch mit Adminrechten und x86 ist dies nicht möglich. Zumal das auch nicht sinnvoll ist, da es ein Benutzerprogramm ist und Adminrechte nicht benötigt werden.
Warum willst Du das direkt über die Registry machen?
Je nachdem welche Werte Du genau willst kannst Du das ganze auch über WMI oder direkt über C# machen, sodass Du hier etwas unabhängiger bist.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich vermute mal, dass das ein Problem mit 64bit-Systemen ist:
Ich denke, dass der Registrypfad
HKEY_LOCAL_MACHINE\SOFTWARE*Wow6432Node*\Microsoft\Windows NT\CurrentVersion
ist und nicht
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
Du versuchts zwar den zweiten zu öffnen, doch das Betriebsystem ändern den Pfad zum ersten, da du keine 64bit Programm startest.
Was du aber gegen diese Änderung tun kannst, weiß ich nicht?
Moin,
Ich vermute mal, dass das ein Problem mit 64bit-Systemen ist:
Ich denke, dass der Registrypfad
HKEY_LOCAL_MACHINE\SOFTWARE*Wow6432Node*\Microsoft\Windows NT\CurrentVersion
ist und nicht
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
das vermute ich auch. Wenn ich da mit regedit rein schaue, dann fehlen da ein paar Werte - inkl. DigitalProductId.
Was du aber gegen diese Änderung tun kannst, weiß ich nicht?
Ich mache erstmal Ketchup auf die Tischplatte und beiße da rein.
Warum willst Du das direkt über die Registry machen?
Weil google bei "c# windows key" nur Registry-Tricks ausspuckte.
Je nachdem welche Werte Du genau willst kannst Du das ganze auch über WMI oder direkt über C# machen, sodass Du hier etwas unabhängiger bist.
Dann bin ich ganz Ohr - ich brauche einfach nur den Windows-Key der Installation.
hand, mogel
Von einer 32Bit-Anwendung auf den 64Bit-Teil zuzugreifen ist in meinen Augen zwar nicht die feine englische Art, aber wenn Du es unbedingt brauchst kannst Du es auch über die WinApi-Version RegOpenKeyEx machen...
pinvoke.net: regopenkeyex (advapi32)
Da steht alles was Du brauchst (weiter unten ist sogar direkt ein Beispiel für deinen Frage)
Moin,
Von einer 32Bit-Anwendung auf den 64Bit-Teil zuzugreifen ist in meinen Augen zwar nicht die feine englische Art, [...]
der Sinn, wieso MS in der Registry zwischen 32 Bit und 64 Bit trennt, erschließt sich mir nicht ganz. Ich habe die Registry bisher als Datenbank des System betratchtet wo alle relevanten Informationen drinnen sind. Und Informationen sind nicht an die "Bit-Breite" des OS gekoppelt - zumidnest in meinem wirren Kopf.
Damit hat es funktioniert
danke, mogel