J'ai utilisé le code ci-dessous pour autoriser tout le monde à accéder à 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);
À présent, l'utilisateur Tout le monde est ajouté au dossier, mais sans aucun droit attribué. Toutes les cases à cocher lire, écrire, exécuter, etc. ne sont pas cochées.
La première chose que je veux vous dire, c'est comment j'ai trouvé cette solution. Ceci est probablement plus important que la réponse car les autorisations de fichiers sont difficiles à obtenir correctement.
La première chose que j'ai faite a été de définir les autorisations que je voulais à l'aide des boîtes de dialogue et des cases à cocher Windows. J'ai ajouté une règle pour "Tout le monde" et j'ai coché toutes les cases sauf "Contrôle total".
Ensuite, j'ai écrit ce code C # pour me dire exactement de quels paramètres j'ai besoin pour 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é cette ligne de sortie:
Everyone | Modify, Synchronize | ContainerInherit, ObjectInherit | None | Allow
La solution est donc simple (mais difficile à trouver si vous ne savez pas quoi chercher!):
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);
Ainsi, les cases à cocher de la boîte de dialogue de sécurité Windows correspondent à ce que vous avez déjà défini pour votre répertoire de test.
string file = @"D:\Richi";
private static void GrantAccess(string file)
{
bool exists = System.IO.Directory.Exists(file);
if (!exists)
{
DirectoryInfo di = System.IO.Directory.CreateDirectory(file);
Console.WriteLine("The Folder is created Sucessfully");
}
else
{
Console.WriteLine("The Folder already exists");
}
DirectoryInfo dInfo = new DirectoryInfo(file);
DirectorySecurity dSecurity = dInfo.GetAccessControl();
dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
dInfo.SetAccessControl(dSecurity);
}
utilisation FileSystemRights.FullControl
au lieu de FileSystemRights.Modify
si vous souhaitez autoriser toutes les actions (ACL).