IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] : Tester les droits d'accès d'un répertoire


Sujet :

C#

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 175
    Points : 166
    Points
    166
    Par défaut [C#] : Tester les droits d'accès d'un répertoire
    Bonjour,

    je souhaiterais tester les droits d'accès et d'écriture dans un répertoire.
    Je n'y parviens pas. Pouvez-vous m'aider ?

    Dans mes tentatives j'ai essayé d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DirectorySecurity dSecurity = new DirectoryInfo("myPath").GetAccessControl()
    mais je ne sais pas quoi faire après.

    Merci et bonne journée.

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut.

    Il faut que tu ai le nom du compte utilisateur dont tu veux tester les droits

  3. #3
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Et pour récupérer le compte Utilisateur de la session courante :

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par Goldar
    Et pour récupérer le compte Utilisateur de la session courante :
    ça suffit pas. Avec ça tu récuperes le nom de l'utilisateur, pas le GUID du compte ...

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Retraité passionné
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité passionné

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Je tombe par hasard sur cette discussion. Voici comment je m'y suis pris, sachant que je trouve cette méthode un peu lourde et que je ne sois pas certains qu'elle couvre tous les cas. Je la soumet pour critiques bienvenues.

    droit mini peut être initialisé comme cet exemple :
    FileSystemRights droitMini= FileSystemRights.Read|FileSystemRights.ListDirectory))

    public static bool IsAutorise(string fullName, FileSystemRights droitMini)
    {//si ma session ou tout le monde ou Builtin(par défaut) a toutes les autorisations demandées accordé passe à true
    //mais si l'un deux refuse explicitement une des autorisations, nonrefusé passe à false
    //il faut que accorde et non refusé soit à true pour que l'autorisation soit accordée.
    bool accorde=false, nonrefuse=true;
    try
    {
    FileSystemSecurity accessControlList=File.GetAccessControl(fullName);
    AuthorizationRuleCollection rules=accessControlList.GetAccessRules(true, true, typeof(NTAccount));
    foreach (FileSystemAccessRule rule in rules)
    {//vérifier que moi-même, tout le monde ou le groupe utilisateurs a accès au contenu de ce dossier
    if (rule.IdentityReference.Value.Equals(ParamSession.account, StringComparison.CurrentCultureIgnoreCase)||
    rule.IdentityReference.Value.Equals("BUILTIN\\Utilisateurs", StringComparison.CurrentCultureIgnoreCase)||
    rule.IdentityReference.Value.Equals("Tout le monde", StringComparison.CurrentCultureIgnoreCase)
    )
    {
    if (rule.AccessControlType==AccessControlType.Allow&&rule.FileSystemRights.HasFlag(droitMini)) { accorde=true; } //dispose des permissions demandées
    if (rule.AccessControlType==AccessControlType.Deny&&rule.FileSystemRights.HasFlag(droitMini)) { nonrefuse=false; } //permissions demandées refusées
    }
    }
    if (accorde&&nonrefuse) { return true; } { return false; }
    }
    catch (UnauthorizedAccessException) { return false; }//interdiction totale y compris le regard sur les droits d'accès
    }

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Retraité passionné
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité passionné

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Beaucoup mieux
    Après quelques galères, voici un code mieux adapté.

    //appel de la méthode
    if (!IsAutorise(fullname, FileSystemRights.Read|FileSystemRights.ListDirectory))

    //récupération de mon compte utilisateur actuel
    System.Security.Principal.WindowsIdentity principal=System.Security.Principal.WindowsIdentity.GetCurrent();




    public static bool IsAutorise(string fullName, FileSystemRights droitMini)
    {//si moi-même ou un groupe auquel j'appartiens a les autoriastions demandées sans qu'elles soient explicitement refusées c'est OK
    //il suffit que n'importe quel groupe auquel j'appartiens refuse une des autorisation demandées pour que le droit soit refusé
    //il faut que accorde et non refusé soit à true pour que l'autorisation soit accordée
    bool accorde=false, nonrefuse=true;
    try
    { //extraire les droits ou refus explicitement donnés pour moi-même en extrayant non pas mon WindowsIdentity.Name (PCTOTO\MACHIN), mais WindowsIdentity.User (S-1-5-21-1824....)
    FileSystemSecurity accessControlList=File.GetAccessControl(fullName);
    AuthorizationRuleCollection rules=accessControlList.GetAccessRules(true, true, typeof(SecurityIdentifier));//typeof S-1-5-21-1824....
    //examen des droits d'accès explicitement donnés à moi-même
    foreach (FileSystemAccessRule rule in rules)
    {
    if (rule.IdentityReference.Value.Equals(ParamSession.principal.User.Value, StringComparison.CurrentCultureIgnoreCase))
    {//j'ai des autoriastions ou refus explicitement donnés
    if (rule.AccessControlType==AccessControlType.Allow&&rule.FileSystemRights.HasFlag(droitMini)) { accorde=true; } //dispose des permissions demandées
    if (rule.AccessControlType==AccessControlType.Deny&&rule.FileSystemRights.HasFlag(droitMini)) { nonrefuse=false; } //permissions demandées refusées
    }
    }
    //exament des groupes auxquels j'appartiens
    foreach (IdentityReference groupe in ParamSession.principal.Groups)
    {
    foreach (FileSystemAccessRule rule in rules)
    {
    if (groupe.Equals(rule.IdentityReference))
    {
    if (rule.AccessControlType==AccessControlType.Allow&&rule.FileSystemRights.HasFlag(droitMini)) { accorde=true; } //dispose des permissions demandées
    if (rule.AccessControlType==AccessControlType.Deny&&rule.FileSystemRights.HasFlag(droitMini)) { nonrefuse=false; } //permissions demandées refusées
    }
    }
    }
    if (accorde&&nonrefuse) { return true; } { return false; }
    }
    catch (UnauthorizedAccessException) { return false; }//interdiction totale y compris le regard sur les droits d'accès
    }

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Retraité passionné
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité passionné

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 7
    Points
    7
    Par défaut je n'ai pas été très bon sur les deux messages précédents
    Alors oubiez-les et excusez un débutant sur ce forum
    Le code suivant fontionne bien pour le logiciel dont j'avais besoin, mais soyez critiques et adaptez à vos situations.

    moiMeme doit être accessible à la métohode appelée. Dans mon cas, moiMeme est dans un classe renfermant les paramètres principaux du logiciel.
    fullname a été initialisé avec le nom du fichier ou dossier obtenu par un
    Directory.GetFileSystemEntries

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    //récupération de mon compte utilisateur actuel
    System.Security.Principal.WindowsIdentity moiMeme=System.Security.Principal.WindowsIdentity.GetCurrent();
     
     //appel de la méthode 
    if (!IsAutorise(fullname, FileSystemRights.Read|FileSystemRights.ListDirectory))
     
    public static bool IsAutorise(string fullName, FileSystemRights droitMini)
        {//si moi-même ou un groupe auquel j'appartiens a les autoriastions demandées sans qu'elles soient explicitement refusées c'est OK
          //mais si l'un deux refuse explicitement une des autorisations c'est refusé
     
          bool accorde=false;
          try
          { //extraire les droits ou refus explicitement donnés pour moi-même en extrayant par WindowsIdentity.User (S-1-5-21-1824....) et non par WindowsIdentity.Name (PCTOTO\MACHIN)
            FileSystemSecurity accessControlList=File.GetAccessControl(fullName);
            AuthorizationRuleCollection rules=accessControlList.GetAccessRules(true, true, typeof(SecurityIdentifier));//typeof S-1-5-21-1824....
            //examen des droits d'accès explicitement donnés à moi-même
            foreach (FileSystemAccessRule rule in rules)
            {
              if (rule.IdentityReference.Value.Equals(moiMeme.User.Value, StringComparison.CurrentCultureIgnoreCase))
              {//j'ai des autoriastions ou refus explicitement donnés
                if (rule.AccessControlType==AccessControlType.Allow&&rule.FileSystemRights.HasFlag(droitMini)) { accorde=true; } //dispose des permissions demandées
                if (rule.AccessControlType==AccessControlType.Deny&&rule.FileSystemRights.HasFlag(droitMini)) { return false; } //permissions demandées refusées
              }
            }
            //exament des groupes auxquels j'appartiens
            foreach (IdentityReference groupe in ParamSession.principal.Groups)
            {
              foreach (FileSystemAccessRule rule in rules)
              {
                if (groupe.Equals(rule.IdentityReference))
                {
                  if (rule.AccessControlType==AccessControlType.Allow&&rule.FileSystemRights.HasFlag(droitMini)) { accorde=true; } //dispose des permissions demandées
                  if (rule.AccessControlType==AccessControlType.Deny&&rule.FileSystemRights.HasFlag(droitMini)) { return false; } //permissions demandées refusées
                }
              }
            }
            return accorde;
          }
          catch (UnauthorizedAccessException) { return false; }//interdiction totale y compris le regard sur les droits d'accès
        }

Discussions similaires

  1. [AC-2010] Tester les droits d'accès à un dossier
    Par Daejung dans le forum VBA Access
    Réponses: 7
    Dernier message: 08/02/2014, 15h58
  2. Réponses: 1
    Dernier message: 13/11/2011, 23h24
  3. Tester les droits en écriture sur une table en VBA ?
    Par yerome60 dans le forum Access
    Réponses: 2
    Dernier message: 19/12/2005, 21h43
  4. [APACHE] Modifié les droits d'accès à un dossier.
    Par will-scs dans le forum Apache
    Réponses: 1
    Dernier message: 26/08/2005, 22h12
  5. [JUnit] Pour tester les methodes d'acces à une sgdb
    Par yanis97 dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 15/04/2004, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo