2010-01-27 10 views
15

Estoy intentando otorgar acceso de escritura a la configuración de registro de mi aplicación a todos o todos los usuarios de una máquina durante el proceso de instalación.Configuración de los permisos de escritura de la clave del Registro mediante .NET

Mi aplicación no cuenta con los permisos apropiados directamente después de la instalación sin requerir que un administrador los otorgue aunque las claves y valores existen, no se pueden actualizar? Tengo el siguiente fragmento, pero el instalador está fallando debido a acceso/acceso no autorizado denegado. Creo que estoy en el camino correcto ...

¿Cómo puedo resolver el problema de permisos sin requerir atención manual? ¿Hay un mejor enfoque? Estoy intentando reemplazar un instalador adicional con la configuración de Visual Studio agregando esta funcionalidad.

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

utilicé el fragmento de lograr algo similar ... sólo para hacerle saber , 'Registry.LocalMachine.OpenSubKey (clave)' debe ser 'Registry.LocalMachine.OpenSubKey (clave, verdadero)' (donde 'true' indica que la clave será escribible). Me estaba encontrando con 'UnuthorizedAccessExceptions' sin ese cambio. ¡Gracias! – Pwninstein

+0

¡Gracias por eso, Pwninstein! ¡Me salvó innumerables horas de frustración! –

Respuesta

1

Terminé tomando un enfoque diferente y mejor al cambiar a Wix 3.0. Usando el instalador Wix puedo personalizar y expandir más fácilmente mi instalación. espacio de nombres

Añadir Wix Util Extensión:

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

Wix muestra para permisos de registro:

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

El mejor enfoque es poner la configuración de la aplicación en algún lugar que los usuarios tengan permiso para actualizar.

+1

Estoy de acuerdo, pero una solución óptima requiere un mayor esfuerzo de refactorización. En este momento estoy tratando de actualizar una aplicación que heredé. –

+0

que sopla. ¿Estás seguro de que el instalador se está ejecutando con privilegios administrativos/elevados? – dkackman

+0

Esa es una posibilidad, mi caja de desarrollo/prueba es XP. Voy a investigar eso. –

9

realizo este post es un poco viejo, pero pensé que valía la pena comentar que para cualquier persona que podría tropezar con él como lo hice al tratar de resolver un problema similar. Estuviste muy cerca, acabo de cambiar dos líneas de código. El cambio clave es el primero; al abrir la llave, debe abrirla como escribible. El segundo cambio es agregar nuevos permisos en lugar de reemplazar todos los permisos ... ya que le está dando a todos acceso total, realmente no necesita este cambio, pero si estuviera agregando permisos para un solo usuario, le gustaría agregar permisos.

Cada cambio que hice primeros comentarios a cabo la vieja línea con // CAMBIO:

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

probar este

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