none
Problema con permisos al instalar aplicación RRS feed

  • Pregunta

  • Hola, les escribo ya que tengo unos problemas con un projecto en el cual trabajo (windows forms, c#, fw 2.0).

    El projecto utiliza un archivo de base de datos sql server .mdf (y su .ldf).

    Éste tiene un projecto Setup el cual ubica a la aplicación bajo "Program Files"\Company\Application (o "Archivos de programa"\Company\Application en español) y a los archivos de base de datos (el mdf y ldf) en la carpeta "ProgramData"\Company\Application (siendo windows 7 el sistema operativo). El problema que tengo es que cuando se instala la aplicación, no logro que se conecte a la base de datos por un tema de permisos con los que quedan instalados los archivos mdf y ldf. Sin embargo si a cada archivo le hago click derecho-> propiedades, el grupo "Usuarios" no tiene "Full Control", si se lo asigno, entonces la aplicación corre sin problemas pudiendo acceder a la base de datos.

     

    Cómo puedo solucionar esto? Hay alguna forma de poder asignarle ese permiso Full Control al grupo Usuarios cuando se está instalando? Tengo entendido que con Orca se puede, pero no he encontrado tutoriales de como hacerlo. Y de no poderse, en qué directorio podria instalar los archivos de base de datos sin que ésto de los permisos interfiera?

    Quiero agregar por si sirve de información que el projecto Setup no crea en un principio ninguna clave en el registro de windows.

    Espero me puedan ayudar, muchas gracias!!

    martes, 23 de noviembre de 2010 11:33

Respuestas

  • Ya logré solucionar mi problema! les cuento como por si alguien lo necesita:

     

    Lo que hice fué crear la siguiente custom action:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration.Install;
    using System.Security.AccessControl;
    using System.Security.Principal;
    using System.IO;
    using System.Collections;
    using System.Diagnostics;
    
    namespace Installer
    {
      [RunInstaller(true)]
      public partial class InstallerClass : System.Configuration.Install.Installer
      {
        public InstallerClass()
        {
          InitializeComponent();
        }
    
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Install(IDictionary stateSaver)
        {
          base.Install(stateSaver);
        }
    
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Commit(IDictionary savedState)
        {
          base.Commit(savedState);
          //CAMBIAR PERMISOS DE BASE DE DATOS
          // Allow 'Everyone' access to the file
          try
          {
            SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
            NTAccount acct = sid.Translate(typeof(NTAccount)) as NTAccount;
            string strEveryoneAccount = acct.ToString();
    
            String appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\Company\\ApplicationName";
            string Database = appDataPath + "\\Database.mdf";
            string Database_log = appDataPath + "\\Database_log.ldf";
    
            //Database.mdf permissions
            FileSecurity fSecurity = File.GetAccessControl(Database);
            fSecurity.AddAccessRule(new FileSystemAccessRule(strEveryoneAccount, FileSystemRights.FullControl, AccessControlType.Allow));
            File.SetAccessControl(Database, fSecurity);
    
            //Database_log.ldf permissions
            FileSecurity fSecurity2 = File.GetAccessControl(Database_log);
            fSecurity2.AddAccessRule(new FileSystemAccessRule(strEveryoneAccount, FileSystemRights.FullControl, AccessControlType.Allow));
            File.SetAccessControl(Database_log, fSecurity2);
          }
          catch(Exception ex)
          {
            
          }
        }
    
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Rollback(IDictionary savedState)
        {
          base.Rollback(savedState);
        }
    
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Uninstall(IDictionary savedState)
        {
          base.Uninstall(savedState);
        }
    
      }
    }
    

    Y ésto me permitió cambiar los permisos a los dos archivos luego de haber instalado la aplicación :D

    Algo que me gustaría saber es como enviar un mensaje si es que el try falla y entra en el catch.

    miércoles, 24 de noviembre de 2010 13:20

Todas las respuestas

  • hola

    como estas crando el instalador, lo haces por medio de ClickOnce o creas un Setup Project ?

     

    Deploying A C# Application (Visual Studio Setup Project)

    por ahi creando un Setup Project puedas controlar los permsisos si agregas la mdf como un archivo extra

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 23 de noviembre de 2010 12:35
  • hola

    como estas crando el instalador, lo haces por medio de ClickOnce o creas un Setup Project ?

     

    Deploying A C# Application (Visual Studio Setup Project)

    por ahi creando un Setup Project puedas controlar los permsisos si agregas la mdf como un archivo extra

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Hola Leandro, gracias por responder!

    Estoy creando un Setup Project, y los archivos mdf y ldf los agrego como un archivo extra pero dentro de la ide de visual studio 2005 no veo nada que me permita asignarle permisos luego de ser instalados. He cambiado desde los archivos mismos los permisos para Users y Full Control, pero ésto no se traslada a la aplicación luego de instalada.. siguen estando con esos permisos sin chequear.

    martes, 23 de noviembre de 2010 15:31
  • Ya logré solucionar mi problema! les cuento como por si alguien lo necesita:

     

    Lo que hice fué crear la siguiente custom action:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration.Install;
    using System.Security.AccessControl;
    using System.Security.Principal;
    using System.IO;
    using System.Collections;
    using System.Diagnostics;
    
    namespace Installer
    {
      [RunInstaller(true)]
      public partial class InstallerClass : System.Configuration.Install.Installer
      {
        public InstallerClass()
        {
          InitializeComponent();
        }
    
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Install(IDictionary stateSaver)
        {
          base.Install(stateSaver);
        }
    
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Commit(IDictionary savedState)
        {
          base.Commit(savedState);
          //CAMBIAR PERMISOS DE BASE DE DATOS
          // Allow 'Everyone' access to the file
          try
          {
            SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
            NTAccount acct = sid.Translate(typeof(NTAccount)) as NTAccount;
            string strEveryoneAccount = acct.ToString();
    
            String appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\Company\\ApplicationName";
            string Database = appDataPath + "\\Database.mdf";
            string Database_log = appDataPath + "\\Database_log.ldf";
    
            //Database.mdf permissions
            FileSecurity fSecurity = File.GetAccessControl(Database);
            fSecurity.AddAccessRule(new FileSystemAccessRule(strEveryoneAccount, FileSystemRights.FullControl, AccessControlType.Allow));
            File.SetAccessControl(Database, fSecurity);
    
            //Database_log.ldf permissions
            FileSecurity fSecurity2 = File.GetAccessControl(Database_log);
            fSecurity2.AddAccessRule(new FileSystemAccessRule(strEveryoneAccount, FileSystemRights.FullControl, AccessControlType.Allow));
            File.SetAccessControl(Database_log, fSecurity2);
          }
          catch(Exception ex)
          {
            
          }
        }
    
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Rollback(IDictionary savedState)
        {
          base.Rollback(savedState);
        }
    
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Uninstall(IDictionary savedState)
        {
          base.Uninstall(savedState);
        }
    
      }
    }
    

    Y ésto me permitió cambiar los permisos a los dos archivos luego de haber instalado la aplicación :D

    Algo que me gustaría saber es como enviar un mensaje si es que el try falla y entra en el catch.

    miércoles, 24 de noviembre de 2010 13:20