15 Stimmen

Schreibrechte für Registrierungsschlüssel mit .NET festlegen

Ich versuche, allen oder allen Benutzern eines Rechners während des Installationsvorgangs Schreibzugriff auf die Registrierungseinstellungen meiner Anwendung zu gewähren.

Meine Anwendung verfügt direkt nach der Installation nicht über die entsprechenden Berechtigungen, ohne dass ein Administrator sie erteilen muss, obwohl die Schlüssel und Werte vorhanden sind, sie können nicht aktualisiert werden? Ich habe das unten stehende Snippet, aber das Installationsprogramm schlägt aufgrund von Unauthorized access / access denied fehl. Ich denke, ich bin auf dem richtigen Weg...

Wie kann ich das Berechtigungsproblem lösen, ohne dass ich manuell eingreifen muss? Gibt es einen besseren Ansatz? Ich versuche, ein zusätzliches Installationsprogramm mit dem Visual Studio-Setup zu ersetzen, indem ich diese Funktionalität hinzufüge.

    protected void GrantAllAccessPermission(String key)
    {
        try
        {
            SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
            NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount;

            // Get ACL from Windows, allow writing to the registry key
            using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key, true))
            {

                RegistrySecurity rs = new RegistrySecurity();

                // Creating registry access rule for 'Everyone' NT account
                RegistryAccessRule rar = new RegistryAccessRule(
                    account.ToString(),
                    RegistryRights.FullControl,
                    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
                    PropagationFlags.None,
                    AccessControlType.Allow);

                rs.AddAccessRule(rar);
                rk.SetAccessControl(rs);
            }

        }
        catch (System.Security.SecurityException ex)
        {
            throw new InstallException(
                String.Format("An exception in GrantAllAccessPermission, security exception! {0}", key),  
                ex);
        }
        catch (UnauthorizedAccessException ex)
        {
            throw new InstallException(
                String.Format("An exception in GrantAllAccessPermission, access denied! {0}", key),  
                ex);
        }

    }

11voto

KevinC Punkte 171

Mir ist klar, dass dieser Beitrag schon etwas älter ist, aber ich dachte mir, dass es sich lohnt, ihn für alle zu kommentieren, die darüber stolpern könnten, wie ich es tat, als ich versuchte, ein ähnliches Problem zu lösen. Sie waren sehr nah dran, ich habe nur zwei Codezeilen geändert. Die Schlüsseländerung ist die erste; wenn Sie den Schlüssel öffnen, müssen Sie ihn als beschreibbar öffnen. Die zweite Änderung besteht darin, neue Berechtigungen anzuhängen, anstatt alle Berechtigungen zu ersetzen... da Sie allen Benutzern vollen Zugriff gewähren, brauchen Sie diese Änderung nicht wirklich, aber wenn Sie Berechtigungen für einen einzelnen Benutzer hinzufügen würden, würden Sie Berechtigungen anhängen wollen.

Bei jeder Änderung wird die alte Zeile mit //CHANGED auskommentiert:

SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount;

// Get ACL from Windows

// CHANGED to open the key as writable: using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key))
using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(key, RegistryKeyPermissionCheck.ReadWriteSubTree))
{

        // CHANGED to add to existing security: RegistrySecurity rs = new RegistrySecurity();
    RegistrySecurity rs = rk.GetAccessControl()

    // Creating registry access rule for 'Everyone' NT account
    RegistryAccessRule rar = new RegistryAccessRule(
        account.ToString(),
        RegistryRights.FullControl,
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
        PropagationFlags.None,
        AccessControlType.Allow);

    rs.AddAccessRule(rar);
    rk.SetAccessControl(rs);
}

1voto

dkackman Punkte 14729

Besser ist es, die Anwendungseinstellungen an einem Ort zu hinterlegen, an dem die Benutzer die Erlaubnis zur Aktualisierung haben.

1voto

Jared Knipp Punkte 5734

Ich habe einen anderen und besseren Ansatz gewählt und bin zu Wix 3.0 gewechselt. Mit dem Wix-Installationsprogramm kann ich meine Installation leichter anpassen und erweitern.

Wix Util Extension Namespace hinzufügen:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'>

Wix-Beispiel für Registrierungsberechtigungen:

<!-- Registry entries -->
<DirectoryRef Id="TARGETDIR">
  <Component Id="RegistryEntries" Guid="{YOUR-GUID}">

    <!-- Create registry keys and grant user rights -->
    <!-- Add Registry Keys and default values as necessary -->
    <RegistryKey Root="HKLM" Key="$(var.RegKey)" Action="create">
        <util:PermissionEx User="[WIX_ACCOUNT_USERS]"  GenericAll="yes"/>
    </RegistryKey> 
    ...

1voto

Tanmay Nehete Punkte 2089

Versuchen Sie dies

 new   System.Security.Permissions.RegistryPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
try
{
//Your code
}catch
{
}finally
{
       System.Security.Permissions.RegistryPermission.RevertAssert();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X