Entwickler-Ecke

IO, XML und Registry - [3.x] Zugriff auf HKLM unter 64Bit


Delete - Fr 14.05.10 08:13
Titel: [3.x] Zugriff auf HKLM unter 64Bit
Hallo. Ich brauche mal etwas theoretische Hilfe.

Ich überarbeite gerade ein kleines Projekt, das zwingend auf die Registry unter "HKEY_LOCAL_MACHINE" zugreifen muss. Mit meinem XP-32Bit klappt das. Unter 64Bit funktioniert es nicht mehr. Ich kann es nicht selbst prüfen, weil ich kein 64Bit-OS habe und mir auch in der nächsten Zeit keines installieren werde.
Die Frage: Im .NET Framework 4 scheint es Funktionen zu geben, mit denen man die Version wählen kann, so dass das Auslesen von Werten möglich sein wird. Was haben aber Entwickler unter XP-64Bit oder Vista-64Bit bisher gemacht, als sie mit dem 3er-Framework arbeiten mussten und deren Programme unter Umständen auch auf die Registry zugreifen mussten?

Ich brauche also lediglich ein paar Anregungen.
Herzlichen Dank.


Kha - Fr 14.05.10 12:32

Eigentlich werden ja nur Keys umgeleitet, von denen Microsoft dachte, dass eine x86- und eine x64-Anwendung sowieso kein gemeinsames Interesse haben könnten (/CLSID zum Bleistift). Ich fürchte, da wirst du über P/Invoke gehen müssen :nixweiss: .


Delete - Fr 14.05.10 19:05

Dann muss ich vermutlich doch auf das 4er-Framework wechseln. Irgendwelche Dinge zum Thema Rechte, die ich beachten muss? Ich hatte sonst immer

C#-Quelltext
1:
RegistryKey hklm = Registry.LocalMachine.OpenSubKey("Pfad"false);                    

das "false", um den Schlüssel nicht gleich im Vollzugriff aufzumachen. Im Moment nehme ich gerade

C#-Quelltext
1:
RegistryKey hklm = Registry.LocalMachine.OpenSubKey("Pfad", RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey);                    


Wie gesagt, ich habe dummerweise kein 64Bit-Windows. Und die Prioritäten liegen auch woanders. Zumal ich mir dann erst mal den passenden Prozessor einsetzen müsste.


Kha - Sa 15.05.10 13:40

user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
Irgendwelche Dinge zum Thema Rechte, die ich beachten muss?
Mit der Standard-UAC:

F#
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
> Registry.LocalMachine.OpenSubKey("SOFTWARE", writable = false).SubKeyCount;;
val it : int = 75
> RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE", writable = false).SubKeyCount;;
val it : int = 23
> Registry.LocalMachine.OpenSubKey("SOFTWARE", writable = true).SubKeyCount;;
System.Security.SecurityException: Requested registry access is not allowed.
   at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource)
   at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable)
   at <StartupCode$FSI_0010>.$FSI_0010.main@()
The Zone of the assembly that failed was:
MyComputer
Stopped due to error
> RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE", writable = true).SubKeyCount;;
System.Security.SecurityException: Requested registry access is not allowed.
   at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource)
   at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable)
   at <StartupCode$FSI_0011>.$FSI_0011.main@()
The Zone of the assembly that failed was:
MyComputer
Stopped due to error


user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
Wie gesagt, ich habe dummerweise kein 64Bit-Windows.
Wenn du noch eine Frage hast, teste ich das gerne :) .


Delete - Mo 17.05.10 06:52

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

F#
1:
> Registry.LocalMachine.OpenSubKey("SOFTWARE", writable = false).SubKeyCount;;                    

Hm, genau diese Aufrufart habe ich aber versucht. Mal ein ganz praktisches Beispiel:

C#-Quelltext
1:
2:
3:
4:
RegistryKey hklm = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Help\v1.0"false);
string localStore = (string)hklm.GetValue("LocalStore"string.Empty);
hklm.Close();
return localStore;

Liefert bei meinem 32Bit-XP ohne Probleme den Pfadnamen zu den installierten Hilfedokumenten. Beim Test von jemand, der ein 64Bit-Win7 hat, blieb der Pfad leer. Und dann kam die Exception, weil ich versucht habe, den leeren Pfad mit dem Ordnernamen "manifest" zu kombinieren, den ich benötige, um dort ein paar Dateien auszulesen. Entweder wurde "string.Empty" geliefert, weil sie den echten Wert nicht auslesen konnte (vorhanden war er!). Oder die Funktion flog bei "catch" raus und hatte deshalb "string.Empty" als Ergebnis.

Ich werde aber noch mal diese Variante
Zitat:

F#
1:
> RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE", writable = false).SubKeyCount;;                    

probieren.


Kha - Mo 17.05.10 19:09

user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
Beim Test von jemand, der ein 64Bit-Win7 hat, blieb der Pfad leer.
Kann ich bestätigen :) . Im x86-Key ist zwar auch einiges drin, aber kein LocalStore:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help\v1.0]
"AppRoot"="C:\\Program Files\\Microsoft Help Viewer\\v1.0\\"
"LocalStore"="C:\\ProgramData\\Microsoft\\HelpLibrary\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help\v1.0\CatalogInfo]
"vs_100_en-us"="C:\\Program Files\\Microsoft Help Viewer\\v1.0\\CatalogInfo\\vs_100_en-us.cab"


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0]
"AppRoot"="C:\\Program Files\\Microsoft Help Viewer\\v1.0\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\LibManShortcut]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\LibManShortcut\1033]
"installed"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\Setup]
"AppRoot"="C:\\Program Files\\Microsoft Help Viewer\\v1.0\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\Setup\1033]
"Version"="1.0.30319"
"Install"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\VSDocsShortcut]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\VSDocsShortcut\1033]
"installed"=dword:00000001


Delete - Di 18.05.10 07:03

Und bekommst du so ein Ergebnis?

C#-Quelltext
1:
2:
3:
4:
RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(@"SOFTWARE\Microsoft\Help\v1.0"false);
string localStore = (string)hklm.GetValue("LocalStore"string.Empty);
hklm.Close();
return localStore;


Kha - Di 18.05.10 10:19

Japp, unter x86 und natürlich auch AnyCPU :) .


Delete - Di 18.05.10 19:22

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Japp, unter x86 und natürlich auch AnyCPU :) .

Sehr schön. Dann mache ich mal ein Häkchen an das Thema.
Danke für die Mithilfe.