CommonApplicationData y sus permisos

Aquí les dejo un tips de WinForm tan rápido como me lo permite el tiempo.

Problemática: Necesitamos crear archivos desde nuestra aplicación que sean modificados por todos los usuarios del sistema operativo sin importar los permisos otorgados. Microsoft aconseja que cuando necesitemos guardar este tipo de información, usemos el CommonApplicationData, el cual es accesible para todos los usuarios.

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

La estructura organizativa que se aconseja mantener en dicho directorio sería [Nombre de la compañíaNombre de la aplicación], pero esto incluye una problemática a nuestro desarrollo, y es que a los archivos creados desde nuestra aplicación, se les asignan permisos de escritura restringidos solo a su creador (El usuario que ejecuta la aplicación) y a cuentas administrativas (Administrador local y administradores de dominio). Si posteriormente nos autentificamos en el sistema operativo con otro usuario cuyos derechos están limitados solamente al grupo [Todos los usuarios], se nos denegará el acceso a modificar los archivos creados por el usuario anterior.

Resolución: Al crear la carpeta que contendrá nuestros archivos para la aplicación, asignémosle permisos especiales que le permitan a todos los usuarios tener acceso total a la misma, posteriormente indicamos que dichos accesos son heredables por todos los objetos que se encuentren dentro y… problema resuelto.

Aquí les dejo una pequeña clase que permite crear carpetas desde nuestra aplicación indicando si deseamos asignar acceso total a todos los usuarios.

public class CommonApplicationData
{
  public static void CreateFolder(string folderName, bool allUsers)
  {
    if (Directory.Exists(folderName)) return;

    var m_securityIdentifier = 
        new SecurityIdentifier(WellKnownSidType.WorldSid, null);

    var m_directoryInfo = Directory.CreateDirectory(folderName);

    if (!allUsers) return;

    bool m_modified;
    var m_directorySecurity = m_directoryInfo.GetAccessControl();

    AccessRule m_rule =
      
new FileSystemAccessRule(m_securityIdentifier,
                  
FileSystemRights.FullControl, 
                   InheritanceFlags.ContainerInherit | 
                   InheritanceFlags.ObjectInherit, 
                   PropagationFlags.InheritOnly, 
                   AccessControlType.Allow);

    m_directorySecurity.
           
ModifyAccessRule(AccessControlModification.Add, 
                              
m_rule, out m_modified); 

    m_directoryInfo.SetAccessControl(m_directorySecurity);
  }

}

Salu2

 

3 comentarios sobre “CommonApplicationData y sus permisos”

  1. Interesante Omar, aunque me pregunto, ¿funciona también si el usuario no tiene permisos para crear carpetas en un directorio determinado y si comprueba las políticas de seguridad del equipo ?

    Un saludo

  2. Hola Juan…

    Bueno.. recuerda que mediante este código le estamos dando permisos a un grupo. Si buscas el enumerado WellKnownSidType, verás que siempre hace referencia a grupos.

    Esto está pensado, creo yo, de una manera correcta.. porque nuestra aplicación nunca debería otorgar derechos a usuarios que el administrador del dominio le ha quitado. Nosotros desde el código lo que hacemos es, a todo aquel usuario que el administrador tenga dentro de un determinado grupo y cuyos permisos no estén restringidos de manera particular, pues le damos acceso a la carpeta de nuestra aplicación.

    Salu2

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *