79 votes

Ajouter "tout le monde" privilège de dossier à l'aide de C#.NET

J'ai utilisé le code ci-dessous pour permettre à Tous l'accès à un dossier:

System.Security.AccessControl.DirectorySecurity sec =
    System.IO.Directory.GetAccessControl(directory, AccessControlSections.All);
FileSystemAccessRule accRule = new FileSystemAccessRule("Everyone",
                                       FileSystemRights.Modify,
                                       AccessControlType.Allow);
sec.AddAccessRule(accRule);    // setACL
sec.ResetAccessRule(accRule);

Maintenant, tout le monde l'utilisateur est ajouté au dossier, mais pas avec les droits attribués. Tous les lire, écrire, exécuter, etc. les cases ne sont pas cochées.

145voto

Yoshi Points 1023

La première chose que je veux vous dire comment j'ai trouvé cette solution. C'est sans doute plus importante que la réponse parce que les autorisations de fichier sont difficiles à obtenir correct.

La première chose que j'ai faite a été de définir les autorisations que je voulais en utilisant les boîtes de dialogue Windows et cases à cocher. J'ai ajouté une règle pour "tout le monde" et coché toutes les cases sauf "Contrôle total".

Ensuite, j'ai écrit ce code C# pour me dire exactement ce que les paramètres j'ai besoin de dupliquer les paramètres de Windows:

string path = @"C:\Users\you\Desktop\perms"; // path to directory whose settings you have already correctly configured
DirectorySecurity sec = Directory.GetAccessControl(path);
foreach (FileSystemAccessRule acr in sec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) {
    Console.WriteLine("{0} | {1} | {2} | {3} | {4}", acr.IdentityReference.Value, acr.FileSystemRights, acr.InheritanceFlags, acr.PropagationFlags, acr.AccessControlType);
}

Cela m'a donné de cette ligne de production:

Everyone | Modify, Synchronize | ContainerInherit, ObjectInherit | None | Allow

Donc la solution est simple (encore dur pour obtenir le droit si vous ne savez pas quoi regarder!):

DirectorySecurity sec = Directory.GetAccessControl(path);
// Using this instead of the "Everyone" string means we work on non-English systems.
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
sec.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
Directory.SetAccessControl(path, sec);

Cela rendra les cases à cocher dans la boîte de dialogue sécurité de Windows correspondre à ce que vous avez déjà défini votre répertoire de test.

4voto

xorcrud Points 300

utiliser FileSystemRights.FullControl au lieu de FileSystemRights.Modify si vous souhaitez autoriser tous les actes (ACL).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X