2010-01-27 2 views
15

Ich versuche, während der Installation Schreibzugriff auf die Registrierungseinstellungen meiner Anwendung allen Benutzern oder allen Benutzern einer Maschine zu gewähren.Festlegen der Schreibberechtigung für Registrierungsschlüssel mit .NET

Meine Anwendung verfügt nicht direkt nach der Installation über die entsprechenden Berechtigungen, ohne dass ein Administrator sie gewähren muss, obwohl die Schlüssel und Werte vorhanden sind. Sie können nicht aktualisiert werden. Ich habe das folgende Snippet, aber das Installationsprogramm schlägt fehl, weil der Zugriff verweigert wurde. Ich denke, ich bin auf dem richtigen Weg ...

Wie kann ich das Problem der Berechtigungen ohne manuelle Aufmerksamkeit lösen? Gibt es einen besseren Ansatz? Ich versuche, ein zusätzliches Installationsprogramm durch das 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); 
     } 

    } 
+11

ich Ihre Schnipsel verwendet versuchen, etwas ähnliches zu erreichen ... nur, damit Sie wissen, , 'Registry.LocalMachine.OpenSubKey (key)' sollte 'Registry.LocalMachine.OpenSubKey (key, true)' sein (wobei 'true' angibt, dass der Schlüssel beschreibbar sein soll). Ich lief in "UnauthorizedAccessExceptions" ohne diese Änderung. Vielen Dank! – Pwninstein

+0

Danke dafür, Pwninstein! Es hat mich unzählige Stunden der Frustration gerettet! –

Antwort

1

Ich habe einen anderen und besseren Ansatz gewählt, indem ich zu Wix 3.0 gewechselt habe. Mit dem Wix-Installer kann ich meine Installation einfacher anpassen und erweitern.

hinzufügen Wix Util Erweiterung Namespace:

<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> 
    ... 
1

Der bessere Ansatz ist, Ihre Anwendungseinstellungen irgendwo, dass Ihre Benutzer die Erlaubnis haben, zu aktualisieren.

+1

Ich stimme zu, aber eine optimale Lösung erfordert einen größeren Refaktorierungsaufwand. Im Moment versuche ich eine Anwendung, die ich geerbt habe, nachzurüsten. –

+0

das bläst. Sind Sie sicher, dass das Installationsprogramm mit administrativen/erhöhten Rechten ausgeführt wird? – dkackman

+0

Das ist eine Möglichkeit, meine Dev/Test Box ist XP. Ich werde das untersuchen. –

9

Ich weiß, dieser Beitrag ist ein bisschen alt, aber ich dachte, es wert war es für jedermann zu kommentieren, dass könnte darüber stolpern wie ich, als ich versuchte, ein ähnliches Problem herauszufinden. Du warst sehr nah dran, ich habe gerade zwei Zeilen Code geändert. Die Schlüsseländerung ist die erste; Wenn Sie den Schlüssel öffnen, müssen Sie ihn als schreibbar öffnen. Die zweite Änderung besteht darin, neue Berechtigungen anzuhängen, anstatt alle Berechtigungen zu ersetzen. Da Sie allen vollen Zugriff gewähren, benötigen Sie diese Änderung nicht wirklich. Wenn Sie jedoch Berechtigungen für einzelne Benutzer hinzufügen, sollten Sie Berechtigungen hinzufügen.

Jede Änderung, die ich erste Kommentare aus der alten Zeile mit // GEäNDERT gemacht:

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); 
} 
1

diesen

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