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 :

Développement appli permissions NTFS


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut Développement appli permissions NTFS
    Hello,
    Pour mon stage, je dois développer une petite appli permettant de faire un listing des permissions NTFS des fichiers et répertoires situés sur un serveur.
    Je cherche des méthodes pour récupérer ces droits NTFS.
    Le serveur est sous Windows Server 2003 R2.
    Merci !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par défaut
    La .NET FileInfo te donnera quelques informations...

    Et si tu dois taper plus bas, regarde du coté de http://www.pinvoke.net qui te donne un mappage de toutes les fonctions Windows en .NET

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Avec la méthode FileInfo.GetAccessControl, tu as accès à toutes les permissions concernant un fichier. Mais c'est pas hyper simple à manipuler...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    Ok, FileInfo.GetAccessControl est la méthode adéquate.
    Cela dit pour un débutant en C# et VB.NET je dois faire une API style "Tree Size" (j'ai 3 mois de stage...). J'aimerai savoir si vous avez des tutoriels pour bien commencer dans le but de partir sur de bonne base.
    Merci

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Zhamy Voir le message
    je dois faire une API style "Tree Size"
    C'est à dire ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    Je me suis aidé d'une appli style : mini explorateur Windows :
    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
        * ...
        * private void AddFolders(TreeNode racine, string path)
        * {
        * try
        * {
        * foreach (string subfolder in Directory.GetDirectories(path))
        * {
        * string subfoldername = Path.GetFileName(subfolder);
        * TreeNode ntmp = new TreeNode(subfoldername,0,1);
        * racine.Nodes.Add(ntmp);
        * this.AddFolders(ntmp,subfolder);
        * }
        * }
        * catch{}
        * }
        * ...
    Avec 2 parties : TreeView (arborescence) et ListView (listing).
    La partie TreeView est opérationnel.
    Dans la partie ListView : au lieu d'afficher le contenu et la taille du répertoire j'aimerai qu'il affiche les permissions NTFS associés au dossier sélectionné dans le TreeView.

    Aussi par la suite, je voudrai qu'il affiche les utilisateurs / groupes du répertoire, et le propriétaire actuel de l'élément.
    J'ai vu qu'il existe des méthodes GetFileSecurity, GetKernelObjectSecurity mais j'ai du mal à les implémenter dans l'appli.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Zhamy Voir le message
    Dans la partie ListView : au lieu d'afficher le contenu et la taille du répertoire j'aimerai qu'il affiche les permissions NTFS associés au dossier sélectionné dans le TreeView.
    Ben déjà tu auras du mal à le faire dans une seule ListView, vu la structure des permissions. Il t'en faudra au moins 2 : une pour sélectionner l'utilisateur ou le groupe, et une pour les permissions (regarde l'onglet sécurité dans les propriétés d'un dossier à partir de l'explorateur windows)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    Ok tomlev, donc 3 parties :
    TreeView: choix du répertoire
    ListView1: choix de l'utilisateur / groupe
    ListView2: affichage des droits NTFS associés
    C'est bien cela ?

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    oui

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    D'accord, j'ai fouillé sur le namespace System.Security.Permissions . Mais étant donné mon niveau débutant, je peine à implémenter la bonne classe dans le code.
    Quel classe à utiliser pour afficher les users/group associés au folder ?
    Quel classe à utiliser pour afficher les permissions ?

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu récupères l'objet FileSecurity ou DirectorySecurity avec la méthode GetAccessControl, et tu énumères ses AccessRules.

    Un petit exemple :

    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
    using System.IO;
    using System.Security.AccessControl;
    using System.Security.Principal;
    ...
     
    string path = ...
    Console.WriteLine("Permissions pour {0} :", path);
    DirectorySecurity dirSec = Directory.GetAccessControl(path);
    AuthorizationRuleCollection rules = dirSec.GetAccessRules(true, true, typeof(NTAccount));
    foreach(FileSystemAccessRule rule in rules)
    {
        string groupOrUser = rule.IdentityReference.Value;
        FileSystemRights rights = rule.FileSystemRights;
        string inherited = rule.IsInherited ? " (hérité)" : "";
        string access = rule.AccessControlType == AccessControlType.Allow ? "autorisé" : "refusé";
     
        Console.WriteLine("{0} : {1}{2} : {3}", groupOrUser, rights, inherited, access);
    }
    Ca sort un truc de ce genre :

    Permissions pour D:\tmp :
    CREATEUR PROPRIETAIRE : 268435456 : autorisé
    AUTORITE NT\SYSTEM : FullControl : autorisé
    BUILTIN\Administrateurs : FullControl : autorisé
    BUILTIN\Utilisateurs : CreateFiles : autorisé
    BUILTIN\Utilisateurs : ReadAndExecute, Synchronize : autorisé
    BUILTIN\Utilisateurs : AppendData : autorisé
    S-1-5-21-1776109006-120870478-1116685130-1412 : FullControl : autorisé
    rule.FileSystemRights est une combinaison de flags FileSystemRights (268435456 doit correspondre à une combinaison dont l'un des flags n'est pas défini dans l'énumération)

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    Merci Thomas pour ton aide .
    En console tout est Ok, mais j'ai des erreurs de compilation quand je veux l'afficher dans le ListViewItem.

    La fonction FoldersView_MouseUp() :

    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
    41
    42
    43
    44
     
    private void FoldersView_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    DirectorySecurity dirSec = Directory.GetAccessControl(((TreeView)sender).SelectedNode.FullPath);
    AuthorizationRuleCollection rules = dirSec.GetAccessRules(true, true, typeof(NTAccount));
     
    this.UserView.Items.Clear();
     
    // parcours des sous dossiers
    try
    {
        foreach (string subfolder in Directory.GetDirectories(((TreeView)sender).SelectedNode.FullPath))
            {
            this.UserView.Items.Add(new ListViewItem(Path.GetFileName(subfolder),0));
            }
    }
    catch{}
     
    try
    {
        foreach (string subfolder in Directory.GetDirectories(((TreeView)sender).SelectedNode.FullPath))
        {
            ListViewItem lvi = new ListViewItem(Path.GetFileName(subfolder), 1);
            lvi.SubItems.Add(new FileInfo(subfolder).Length.ToString());
            this.UserView.Items.Add(lvi);
        }
    }
    catch {}
     
     // affiche le nom des utilisateurs / groupes
    try
    {
        foreach (FileSystemAccessRule rule in rules)
        {
            string groupOrUser = rule.IdentityReference.Value;
            FileSystemRights rights = rule.FileSystemRights;
            string inherited = rule.IsInherited ? " (hérité)" : "";
            string access = rule.AccessControlType == AccessControlType.Allow ? "autorisé" : "refusé";
     
            this.UserView.Items.Add(new ListViewItem(Path.GetFileName(subfolder), 1));
        }
    }
    catch { }
    }
    Quelqu'un aurait un exemple d'utilisation de IdentityReference avec un UserView.Items ?
    Merci d'avance.
    PS : merci meziantou, mais malheuresement il n'y a aucune réf sur la classe IdentityReference.Value

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Zhamy Voir le message
    En console tout est Ok, mais j'ai des erreurs de compilation quand je veux l'afficher dans le ListViewItem.
    Quelles erreurs ? à quel endroit ?

    Citation Envoyé par Zhamy Voir le message
    Quelqu'un aurait un exemple d'utilisation de IdentityReference avec un UserView.Items ?
    http://msdn.microsoft.com/fr-fr/libr...reference.aspx
    Le fait que tu l'affiches dans un ListView ne change rien... ça renvoie une chaine de caractère, après tu en fais ce que tu veux


    Sinon, l'évènement MouseUp ne me semble pas très adéquat... il vaudrait mieux utiliser SelectedNodeChanged

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    Finalement plus d'erreur de compil, mais un "NullReferenceException was unhandled" de la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    DirectorySecurity dirSec = Directory.GetAccessControl(((TreeView)sender).SelectedNode.FullPath);
    ...
    Que puis-je faire ?

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    rajoute un if pour vérifier que le SelectedNode n'est pas null

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    J'ai un léger soucis dans mon ListView.
    Un petit screenshot explicatif:



    L'appli fait un listing des droits d'accès des utilisateurs sur les dossiers.

    J'affiche les droits des utilisateurs dans la mauvaise colonne...

    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
     
    // affiche les username / groupname
    try
    {
         DirectorySecurity dirSec = Directory.GetAccessControl(((TreeView)sender).SelectedNode.FullPath);
         AuthorizationRuleCollection rules = dirSec.GetAccessRules(true, true, typeof(NTAccount));
     
         foreach (FileSystemAccessRule rule in rules)
         {
              string groupOrUser = rule.IdentityReference.Value;
              this.UserView.Items.Add(groupOrUser.ToString());
         }
    }
    catch { }
     
    // affiche les droits
    try
    {
         DirectorySecurity dirSec = Directory.GetAccessControl(((TreeView)sender).SelectedNode.FullPath);
         AuthorizationRuleCollection rules = dirSec.GetAccessRules(true, true, typeof(NTAccount));
     
         foreach (FileSystemAccessRule rule in rules)
         {
              FileSystemRights rights = rule.FileSystemRights;
              this.UserView.Items.Add(rights.ToString());
     
         }
    }
    catch { }

    Quelqu'un pourrait me donner la syntaxe correcte?
    Merci
    Jerome

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ben tu ajoutes les droits à la liste de la même façon que les utilisateurs, donc c'est normal que ça apparaisse dans la même colonne... Il faut les ajouter en tant que sous-éléments, et il faut tout faire dans la même boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
         DirectorySecurity dirSec = Directory.GetAccessControl(((TreeView)sender).SelectedNode.FullPath);
         AuthorizationRuleCollection rules = dirSec.GetAccessRules(true, true, typeof(NTAccount));
     
         foreach (FileSystemAccessRule rule in rules)
         {
              string groupOrUser = rule.IdentityReference.Value;
              ListViewItem lvi = this.UserView.Items.Add(groupOrUser.ToString());
              lvi.SubItems.Add(rule.FileSystemRights);
              lvi.SubItems.Add(rule.IsInherited);
              lvi.SubItems.Add(rule.AccessControlType);
     
         }
    Au fait, évite absolument ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
    {
        ...
    }
    catch { }
    En gros ça veut dire "il y a une erreur, mais je m'en fous, je fais comme si de rien n'était". Soit tu interceptes l'exception pour en faire quelque chose d'utile (l'écrire dans un log, afficher un message d'erreur pour l'utilisateur, tenter de régler automatiquement le problème...), soit tu la laisses remonter. Là tu ne fais que masquer un problème, ce qui rend juste le débogage plus difficile...

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    D'accord mais impossible d'enlever le catch{}.
    J'ai un Excepted catch or finally. Mais comment traiter les problèmes automatiquement lorsque je suis dans le catch.
    J'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    try
    {
    ...
    }
    catch
    {
    MessageBox.Show("Exception...", "Erreur...");
    Mais bon aucun intérêt d'afficher un messagebox dès qu'on clique sur un dossier.

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Zhamy Voir le message
    D'accord mais impossible d'enlever le catch{}.
    J'ai un Excepted catch or finally.
    Ben si tu enlèves le catch, il faut aussi enlever le try...


    Citation Envoyé par Zhamy Voir le message
    Mais bon aucun intérêt d'afficher un messagebox dès qu'on clique sur un dossier.
    Ben oui mais d'un autre côté, masquer l'erreur complètement ça n'a pas vraiment d'intérêt non plus...

    Le traitement à effectuer en cas d'exception dépend de la nature de l'erreur... C'est quoi l'exception que tu obtiens ?

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    Et bien en fait, je n'ai pas d'exception attendu. J'ai pensé que la structure try, catch était la mieux appropriée.

    Finalement je dois éditer ces permissions NTFS, clique droit sur les "rights"> choix des énumérations des FileSystemRights :
    ReadandExecute, ApprendData, CreateFiles, Write, FullControl...

    J'ai vu ce code :
    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
     
    System.IO.DirectoryInfo folderInfo = new System.IO.DirectoryInfo(folder);
    DirectorySecurity folderSecurity = folderInfo.GetAccessControl();
     
    FileSystemAccessRule rule =
          new FileSystemAccessRule(
          "Domain\\username",
          FileSystemRights.ReadAndExecute |
            FileSystemRights.AppendData |
            FileSystemRights.CreateFiles |
            FileSystemRights.Write,
          InheritanceFlags.ObjectInherit,
          PropagationFlags.None,
          AccessControlType.Allow);
     
    folderSecurity.AddAccessRule(rule);
    folderInfo.SetAccessControl(folderSecurity);
    Comment je pourrais adapter ce script avec ce fameux clic droit sur les permissions ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Développement outil permission NTFS
    Par Zhamy dans le forum Windows
    Réponses: 1
    Dernier message: 06/04/2010, 11h21
  2. [WD11] Permissions NTFS
    Par WDKyle dans le forum WinDev
    Réponses: 7
    Dernier message: 06/07/2009, 09h29
  3. Permissions NTFS avec XP Home
    Par Loceka dans le forum Sécurité
    Réponses: 2
    Dernier message: 10/09/2006, 11h32
  4. [Architecture] Conseil pour développement appli Client/Serveur
    Par etiennegaloup dans le forum Développement Web en Java
    Réponses: 11
    Dernier message: 22/01/2006, 11h44
  5. Quelle Bdd pour développement appli commerciale
    Par cicko dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 21/09/2005, 16h00

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