2010-01-27 2 views
15

Я пытаюсь предоставить доступ к параметрам реестра для своего приложения всем пользователям или машинам во время процесса установки.Настройка прав доступа к ключам реестра с использованием .NET

Мое приложение не имеет соответствующих разрешений непосредственно после установки, не требуя от администратора предоставления их, даже если ключи и значения существуют, они не могут быть обновлены? У меня есть фрагмент ниже, но установщик не работает из-за отказа в доступе/доступе к неавторизованному доступу. Я думаю, что я на правильном пути ...

Как разрешить проблему с разрешениями без ручного внимания? Есть ли лучший подход? Я пытаюсь заменить дополнительный установщик установкой Visual Studio, добавив эту функцию.

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

я использовал свой фрагмент кода, чтобы сделать что-то подобное ... просто, чтобы вы знаете, , 'Registry.LocalMachine.OpenSubKey (key)' должен быть 'Registry.LocalMachine.OpenSubKey (key, true)' (где 'true' указывает, что ключ будет доступен для записи). Без этих изменений я запускал «UnauthorizedAccessExceptions». Благодаря! – Pwninstein

+0

Спасибо за это, Pwninstein! Это спасло меня неисчислимые часы разочарования! –

ответ

1

Я перешел на новый и более удобный подход, переключившись на Wix 3.0. Используя установщик Wix, я могу более легко настроить и расширить мою установку.

Добавить Wix Util Расширение пространства имен:

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

Wix Образец для разрешений реестра:

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

Лучшим подходом является размещение настроек приложения где-нибудь, что ваши пользователи получат разрешение на обновление.

+1

Согласен, но оптимальное решение требует больших усилий по рефакторингу. Сейчас я пытаюсь модифицировать приложение, которое я унаследовал. –

+0

, который дует. Вы уверены, что установщик работает с административными/повышенными привилегиями? – dkackman

+0

Это возможность, мой dev/test box - XP. Я займусь этим. –

9

Я понимаю, что этот пост немного старый, но я решил, что стоит комментировать это для всех, кто может наткнуться на него, как я это делал, пытаясь выяснить аналогичную проблему. Вы были очень близки, я только что изменил две строки кода. Ключевое изменение - первое; при открытии ключа вам нужно открыть его как доступный для записи. Второе изменение заключается в добавлении новых разрешений, а не в замене всех разрешений ... поскольку вы предоставляете всем полный доступ, вам действительно не нужно это изменение, но если вы добавляете разрешения для одного пользователя, вы хотите добавить права доступа.

Каждое изменение, которое я сделал первые комментарии из старой линии с // Изменено:

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

попробовать этот

new System.Security.Permissions.RegistryPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert(); 
try 
{ 
//Your code 
}catch 
{ 
}finally 
{ 
     System.Security.Permissions.RegistryPermission.RevertAssert(); 
} 
Смежные вопросы