Cómo otorgar permisos de lectura / escritura a una carpeta durante la instalación usando .NET

Tengo un proyecto de instalación que tengo comstackdo usando Visual Studio 2010.

El instalador funciona bien en términos de instalación de la aplicación y todas sus dependencias en sus subdirectorios y directorios de datos de progtwig adecuados.

Sin embargo, noté que cada directorio (la carpeta raíz y todos sus subdirectorios) que el instalador creó no otorga permisos de “Escritura”. Los únicos permisos que se agregan a los directorios para el grupo “Usuarios” son:

  • Leer y ejecutar
  • Lista de contenidos en la carpeta
  • Leer

Esta aparente configuración de permisos predeterminados ocurrirá independientemente de si el usuario instala la aplicación como “Administrador” o no.

Me parece extraño que el instalador no otorgue 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 la base de datos de la aplicación no obtiene permisos de “escritura”.

Mi pregunta es, ¿hay alguna manera de configurar el proyecto de configuración para que, en caso de que cree una carpeta, podamos decir qué tipo de permisos otorgarle 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 permisos de “Lectura / Escritura” para el “Grupo de Usuarios”. Técnicamente, estoy de acuerdo con darle a los directorios “Control total” para el “Grupo de usuarios”.

Por defecto, el grupo de usuarios no tiene acceso de escritura en ubicaciones por máquina, como Archivos de progtwig. 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. Entonces, la única solución en Visual Studio es una acción personalizada.

Lamentablemente, Visual Studio no admite acciones personalizadas adjuntas. Por lo tanto, usar XCACLS.EXE para establecer permisos solo funcionaría si lo incluye en su paquete (se instalará en el equipo de destino junto con sus archivos).

Una solución más limpia pero más compleja es escribir usted mismo una acción personalizada (utilizando un 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.

Creo que mi otra publicación fue eliminada por ser demasiado general, así que la he refinado a continuación:

Lo que hay que hacer es realizar una acción personalizada. Es bastante sencillo, echa un vistazo al tutorial de MSDN para escribir una acción personalizada de C # aquí . Pondrá su código de cambio de permiso dentro del método de instalación:

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

En realidad, configurar los privilegios de lectura / escritura para los usuarios fue un poco más complicado, y lo más que pude conseguir fue establecer para los usuarios autenticados. He improvisado 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 crea su acción personalizada, edite sus propiedades y agregue algo como esto en la propiedad CustomActionData:

 /folder="[CommonAppDataFolder][ProductName]" 
 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 a control total / lectura-escritura para cada usuario (todos).

El comportamiento es por diseño. Los progtwigs no deberían modificarse ellos mismos (de ahí su directorio de instalación) para nada más que actualizaciones (lo que nuevamente se puede hacer con el instalador de Windows sin ningún problema). Si está utilizando .NET, el almacenamiento aislado es una excelente ubicación para almacenar datos de usuario.

 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 heredada también es importante si desea guardar y acceder a más de un solo archivo en la carpeta ProgramData.

Como se mencionó anteriormente, el grupo de usuarios no tiene permiso de escritura en Archivos de progtwig. Si no desea tratar con la clase de instalador o Wix (si se trata de un progtwig simple), simplemente prefiera instalar su software en un volumen de Windows.

Estoy hablando del Asistente de instalación de Visual Studio : Cambie la propiedad ‘ DefaultLocation ‘ de la carpeta de aplicaciones de [ProgramFilesFolder] a [WindowsVolume] [Manufacturer] [ProductName] en File System on Target Machine.