2010-01-27 13 views
15

Próbuję nadać prawu zapisu dostęp do ustawień rejestru mojej aplikacji wszystkim lub wszystkim użytkownikom komputera podczas procesu instalacji.Ustawianie uprawnień do zapisu klucza Rejestru przy użyciu .NET

Moja aplikacja nie ma odpowiednich uprawnień bezpośrednio po instalacji bez konieczności uzyskania uprawnień administratora, mimo że klucze i wartości istnieją, nie można ich zaktualizować? Mam poniższy fragment, ale instalator nie działa z powodu nieautoryzowanego dostępu/odmowy dostępu. Myślę, że jestem na dobrej drodze ...

Jak mogę rozwiązać problem uprawnień bez konieczności ręcznego sprawdzania? Czy istnieje lepsze podejście? Próbuję zastąpić dodatkowy instalator instalacją Visual Studio przez dodanie tej funkcji.

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

użyłem swój fragment, aby osiągnąć coś podobnego ... po prostu pozwolić ci wiedzieć , 'Registry.LocalMachine.OpenSubKey (key)' powinno być 'Registry.LocalMachine.OpenSubKey (key, true)' (gdzie 'true' wskazuje, że klucz będzie można zapisać). Wystąpiłam w 'UnauthorizedAccessExceptions' bez tej zmiany. Dzięki! – Pwninstein

+0

Dzięki za to, Pwninstein! Uratowało mnie to niezliczone godziny frustracji! –

Odpowiedz

1

Skończyłem na innym i lepszym podejściu, przechodząc na Wix 3.0. Korzystając z instalatora Wix, mogę łatwiej dostosować i rozszerzyć moją instalację.

Dodaj Wix Util Przedłużenie nazw:

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

Próbka Wix o uprawnieniach rejestru:

<!-- 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

Lepszym rozwiązaniem jest umieszczenie ustawień aplikacji w miejscu, w którym użytkownicy będą mieli uprawnienia do aktualizacji.

+1

Zgadzam się, ale optymalne rozwiązanie wymaga większego wysiłku refaktoryzacji. Obecnie próbuję doposażać aplikację, którą odziedziczyłem. –

+0

który wieje. Czy jesteś pewien, że instalator działa z uprawnieniami administracyjnymi/podwyższonymi? – dkackman

+0

Jest to możliwe, moje pole dev/test to XP. Zajrzę w to. –

9

Zdaję sobie sprawę, ten post jest trochę stary, ale pomyślałem, że warto było komentując to dla każdego, kto może natknąć się na to tak jak ja, próbując znaleźć podobny problem. Byłeś bardzo blisko, zmieniłem tylko dwie linie kodu. Kluczowa zmiana jest pierwsza; po otwarciu klucza musisz otworzyć go jako zapisywalny. Druga zmiana polega na dodawaniu nowych uprawnień zamiast na zastępowaniu wszystkich uprawnień ... ponieważ dajesz każdemu pełny dostęp, tak naprawdę nie potrzebujesz tej zmiany, ale jeśli dodałeś uprawnienia dla pojedynczego użytkownika, chciałbyś dodać uprawnienia.

Każda zmiana zrobiłem pierwsze komentarze na starej linii z // Zmieniono:

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

spróbować tej

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