Fehler 122 beim Zugriff auf Registry

jokey2

Erfahrenes Mitglied
Hallo Gemeinde!

Lange war ich nicht mehr hier, aber jetzt probiere ich mich in C# und habe da Probleme mit dem Registry-Zugriff:

1.)
Beim Zugriff auf einige (nicht alle!) Subkeys unter Wow6432Node-Keys bekomme ich beim Aufruf von RegistryKey.OpenSubKey null zurück. Dann versuche ich es mit dem Aufruf der RegOpenKeyEx-Funktion aus der advapi32.dll. Dieser Aufruf liefert mit den Wert 122 (ERROR_INSUFFICIENT_BUFFER) zurück. Wie kann das sein?
Hier der Code in Ausschnitten:

Laden der Funktion aus der DLL:
Code:
        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "RegOpenKeyEx")]
        static extern int RegOpenKeyEx(IntPtr hKey, string subKey, uint options, int sam, out IntPtr phkResult);

Lesen des Keys:
Code:
                                SubKey = m_Key.OpenSubKey(key, false);
                                if (SubKey != null)
                                    NewKey = new RegKey(SubKey, this);
                                else
                                {
                                    IntPtr hTargetKey = IntPtr.Zero;
                                    IntPtr hKey = m_Key.Handle.DangerousGetHandle();

                                    int result = RegOpenKeyEx(hKey,
                                        key,
                                        0,
                                        KEY_ALL_ACCESS | STANDARD_RIGHTS_ALL | KEY_QUERY_VALUE | KEY_WOW64_32KEY,
                                        out hTargetKey);
                                    if (result == 0)
                                    {
                                        Assembly ass = typeof(SafeHandle).Assembly;
                                        Type type = ass.GetType("Microsoft.Win32.SafeHandles.SafeRegistryHandle");
                                        SafeHandle sh = (SafeHandle)Activator.CreateInstance(type,
                                            BindingFlags.Instance | BindingFlags.NonPublic,
                                            null,
                                            new object[] { hTargetKey, true },
                                            null);
                                        SubKey = (RegistryKey)Activator.CreateInstance(typeof(RegistryKey),
                                            BindingFlags.Instance | BindingFlags.NonPublic,
                                            null,
                                            new object[] { sh, true },
                                            null);
                                        NewKey = new RegKey(SubKey, this);
                                    }
                                    else
                                    {
                                        NewKey = new RegKey(key, this);
                                        recursive_key = false;
                                    }
                                }

Das hab' ich so aus dem MSDN abgeschaut. M.E. könnte ja nur der Buffer für das zurückgegebene Handle zu klein sein. Wie kann das aber sein bzw. was kann ich dagegen tun?

2.)
Bei einigen Keys, z.B. HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider\S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZ-1000 (die UID habe ich unkenntlich gemacht) oder HKEY_LOCAL_MACHINE\SECURITY bekomme ich eine SecurityException ("Der angeforderte Registrierungszugriff ist unzulässig."). Die Anwendung wird als Administrator ausgeführt.
Kann ich da etwas dagegen tun und Zugriff auf die Schlüssel bekommen?


RegEdit scheint keines der beiden Probleme zu haben. Also muss es ja irgendwie möglich sein. Die Frage ist nur, ob das auch unter .NET mit C# geht. Es wäre schön, wenn mir da jemand weiterhelfen könnte und ein paar Tipps für mich hätte.

Grüße,
jokey

PS.: Ich arbeite unter Windows 64 Ultimate mit MS Visual C# 2010 Express.
 
Hi

Gibt es einen besonderen Grund das über die Windows API zu machen und nicht über die vom Framework gegebenen Mittel?
 

Neue Beiträge

Zurück