Registry-Zugriff per Code

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Jonas Jelonek.

    Registry-Zugriff per Code

    Hallo

    Ich versuche momentan verzweifelt, mir durch ein paar Codezeilen Zugriff auf spezielle Registrierungsschlüssel zu verschaffen, jedoch bisher ohne Erfolg. Auch wenn ich die Berechtigungen ändern will, wird mir das verweigert. Ich habe es auch schon mit Code aus dem Internet versucht, z.B. hier, jedoch hatte ich damit genauso wenig Erfolg wie mit meinem eigene Code. Gibt es dafür überhaupt noch eine Möglichkeit oder muss man es manuell machen?

    MfG
    Jonas
    @Jonas Jelonek Welchen Schlüssel willst Du den auslesen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @xtts02
    Spoiler anzeigen

    Bei RegistryKey regKey = Registry.ClassesRoot.OpenSubKey("CLSID\\{679f85cb-0220-4080-b29b-5540cc05aab6}\\ShellFolder", RegistryKeyPermissionCheck.ReadWriteSubTree);

    System.Security.SecurityException wurde nicht behandelt.
    HResult=-2146233078
    Message=Der angeforderte Registrierungszugriff ist unzulässig.
    Source=mscorlib
    StackTrace:
    bei System.ThrowHelper.ThrowSecurityException(ExceptionResource resource)
    bei Microsoft.Win32.RegistryKey.InternalOpenSubKey(String name, RegistryKeyPermissionCheck permissionCheck, Int32 rights)
    bei Microsoft.Win32.RegistryKey.OpenSubKey(String name, RegistryKeyPermissionCheck permissionCheck)
    bei WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) in C:\Users\Jonas\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs:Zeile 28.
    bei System.Windows.Forms.Control.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
    bei System.Windows.Forms.Button.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.Run(Form mainForm)
    bei WindowsFormsApplication1.Program.Main() in C:\Users\Jonas\AppData\Local\Temporary Projects\WindowsFormsApplication1\Program.cs:Zeile 19.
    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart()
    InnerException:



    @RodFromGermany HKEY_CLASSES_ROOT\CLSID\{679f85cb-0220-4080-b29b-5540cc05aab6}

    @Anluin Ja, ich habe VS als Admin gestartet und dieses startet dann das Programm auch als Admin.
    Wird vermutlich trotzdem an der UAC liegen. Compile das Programm mal und starte es dann mit Rechtsklick als Administrator ausführen oder deaktiviere testweise mal die UAC
    Das ist meine Signatur und sie wird wunderbar sein!
    Wenn ich mich manuell als Besitzer des Registrierungsschlüssels eintrage und mir vollen Zugriff gewähre, funktioniert das. Jedoch auch nach dem manuellen Gewähren dieser Berechtigungen kann das Programm immernoch nicht darauf zugreifen.

    Jonas Jelonek schrieb:

    derselbe Fehler
    Du solltest nur lesen, nicht aber schreiben.
    Dies hier funktioniert bei mir:

    VB.NET-Quellcode

    1. Dim regKey As RegistryKey = Registry.ClassesRoot.OpenSubKey("CLSID\\{679f85cb-0220-4080-b29b-5540cc05aab6}\\ShellFolder", RegistryKeyPermissionCheck.ReadSubTree)

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Jonas Jelonek schrieb:

    schreiben
    Noch mal: Geht das als Administrator nicht?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Den habe ich so teilweise aus dem Internet

    C#-Quellcode

    1. SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
    2. NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount;
    3. RegistryKey regKey = Registry.ClassesRoot.OpenSubKey("CLSID\\{679f85cb-0220-4080-b29b-5540cc05aab6}\\ShellFolder", RegistryKeyPermissionCheck.ReadWriteSubTree);
    4. if (regKey == null) { MessageBox.Show("Fehler"); }
    5. RegistrySecurity rs = regKey.GetAccessControl();
    6. RegistryAccessRule rar = new RegistryAccessRule(account.ToString(), RegistryRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
    7. PropagationFlags.None, AccessControlType.Allow);
    8. rs.AddAccessRule(rar);
    9. regKey.SetAccessControl(rs);

    Jonas Jelonek schrieb:

    RegistrySecurity rs = regKey.GetAccessControl();


    Soweit ich weiß musst du die AccessControl komplett neu setzen mit einem neuen Owner!
    Das ist meine Signatur und sie wird wunderbar sein!