Laden...

[gelöst] Werte in Registry verschwunden bzw. versteckt, wenn Programm als x86/32Bit übersetzt

Erstellt von mogel vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.332 Views
mogel Themenstarter:in
156 Beiträge seit 2010
vor 12 Jahren
[gelöst] Werte in Registry verschwunden bzw. versteckt, wenn Programm als x86/32Bit übersetzt

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.

16.834 Beiträge seit 2008
vor 12 Jahren

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.

P
157 Beiträge seit 2010
vor 12 Jahren

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?

mogel Themenstarter:in
156 Beiträge seit 2010
vor 12 Jahren

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

K
62 Beiträge seit 2009
vor 12 Jahren

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)

mogel Themenstarter:in
156 Beiträge seit 2010
vor 12 Jahren

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