Cómo dar permisos de lectura / Escritura a una carpeta durante la instalación using.NET


Tengo un proyecto de configuración que he creado usando Visual Studio 2010.

El instalador funciona bien en términos de instalar la aplicación y todas sus dependencias en sus subdirectorios adecuados y directorios de Datos de programa.

Sin embargo, me di cuenta de que cada directorio (la carpeta raíz y todos sus subdirectorios) que el instalador creado no da permisos de "Escritura". Los únicos permisos que se agregan a los directorios para el grupo" Usuarios" son:

  • Leer y ejecutar
  • Listar el contenido de la carpeta
  • Debe decir

Esto, aparente configuración de permisos por defecto, sucederá independientemente de si el usuario instala la aplicación como "Administrador" o no.

Me parece extraño que el instalador no dé permisos de "Escritura" a una carpeta que está siendo utilizada por la aplicación que se está instalando - Es aún más confuso que la carpeta que el instalador crea en la carpeta ProgramData para el la base de datos de la aplicación no obtiene permisos de "Escritura".

Mi pregunta es, ¿hay una manera de configurar el proyecto de configuración para que si y cuando se crea una carpeta, podemos decirle qué tipo de permisos para darle y a quién. En mi caso, necesito dar el directorio raíz (de la aplicación) y todos sus subdirectorios, y la carpeta que se coloca en la carpeta ProgramData "Lectura/Escritura" permisos para el "Grupo de usuarios". Técnicamente, estoy bien con dar el dirs "Control total" a la "Grupo de Usuarios".

Author: leppie, 2011-09-02

6 answers

De forma predeterminada, el grupo Usuarios no tiene acceso de escritura en ubicaciones por máquina, como Archivos de programa. Este es un estándar de Windows que no está relacionado con las instalaciones. Sin embargo, durante la instalación puede establecer los permisos que desee.

Windows Installer admite permisos personalizados, pero Visual Studio no ofrece una forma de configurarlos. Así que la única solución en Visual Studio es una acción personalizada.

Desafortunadamente Visual Studio no admite acciones personalizadas adjuntas. Así que usando XCACLS.EXE establecer permisos solo funcionaría si lo incluye en su paquete (se instalará en la máquina de destino junto con sus archivos).

Una solución más limpia, pero más compleja es escribir una acción personalizada usted mismo (usando código personalizado) para establecer los permisos que desea.

La solución más rápida y limpia sería usar una herramienta de creación de configuración diferente que ofrezca más control sobre los permisos.

 9
Author: user527987,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 21:44:22

Supongo que mi otro post fue eliminado por ser un poco demasiado general, así que lo he refinado a continuación:

Lo que hay que hacer es hacer una acción personalizada. Es bastante sencillo, echa un vistazo a la guía de MSDN para escribir una acción personalizada en C# aquí. Pondrás tu código de cambio de permisos dentro del método Install:

Siga los primeros pasos del enlace para obtener un nuevo proyecto de instalador referenciado desde su solución de instalación. Tienes que hacerlo de esta manera, para que puedas construir una dll que se llama al final de la instalación.

En realidad, establecer privilegios de lectura/escritura para los Usuarios era un poco más complicado, y lo más cercano que pude conseguir fue establecer para los Usuarios Autenticados. Improvisé algunas otras soluciones que encontré en Internet para llegar a esto:

public override void Install(IDictionary stateSaver)
{
    // This gets the named parameters passed in from your custom action
    string folder = Context.Parameters["folder"];

    // This gets the "Authenticated Users" group, no matter what it's called
    SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null);

    // Create the rules
    FileSystemAccessRule writerule = new FileSystemAccessRule(sid, FileSystemRights.Write, AccessControlType.Allow);

    if (!string.IsNullOrEmpty(folder) && Directory.Exists(folder))
    {
        // Get your file's ACL
        DirectorySecurity fsecurity = Directory.GetAccessControl(folder);

        // Add the new rule to the ACL
        fsecurity.AddAccessRule(writerule);

        // Set the ACL back to the file
        Directory.SetAccessControl(folder, fsecurity);
    }

    // Explicitly call the overriden method to properly return control to the installer
    base.Install(stateSaver);
}

Luego, cuando cree su acción personalizada, edite sus propiedades y agregue algo como esto bajo la propiedad CustomActionData:

/folder="[CommonAppDataFolder][ProductName]"
 34
Author: ACK_stoverflow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-21 09:47:06
private static void GrantAccess(string file)
        {
            bool exists = System.IO.Directory.Exists(file);
            if (!exists)
            {
                DirectoryInfo di = System.IO.Directory.CreateDirectory(file);
                Console.WriteLine("The Folder is created Sucessfully");
            }
            else
            {
                Console.WriteLine("The Folder already exists");
            }
            DirectoryInfo dInfo = new DirectoryInfo(file);
            DirectorySecurity dSecurity = dInfo.GetAccessControl();
            dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
            dInfo.SetAccessControl(dSecurity);

        }

El código anterior establecerá los derechos de acceso de la carpeta para control total/ lectura-escritura para cada usuario (todos).

 6
Author: Richendra kumar ravi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-02 10:23:33

El comportamiento es por diseño. Los programas no deben estar modificándose a sí mismos (de ahí su directorio de instalación) para nada más que actualizaciones (que de nuevo se puede hacer con Windows installer sin problema). Si está utilizando. NET, isolated storage es una excelente ubicación para almacenar datos de usuario.

 3
Author: Teoman Soygul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 19:43:14
DirectoryInfo info = new DirectoryInfo(path[x]);

DirectorySecurity security = info.GetAccessControl();

security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.Modify, InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow));

security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.Modify, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));

info.SetAccessControl(security); 

Establecer la parte heredar también es importante si desea guardar y acceder a más de un archivo en la carpeta ProgramData.

 3
Author: Kristian Søgaard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-14 21:07:36

Como se ha mencionado anteriormente, el grupo de usuarios no tiene permiso de escritura en los archivos de programa. Si no desea tratar con la clase installer o Wix (si es un programa simple), simplemente prefiera instalar su software bajo un volumen de Windows.

Estoy hablando de Asistente de configuración de Visual Studio : Cambiar la carpeta de la aplicación' DefaultLocation ' Propiedad de [ProgramFilesFolder] a [WindowsVolume][Manufacturer] [ProductName] en el Sistema de archivos en la Máquina de destino.

 0
Author: depicci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-20 12:43:57