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