2012-01-20 13 views
8

Questo dovrebbe essere un problema abbastanza semplice, ma per qualche motivo non riesco a farlo funzionare. Tutto quello che mi piacerebbe fare è impostare le autorizzazioni su una determinata directory per consentire l'accesso completo a tutti gli utenti. Ecco il codice che ho finora:C# - Imposta le autorizzazioni di directory per tutti gli utenti in 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); 

Nessuna eccezione viene lanciata, ma non succede nulla. Quando controllo i permessi della directory dopo che il codice è stato eseguito, non vedo cambiamenti.

Qualche idea?

Grazie in anticipo,
Sonny

+0

Hai provato a eseguire il codice sopra con UAC disabilitato? – rkosegi

+1

@David - Ho provato a eseguire l'exe compilato come amministratore e non fa alcuna differenza per il risultato. –

+0

@rkosegi - Come faccio? È un'impostazione in Visual Studio? –

risposta

25

È inoltre necessario chiamare SetAccessControl per applicare le modifiche.

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

Sembra che gli esempi su MSDN sono gravemente carenti in dettaglio, come discusso here. Ho inciso il codice da questo articolo per ottenere il seguito della quale si comporta bene:

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

Grazie, David. Ancora senza fortuna, però. Il mio uso del gruppo "Utenti" è corretto per questo scopo? Ho provato a eseguire l'exe come amministratore e ancora nulla sembra accadere quando passo attraverso Windows e controllare i permessi sulla cartella. –

+2

Avvicinarsi. La modifica di "utenti" in "Tutti" ora ha aggiunto il gruppo "Tutti" alla cartella, ma le autorizzazioni appaiono vuote; niente concesso. –

+0

Il codice funziona bene anche con '" Users "'. Detto questo, penso che il nome completo sia '@" BUILTIN \ Users "' ma funziona in entrambi i modi. –

5

David Heffernan risposta non funziona su una macchina non inglese, in cui si cerca di impostare le autorizzazioni su "Utenti" fallisce con un'eccezione IdentityNotMapped . Il seguente codice funzionerà ovunque, utilizzando WellKnownSidType.BuiltinUsersSid

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

Grazie mille, mi hai risparmiato un sacco di dolore. –

Problemi correlati