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.