none
Gestion des droits en c#.net RRS feed

  • Question

  • Bonjour,

    Après plusieurs jours de galère intense, je m'en remet a vous pour trouver une solution à mon problème.

    En fait je suis entrain de développer une application c# permettant de gérer les droits utilisateur sur dossier.

    Le problème viens du fait que je n'ai pas trouvé de moyen afin d'afficher les droits de l'onglet sécurité et non les droits avancés du dossier. 
    Il en est de même pour la modification.

    J'ai trouvé une solution de remplacement en éxecutant xcacls.vbs dans mon programme mais je ne vois pas pourquoi c# ne permettrait pas de faire la même chose.

     

    Merci d'avance pour vos réponses.

     

    Cordialement

    mardi 21 septembre 2010 06:21

Réponses

  • Bonjour,

    Je ne vois pas dans votre code l'endroit où vous changez les droits de votre répertoire. Voici un code qui permet de définir des droits qui puet-être propagé dans les fichiers / répertoires enfants afin qu'il ne soit pas considéré comme des droits "spéciaux" au niveau de Windows :

    DirectorySecurity dirSec = Directory.GetAccessControl(@"<répertoire>");
          
    FileSystemAccessRule fsar;
    FileSystemRights rights;
    
    rights = FileSystemRights.Read;
    
    fsar = new FileSystemAccessRule("<utilisateur>", rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
    
    dirSec.AddAccessRule(fsar);
    
    Directory.SetAccessControl(@"<répertoire>", dirSec);
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 12:36
    Modérateur
  • Bonjour,

    Pour votre première question :

    AuthorizationRuleCollection autorisations;
    DirectorySecurity dirSec;
          
    dirSec = Directory.GetAccessControl(@"<Votre répertoire>");
    autorisations = dirSec.GetAccessRules(true, true, typeof(NTAccount));
    
    foreach (FileSystemAccessRule fsar in autorisations.OfType<FileSystemAccessRule>())
    {
      Console.WriteLine("Utilisateur : {0}", fsar.IdentityReference.Value);
    
      if ((fsar.FileSystemRights & FileSystemRights.ReadAndExecute) == FileSystemRights.ReadAndExecute)
      {
        // Alors l'utilisateur a le ReadAndExecute
        Console.WriteLine("  L'utilisateur peut ReadAndExecute");
      }
    
      if ((fsar.FileSystemRights & FileSystemRights.ListDirectory) == FileSystemRights.ListDirectory)
      {
        // Alors l'utilisateur a le droit de lire
        Console.WriteLine("  L'utilisateur peut ListDirectory");
      }
    }
    

    Pour la deuxième question, il faudra déboguer, car le code doit fonctionner à moins que l'utilisateur soit incorrect. Pour ne pas tenir compte de la casse, changez la condition dans le Where() :

    Where(fs => string.Compare(fs.IdentityReference.Value, "domaine\\user", true) == 0)
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 22 septembre 2010 08:20
    Modérateur
  • Bonjour,

    Vous pouvez faire un test sur un ensemble de droits comme ceci :

    FileSystemRights ensemble;
    
    ensemble = FileSystemRights.Read | FileSystemRights.Write;
    
    if ((fsar.FileSystemRights & ensemble) == ensemble)
    {
      // Alors l'utilisateur a le ReadAndExecute
      Console.WriteLine("  L'utilisateur peut Read et Write");
    }
    

    Pour tester Affichage du contenu du dossier, vous devez tester cet ensemble de droit :

    FileSystemRights.ReadData | FileSystemRights.ReadExtendedAttributes | FileSystemRights.ExecuteFile | FileSystemRights.ReadAttributes | FileSystemRights.ReadPermissions
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 22 septembre 2010 08:34
    Modérateur
  • Bonjour,

    AuthorizationRuleCollection autorisations;
    DirectorySecurity dirSec;
    FileSystemAccessRule fsar;
    
    dirSec = Directory.GetAccessControl(@"< répertoire >");
    
    autorisations = dirSec.GetAccessRules(true, true, typeof(NTAccount));
    
    // Suppression de l'ancien droit de l'utilisateur
    fsar = autorisations.OfType<FileSystemAccessRule>().Where(fs => fs.IdentityReference.Value == "< compte utilisateur >").SingleOrDefault();
    dirSec.RemoveAccessRule(fsar);
    
    // Création d'un nouveau droit
    fsar = new FileSystemAccessRule("< compte utilisateur >", FileSystemRights.Write, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)
    dirSec.AddAccessRule(fsar);
    
    Directory.SetAccessControl(@"< répertoire >", dirSec);
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse Fredou2611 mercredi 22 septembre 2010 09:23
    mercredi 22 septembre 2010 09:16
    Modérateur

Toutes les réponses

  • Bonjour,

    Pour changer/récupérer les droits sur un fichier/dossier, utilisez la classe FileSecurity (http://msdn.microsoft.com/fr-fr/library/system.security.accesscontrol.filesecurity.aspx)

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 07:21
    Modérateur
  • Bonjour,

     

    Merci de votre réponse.

    En fait j'utilise la classe DirectorySecurity puisque je veux appliquer mes modifications sur des dossiers.

     

     

     

                    AuthorizationRuleCollection rules;
    
                    DirectorySecurity dirSec = Directory.GetAccessControl(dir);
    
                    rules = dirSec.GetAccessRules(true, true, typeof(NTAccount));
    

    Est ce que cela fonctionnera avec FileSecurity ?

     

    mardi 21 septembre 2010 07:29
  • Bonjour,

    Autant pour moi.... DirectorySecurity permet de changer/récupérer les droits sur un dossier et non d'un fichier. Utilisez FileSecurity pour un fichier particulier.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 07:42
    Modérateur
  • Pas de problème ^^

    C'est justement dans l'utilisation de DirectorySecurity que j'ai un problème.

    En fait j'aimerai interagir avec ça :

    http://yfrog.com/jy74150935j


    Et non ça:

    http://yfrog.com/jy72039752j

    Une idée ?

    Cdlt

     

    mardi 21 septembre 2010 08:03
  • Bonjour,

    D'un point de vue Windows, la première capture d'écran n'est qu'une vue simplifié de la seconde capture d'écran...

    "En fait j'aimerai interagir avec ça"
    Que voulez vous faire exactement ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 08:09
    Modérateur
  • Bonjour,

    Oui je conscient de cela.

    En fait j'aimerais simplement administrer les droits d'user sur certains dossiers sans que la modification ne passe en autorisation spéciale dans la "fenêtre simplifié".

    Je veux que lorsque je modifie les droits, ceci s'applique directement dans l'onglet sécurité et non dans paramètres avancés.

    J’espère avoir été assez claire :s

    Cordialement :)

     

    mardi 21 septembre 2010 08:12
  • Je vais tenter d'être plus claire:


    Lorsque j'utilise DirectorySecurity, pour modifier les droits, cette classe coche la case "Autorisations Spéciales" de l'onglet sécurité du dossier en question , et uniquement celle-là.

    Il crée des autorisation dans la fenêtre Paramètres Avancés (screen 2)


    Lorsque je tente d'afficher les droits sur un dossier, DirectorySecurity ne fait pas la différence entre ListDirecory et ReadandExecute.

    En gros j'aimerais pouvoir modifier le contenu de l'onglet sécurité des propriétés d'un dossier comme si je le faisait à la main en cliquant sur les cases a coché puis appliquer et ok. (screen 1)

    J'espère que c'est mieux ^^ 

    Cdlt


    mardi 21 septembre 2010 09:14
  • Bonjour,

    C'est beaucoup plus clair ! Pouvez-vous me montrer le code qui pose problème ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 09:37
    Modérateur
  • Le voici : 

     

    	AuthorizationRuleCollection rules;
        DirectorySecurity dirSec = Directory.GetAccessControl(dir);
        rules = dirSec.GetAccessRules(true, true, typeof(NTAccount));
    
        foreach (FileSystemAccessRule rule in rules)
        {
           
         if (rule.IdentityReference.Value.Contains(TB_log.Text) == true)
         {
          uc = new UC_resu(dir, rule.FileSystemRights.ToString(), rule.IdentityReference.Value.ToString());
          LB_res.Items.Add(uc);
          Save_res(dir, rule.FileSystemRights.ToString(), rule.IdentityReference.Value.ToString());
         }
        }
    
    UC_resu étant une listbox personnalisée.

     

    mardi 21 septembre 2010 09:42
  • Bonjour,

    Je ne vois pas dans votre code l'endroit où vous changez les droits de votre répertoire. Voici un code qui permet de définir des droits qui puet-être propagé dans les fichiers / répertoires enfants afin qu'il ne soit pas considéré comme des droits "spéciaux" au niveau de Windows :

    DirectorySecurity dirSec = Directory.GetAccessControl(@"<répertoire>");
          
    FileSystemAccessRule fsar;
    FileSystemRights rights;
    
    rights = FileSystemRights.Read;
    
    fsar = new FileSystemAccessRule("<utilisateur>", rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
    
    dirSec.AddAccessRule(fsar);
    
    Directory.SetAccessControl(@"<répertoire>", dirSec);
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 12:36
    Modérateur
  • Merci pour ce code.

    Le code que j'ai copié le code qui permet de lire les droits dans un premier temps je pensais que ça serais le plus facile pour commencer.

    En ce qui concerne la modification, j'ai utiliser une méthode de remplacement en attendant de trouver mieux donc je test ce bout de code et je vous tiens au courant :)

     

    Cordialement

    mardi 21 septembre 2010 12:40
  • Je viens de tester le code et Windows le prend bien comme autorisation spéciale.

    Une autre idée ?

    mardi 21 septembre 2010 12:44
  • Bonjour,

    L'avez vous testé sur une application Console vide ? Sur un répertoire ne contenant pas le compte utilisateur spécifié ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 12:48
    Modérateur
  • Autant pour moi cela fonctionne parfaitement mais seulement avec certainement propriétés. Par exemple ListDirectory passe en autorisation spéciale...

    Auriez vous une liste des propriétés qui ne me poserais pas ce problème ?

     

    Cordialement

    mardi 21 septembre 2010 12:58
  • Bonjour,

    Alors pour :

    Lecture : FileSystemRights.Read
    Ecriture : FileSystemRights.Write
    Modification : FileSystemRights.Modify
    Lecture & Execution : FileSystemRights.ReadAndExecute

    Affichage du contenu du dossier : FileSystemRights.ReadData | FileSystemRights.ReadExtendedAttributes | FileSystemRights.ExecuteFile | FileSystemRights.ReadAttributes | FileSystemRights.ReadPermissions
    Il faut définir la propagation des droits uniquement sur : InheritanceFlags.ContainerInherit

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 13:24
    Modérateur
  • Ok ça fonctionne a merveille !
    Deux dernières petites question:

    - Est ce vous pourriez m'éxpliquer pas à pas la commande que vous m'avez donné ? (oui je sais j'en demande beaucoup mais j'aimerai vraiment tout comprendre)

    - Comment je fait pour récupérer ces valeurs ?

     

    Merci d'avance

    Cordialement

    mardi 21 septembre 2010 13:29
  • Bonjour,

    Dans le code que je vous ai fournit plus haut, changez la valeur de la ligne suivant le type de droit que vous voulez spécifier :

    rights = ...;
    
    

    Les FileSystemRights peuvent être récupérée par le code suivant (pour le Read par exemple) :

    AuthorizationRuleCollection autorisations;
    DirectorySecurity dirSec;
    FileSystemAccessRule fsar;
    
    dirSec = Directory.GetAccessControl(@"< répertoire >");
    
    autorisations = dirSec.GetAccessRules(true, true, typeof(NTAccount));
    
    fsar = autorisations.OfType<FileSystemAccessRule>().Where(fs => fs.IdentityReference.Value == "< Compte Windows >").SingleOrDefault();
    
    if ((fsar.FileSystemRights & FileSystemRights.Read) == FileSystemRights.Read)
    {
      // Alors l'utilisateur a le droit de lire
    }
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 13:46
    Modérateur
  • Oui oui j'ai bien compris ce qu'il fallait modifier c'est juste que je comprend pas bien :

    ", InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);"

    Je test le code et reboucle ici par la suite :)

    Merci en tout cas

     

    Cordialement

    mardi 21 septembre 2010 13:50
  • Bonjour,

    InheritanceFlags indique si les sous dossiers et les fichiers doivent hériter des droits.
    PropagationFlags indique si il faut récupérer les droits du répertoire parents.
    AccessControlType indique si le droit que vous définissez (Read par exemple) est autorisé ou refusé.

    Est-ce que cela rajoute un peu du pétrole à votre lanterne ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 13:55
    Modérateur
  • Oui oui c'est bon c'est devenue parfaitement clair !

    Je viens de tester le code pour lire et l'appli plante a cette ligne:

    fsar = autorisations.OfType<FileSystemAccessRule>().Where(fs => fs.IdentityReference.Value == "USER").SingleOrDefault();

    fsar reste NULL ...

     

    Merci encore.

     

    Cordialement

    mardi 21 septembre 2010 13:59
  • Bonjour,

    Le compte utilisateur doit être de ce format : "DOMAINE\Utilisateur".

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 14:05
    Modérateur
  • Oui c'est bien ce que je fait.

    Voilà je message d'erreur:

    "Object reference not set to an instance of an object."

    mardi 21 septembre 2010 14:08
  • Bonjour,

    Pour être sur, affichez les différents comptes et vérifiez que le compte que vous recherchez est existant (attention à la casse !) :

    foreach(FileSystemAccessRule fsar in fsar = autorisations.OfType<FileSystemAccessRule>())
    {
      Debug.WriteLine(fsar.Value);
    }
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 14:13
    Modérateur
  • Il n'aime pas la ligne : FileSystemAccessRule fsar in fsar = autorisations.OfType<FileSystemAccessRule>()

     

    L'utilisateur que je recherche existe bien et je respecte bien la casse.

    Cordialement

    mardi 21 septembre 2010 14:17
  • Bonjour,

    Oups, copier/coller désolé !

    foreach(FileSystemAccessRule fsar in autorisations.OfType<FileSystemAccessRule>())
    {
     Debug.WriteLine(fsar.Value);
    }
    
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 14:19
    Modérateur
  • Pas de soucis ^^

    Il y a encore une erreur. Ce n'est pas debug mais Console et fsar.value n'éxiste pas.

    J'ai bidouiller pour avoir fsar.tostring() et la console m'affiche bien deux ligne qui on l'air de correspondre au droit de mon dossier (j'ai mis uniquement 2 user dessus)

     

    Codialement

    mardi 21 septembre 2010 14:23
  • Bonjour,

    Essayez ceci :

    Console.WriteLine(fsar.IdentityReference.Value);
    
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 14:32
    Modérateur
  • Bonsoir !

    Désolé de répondre que maintenant j'ai eu du trajet a faire pour rentrer du travail :s

    J'ai pu faire les tests avec ce code:

     

                AuthorizationRuleCollection autorisations;

                DirectorySecurity dirSec;

                //FileSystemAccessRule fsar;

                dirSec = Directory.GetAccessControl(@"c:\AMD");

                autorisations = dirSec.GetAccessRules(true, true, typeof(NTAccount));

                //fsar = autorisations.OfType<FileSystemAccessRule>().Where(fs => fs.IdentityReference.Value == "BUILTIN\\Fredou").SingleOrDefault();

                foreach (FileSystemAccessRule fsar in autorisations.OfType<FileSystemAccessRule>())

                {

                   Console.WriteLine(fsar.IdentityReference.Value);

                   Console.WriteLine(fsar.FileSystemRights.ToString());

                   Console.WriteLine("\n");

                }

     

     

    et j'obtient en console ce genre de choses :

    BUILTIN\USER
    FullControl

    BUILTIN\USER2
    FullControl

    Est-ce le résultat es conté avec la commande que vous m'aviez donné au début ?

     

    Cordialement

     

    Edit:

    Je viens de tester avec la propriété Affichage du contenu du dossier pour un utilisateur et j’obtiens: "ReadandExecute, Syncronyse

    mardi 21 septembre 2010 16:44
  • Bonjour,

    Donc dans cette ligne là :

    fsar = autorisations.OfType<FileSystemAccessRule>().Where(fs => fs.IdentityReference.Value == "BUILTIN\\Fredou").SingleOrDefault();
    

    Remplacez "BUILTIN\\Fredou" par "BUILTIN\USER" ou "BUILTIN\USER2" en respectant la casse !

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 21 septembre 2010 20:33
    Modérateur
  • Bonjour !

    C'est bon le script fonctionne !
    Par contre, serait-il possible d'avoir un cas général du genre: dossier c:\test USER droit?

    D'autre part, pour la modification serai-t-il possible de rétrograder les droits d'un user ? Par exemple rétrograder de FullControl a Write ?

     

    Cordialement

    mercredi 22 septembre 2010 07:03
  • Bonjour,

    Par contre, serait-il possible d'avoir un cas général du genre: dossier c:\test USER droit?
    C'est à dire ?

    D'autre part, pour la modification serai-t-il possible de rétrograder les droits d'un user ? Par exemple rétrograder de FullControl a Write ?
    Oui, il suffit de supprimer le FileSystemAccessRule dans DirectorySecurity, ensuite il faut recréer un nouveau FileSystemAccessRule et l'ajouter dans le DirectorySecurity.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 22 septembre 2010 07:17
    Modérateur
  • Bonjour,

     

    Pour ma demande, en fait j'aimerais obtenir tout les utilisateurs et leurs droits sur un dossier.

    Par exemple pour c:\test je veux la liste des user qui ont des droits sur se dossier avec leur droits (peu importe les droits) avec une différenciation en ReadandExecute et ListDirectory.

     

    Merci encore

    Cordialement

    • Modifié Fredou2611 mercredi 22 septembre 2010 08:02
    mercredi 22 septembre 2010 07:30
  • Bonjour,

    Pour votre première question :

    AuthorizationRuleCollection autorisations;
    DirectorySecurity dirSec;
          
    dirSec = Directory.GetAccessControl(@"<Votre répertoire>");
    autorisations = dirSec.GetAccessRules(true, true, typeof(NTAccount));
    
    foreach (FileSystemAccessRule fsar in autorisations.OfType<FileSystemAccessRule>())
    {
      Console.WriteLine("Utilisateur : {0}", fsar.IdentityReference.Value);
    
      if ((fsar.FileSystemRights & FileSystemRights.ReadAndExecute) == FileSystemRights.ReadAndExecute)
      {
        // Alors l'utilisateur a le ReadAndExecute
        Console.WriteLine("  L'utilisateur peut ReadAndExecute");
      }
    
      if ((fsar.FileSystemRights & FileSystemRights.ListDirectory) == FileSystemRights.ListDirectory)
      {
        // Alors l'utilisateur a le droit de lire
        Console.WriteLine("  L'utilisateur peut ListDirectory");
      }
    }
    

    Pour la deuxième question, il faudra déboguer, car le code doit fonctionner à moins que l'utilisateur soit incorrect. Pour ne pas tenir compte de la casse, changez la condition dans le Where() :

    Where(fs => string.Compare(fs.IdentityReference.Value, "domaine\\user", true) == 0)
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 22 septembre 2010 08:20
    Modérateur
  • Bonjour,

    Ok ça fonctionne ! C'était bien un problème de casse et il fallait écrire DOMAINE\\user.

    Je suis obligé de faire un test pour chaque droit ? 

    C'est pas possible de récupérer tout sans faire de tests pour chaque droits ?

    Le code ne fonctionne pas correctement ^^ En fait j'ai un user avec Affichage du contenu du dossier et il me met ReadAndExecute et ListDirectory donc pas bon ...

    Cordialement

    mercredi 22 septembre 2010 08:28
  • Bonjour,

    Vous pouvez faire un test sur un ensemble de droits comme ceci :

    FileSystemRights ensemble;
    
    ensemble = FileSystemRights.Read | FileSystemRights.Write;
    
    if ((fsar.FileSystemRights & ensemble) == ensemble)
    {
      // Alors l'utilisateur a le ReadAndExecute
      Console.WriteLine("  L'utilisateur peut Read et Write");
    }
    

    Pour tester Affichage du contenu du dossier, vous devez tester cet ensemble de droit :

    FileSystemRights.ReadData | FileSystemRights.ReadExtendedAttributes | FileSystemRights.ExecuteFile | FileSystemRights.ReadAttributes | FileSystemRights.ReadPermissions
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 22 septembre 2010 08:34
    Modérateur
  • Ok merci beaucoup !

    Comment je peux savoir ce qu'il faut tester pour chaque droit ?

    Cordialement 

    mercredi 22 septembre 2010 08:37
  • Bonjour,

    Alors pour :

    Lecture : FileSystemRights.Read
    Ecriture : FileSystemRights.Write
    Modification : FileSystemRights.Modify
    Lecture & Execution : FileSystemRights.ReadAndExecute

    Affichage du contenu du dossier : FileSystemRights.ReadData | FileSystemRights.ReadExtendedAttributes | FileSystemRights.ExecuteFile | FileSystemRights.ReadAttributes | FileSystemRights.ReadPermissions
    Il faut définir la propagation des droits uniquement sur : InheritanceFlags.ContainerInherit

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr


    Bonjour,

    Se référer à mon post d'hier.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 22 septembre 2010 08:40
    Modérateur
  • Ok c'est super alors ^^

    Je vais mettre tout ça en application sur mon code dès maintenant.

    En tout cas merci beaucoup d'avoir pris autant de temps pour répondre à mes questions.

    Grâce à vous j'ai compris les mécanismes des droits Windows.

    Je reposterais ici si jamais je n'arrive pas à mettre toute ces connaissances en application ^^

    Merci encore !

     

    Cordialement

    • Marqué comme réponse Fredou2611 mercredi 22 septembre 2010 08:45
    • Non marqué comme réponse Fredou2611 mercredi 22 septembre 2010 08:45
    mercredi 22 septembre 2010 08:45
  • Juste une dernière question ^^

    Je n'arrive pas mettre en oeuvre la rétrogradation...

    Pouvez vous me donné un bout de code ?

     

    Cordialement

    mercredi 22 septembre 2010 08:47
  • Bonjour,

    AuthorizationRuleCollection autorisations;
    DirectorySecurity dirSec;
    FileSystemAccessRule fsar;
    
    dirSec = Directory.GetAccessControl(@"< répertoire >");
    
    autorisations = dirSec.GetAccessRules(true, true, typeof(NTAccount));
    
    // Suppression de l'ancien droit de l'utilisateur
    fsar = autorisations.OfType<FileSystemAccessRule>().Where(fs => fs.IdentityReference.Value == "< compte utilisateur >").SingleOrDefault();
    dirSec.RemoveAccessRule(fsar);
    
    // Création d'un nouveau droit
    fsar = new FileSystemAccessRule("< compte utilisateur >", FileSystemRights.Write, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)
    dirSec.AddAccessRule(fsar);
    
    Directory.SetAccessControl(@"< répertoire >", dirSec);
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse Fredou2611 mercredi 22 septembre 2010 09:23
    mercredi 22 septembre 2010 09:16
    Modérateur
  • Bonjour,

    Encore une dernière chose.

    Je suis entrain de tester les droits sur un dossier avec ce code: 

    AuthorizationRuleCollection autorisations;
                    DirectorySecurity dirSec;
    dirSec = Directory.GetAccessControl(@"c:\test");
                    autorisations = dirSec.GetAccessRules(true, true, typeof(NTAccount));
                    foreach (FileSystemAccessRule fsar in autorisations.OfType<FileSystemAccessRule>())
                   {
                       switch (fsar.FileSystemRights)
                       {
                            case FileSystemRighst.Read
                                {
                                    MessageBox.Show("Lecture");
                                    break;
                                }
                        }
                    }

     

    Ce code ne fonctionne pas. Si je met l'attribut lecture sur un dossier a un User il ne me le reconnais pas...(Il ne rentre pas dans mon case 1)

    Une idée ?

     

    Cordialement

    mercredi 22 septembre 2010 09:27
  • Bonjour,

    La doc http://msdn.microsoft.com/fr-fr/library/system.security.accesscontrol.filesystemrights.aspx indique que l'attribut FlagsAttribute est positionné c'est-à-dire que cette valeur est une combinaison de bits ce qui permettra donc de positionner chaque bit individuellement et donc de combiner plusieurs valeurs entre elles si nécessaire (pour dire que l'on dispose à la fois d'un droit de lecture et de suppression par exemple).

    Si vous n'êtes pas familier ce ce principe voir Enum.HasFlag nouveau en .NET 4 et qui permet de tester facilement si un bit est positionné (http://msdn.microsoft.com/fr-fr/library/system.enum.hasflag.aspx).

    Au final on testera donc fsar.FileSystemRights.HasFlag(FileSystemRights.Read)

    Le code actuel teste si l'on le droit Read et *uniquement* le droit read. Le code ci-dessus teste si on a le droit Read (en plus éventuellement d'autres droits).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    samedi 23 octobre 2010 18:18
    Modérateur