2012-01-20 14 views
8

Esto debería ser un problema bastante simple, pero por alguna razón parece que no puedo hacer que esto funcione. Todo lo que me gustaría hacer es establecer los permisos en un directorio determinado para permitir el acceso completo a todos los usuarios. Este es el código que tengo hasta ahora:C# - Establecer permisos de directorio para todos los usuarios en Windows 7

System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(destinationDirectory); 
FileSystemAccessRule fsar = new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow); 
DirectorySecurity ds = null; 

    if (!di.Exists) 
    { 
     System.IO.Directory.CreateDirectory(destinationDirectory); 
    } 

ds = di.GetAccessControl(); 
ds.AddAccessRule(fsar); 

No se producen excepciones, pero tampoco sucede nada. Cuando verifico los permisos del directorio después de ejecutar el código, no veo cambios.

¿Alguna idea?

Gracias de antemano,
Sonny

+0

¿trató de ejecutar código anterior con UAC desactivado? – rkosegi

+1

@David - He intentado ejecutar el ejecutable compilado como administrador y no hace ninguna diferencia en el resultado. –

+0

@rkosegi - ¿Cómo hago eso? ¿Es una configuración en Visual Studio? –

Respuesta

25

También necesitan llamar SetAccessControl para aplicar los cambios.

ds = di.GetAccessControl(); 
ds.AddAccessRule(fsar); 
di.SetAccessControl(ds); // nothing happens until you do this 

parece que los ejemplos en MSDN están profundamente carencias en detalle, como se discutió here. Me corté el código de este artículo para obtener los siguientes elementos que se comporta así:

static bool SetAcl() 
{ 
    FileSystemRights Rights = (FileSystemRights)0; 
    Rights = FileSystemRights.FullControl; 

    // *** Add Access Rule to the actual directory itself 
    FileSystemAccessRule AccessRule = new FileSystemAccessRule("Users", Rights, 
           InheritanceFlags.None, 
           PropagationFlags.NoPropagateInherit, 
           AccessControlType.Allow); 

    DirectoryInfo Info = new DirectoryInfo(destinationDirectory); 
    DirectorySecurity Security = Info.GetAccessControl(AccessControlSections.Access); 

    bool Result = false; 
    Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result); 

    if (!Result) 
     return false; 

    // *** Always allow objects to inherit on a directory 
    InheritanceFlags iFlags = InheritanceFlags.ObjectInherit; 
    iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; 

    // *** Add Access rule for the inheritance 
    AccessRule = new FileSystemAccessRule("Users", Rights, 
           iFlags, 
           PropagationFlags.InheritOnly, 
           AccessControlType.Allow); 
    Result = false; 
    Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result); 

    if (!Result) 
     return false; 

    Info.SetAccessControl(Security); 

    return true; 
} 
+0

Gracias, David. Sin embargo, todavía no hubo suerte. ¿Mi uso del grupo "Usuarios" es correcto para este propósito? Intenté ejecutar el exe como administrador y aún parece que no ocurre nada cuando reviso Windows y compruebo los permisos en la carpeta. –

+2

Acercamiento. Al cambiar "usuarios" a "Todos" ahora se agregó el grupo "Todos" a la carpeta, pero los permisos aparecen en blanco; nada concedido –

+0

El código funciona bien para mí incluso con '" Usuarios "'. Dicho esto, creo que el nombre completo es '@" BUILTIN \ Users "' pero funciona de cualquier manera. –

5

David Heffernan respuesta no funciona en una máquina que no Inglés, donde tratando de establecer los permisos en "Usuarios" falla con una excepción IdentityNotMapped . El siguiente código trabajará en todas partes, mediante el uso de WellKnownSidType.BuiltinUsersSid lugar:

static void SetFullControlPermissionsToEveryone(string path) 
{ 
    const FileSystemRights rights = FileSystemRights.FullControl; 

    var allUsers = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); 

    // Add Access Rule to the actual directory itself 
    var accessRule = new FileSystemAccessRule(
     allUsers, 
     rights, 
     InheritanceFlags.None, 
     PropagationFlags.NoPropagateInherit, 
     AccessControlType.Allow); 

    var info = new DirectoryInfo(path); 
    var security = info.GetAccessControl(AccessControlSections.Access); 

    bool result; 
    security.ModifyAccessRule(AccessControlModification.Set, accessRule, out result); 

    if (!result) 
    { 
     throw new InvalidOperationException("Failed to give full-control permission to all users for path " + path); 
    } 

    // add inheritance 
    var inheritedAccessRule = new FileSystemAccessRule(
     allUsers, 
     rights, 
     InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
     PropagationFlags.InheritOnly, 
     AccessControlType.Allow); 

    bool inheritedResult; 
    security.ModifyAccessRule(AccessControlModification.Add, inheritedAccessRule, out inheritedResult); 

    if (!inheritedResult) 
    { 
     throw new InvalidOperationException("Failed to give full-control permission inheritance to all users for " + path); 
    } 

    info.SetAccessControl(security); 
} 
+1

Muchas gracias, me salvaste mucho dolor. –

Cuestiones relacionadas