web-dev-qa-db-fra.com

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

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.

69
Suresh Chaudhary

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.

119
Yoshi

Le code ci-dessous vérifie l'existence du dossier, s'il n'est pas créé, en crée un. Et puis définit chaque autorisation utilisateur de ce dossier avec une autorisation complète (lecture et écriture).

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);

            }
12

utilisation FileSystemRights.FullControl au lieu de FileSystemRights.Modify si vous souhaitez autoriser toutes les actions (ACL).

5
Simon Smeets