Warum kann ich 32-Bit-Registrierungswerte in HKCU auf einer 64-Bit-Maschine nicht richtig lesen?

9

Ich bin auf ein Windows 7-Registrierungsproblem gestoßen und während verschiedene Fragen und Antworten mich auf den Weg dorthin bringen, habe ich nicht gesehen, Adressen mein spezielles Problem. Ich weiß nicht, ob andere Windows-Versionen dieses Problem beeinflussen, aber wir alle haben Win7x64-Maschinen.

Wir haben eine große Auswahl an Tools in unserer Arbeit, einige C ++, einige C #, einige Python (2.6), etc. Wir betreiben auch eine Mischung aus 32 und 64-Bit-Tools. In der Vergangenheit haben wir Registrierungsinformationen in HKLM gespeichert. Wir haben daran gearbeitet, Sachen in die HKCU zu bringen. Wir hatten viele Diskussionen darüber, ob wir das tun sollten, was UAC betrifft usw. Wir wollen wirklich versuchen, diesen Schritt zu machen. Das sagte:

Wir haben Probleme beim Lesen / Schreiben von Registrierungsschlüsseln aus HKCU / software / CompanyABC / App. Wir haben eine Setup-App schreiben in Python, die Registrierungsschlüssel an den oben genannten Ort mit _winreg schreibt. Unabhängig davon, ob KEY_WRITE | KEY_WOW64_32KEY oder nur KEY_WRITE angegeben wird, werden die Werte in HKCU / Software / WOW6432Node / companyABC / app geschrieben. Gut.

Dann habe ich eine C # -App, die versucht, diese Werte zu lesen. Mit Microsoft.Win32.Registry öffne ich den Unterschlüssel ('HKCU / Software / FirmaABC / app') und ich sehe meine Werte nicht. Stellt sich heraus, dass ich das folgende Verhalten sehe:

  • Beim Lesen / Schreiben von Registrierungsschlüsseln von HKLM funktioniert dieses Zeug einfach. Die Python-App schreibt nach HKLM / Softare / Wow6432Node / CompanyABC / app, und der C # -Code liest von diesem Ort. Das alles macht auch Sinn, wenn man bedenkt, wie wir unsere C # -Apps erstellen und die Registrierungswerte über Python schreiben
  • Lesen / Schreiben der Registrierungswerte von HKCU, ich bekomme ein anderes Verhalten. Die _winreg-Funktionen schreiben nach HKCU / Sofrware / Wow6432Node / CompanyABC / app, aber die C # -App liest von HKCU / Software / CompanyABC / app. Die C # -App ist als x86-App aufgebaut (keine Any CPU und nicht x64), also nahm ich an, dass die App richtig auf den wow6432Node umgeleitet werden würde, scheint aber nicht.

Nach einigen Untersuchungen scheint HKCU / Software anders zu sein. Dieser Artikel scheint anzuzeigen, dass dieser Bereich "geteilt" ist und nicht umgeleitet. Wenn das der Fall ist, kann ich nicht verstehen, warum unsere Python-App (wieder mit _winreg) an einen Speicherort in HKCU schreibt, der den Wow6432Node verwendet - es scheint, als müsste er ohne diese Umleitung schreiben. Ich nehme an, dass es ein Fehler in _winreg sein könnte.

Ich möchte wirklich verhindern, dass WOW6432Node explizit in unseren Tools aktiviert wird, aber das ist der Punkt, an dem ich mich heute befinde. Kann mir jemand erklären, wie ich Registrierungszugriffe von 32- und 64-Bit-Prozessen in HKCU korrekt ausführen kann, ohne auf fest codierte Pfade in den 32bit-Hive zurückgreifen zu müssen?

    
Mark 21.11.2011, 18:15
quelle

1 Antwort

4

Ich verstehe aus den Kommentaren zu der Frage, dass dieses Problem weggefallen ist. Für jeden, der auf diese Frage stößt, können Sie Microsoft.Win32.OpenBaseKey , um anzugeben, ob der 64- oder 32-Bit-Teil der Registrierung geöffnet werden soll, wenn er auf einer 64-Bit-Maschine ausgeführt wird, selbst wenn der Prozess als ausgeführt wird ein 32-Bit-Prozess.

Wenn Sie immer auf die Schlüssel im NON-WOW6432Node-Abschnitt der Registrierung zugreifen möchten, können Sie den View-Parameter von OpenBaseKey sicher auf RegistryView .Registry64. Dies funktioniert sowohl auf 64- als auch auf 32-Bit-Betriebssystemen einwandfrei.

    
competent_tech 08.12.2011 00:39
quelle

Tags und Links