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éfinir les permissions d'un répertoire partagé


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Par défaut Définir les permissions d'un répertoire partagé
    Bonjour,

    Cela fait plus de 2 jours que je recherche sur le net comment définir les permissions d'un répertoire partagé en c# mais je ne trouve pas ce qu'il me faut.

    J'arrive à partager le répertoire et à définir les droits NTFS sur celui ci mais je n'arrive pas à "jouer" sur les droits réseau.

    Par défaut, c'est everyone qui est défini en full access et j'aimerais lui retirer ses droits pour y mettre ceux d'un groupe...

    J'arrive à le faire en ligne de commande avec l'outil RmtShare.exe mais comme le code est exécuté depuis un webservice, la commande ne s'execute pas.

    Quelqu'un à une idée ?

    Merci

    Antoweb

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Bonjour,
    ton post me rappelle mon projet de fin d'études où j'ai passé des heures entières à essayer de trouver les permissions de partage et non les permissions NTFS.

    J'avais fini par trouver !

    Voici donc ce que j'avais fait à l'époque (désolé si le code est brouillon et pas du tout opti, ça date un peu maintenant ^^)

    Comme tu le remarqueras, ce code ne fait que lire les permissions, à toi de l'adapter

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    ManagementScope scope = new ManagementScope("\\\\" + serv.Nom + "\\root\\cimv2", co);
                ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_LogicalShareSecuritySetting");
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
                ManagementObjectCollection queryCollection = searcher.Get();
                #region Boucle pour chaque partage
                foreach (ManagementObject m in queryCollection)
                {
                    try
                    {
                        InvokeMethodOptions options = new InvokeMethodOptions();
     
                        ObjectQuery query2 = new ObjectQuery("SELECT * FROM Win32_Share WHERE Name ='" + m["Name"] + "'");
                        ManagementObjectSearcher searcher2 = new ManagementObjectSearcher(scope, query2);
                        ManagementObjectCollection queryCollection2 = searcher2.Get();
     
                        foreach (ManagementObject mo in queryCollection2)
                        {
                            string sharename = mo["Name"].ToString(); //nom
                            string path = mo["Path"].ToString(); //path
                            string caption = mo["Caption"].ToString(); //description  
     
                            ManagementBaseObject outParamsMthd =
                                                                   m.InvokeMethod("GetSecurityDescriptor", null, options);
                            ManagementBaseObject descriptor =
                            outParamsMthd["Descriptor"] as ManagementBaseObject;
     
                            ManagementBaseObject[] dacl2 = descriptor["DACL"] as ManagementBaseObject[];
     
                            #region Boucle pour chaque acl dans la dacl
                            foreach (ManagementBaseObject ace in dacl2)
                            {
                                try
                                {
                                    ManagementBaseObject trustee = ace["Trustee"] as ManagementBaseObject;
                                    string domain = (string)trustee["Domain"];
                                    string name = (string)trustee["Name"];
                                    String RefUserOrGroupe = "unknown";
                                    if (trustee.Properties["SIDString"].Value != null)
                                    {
                                        RefUserOrGroupe = trustee.Properties["SIDString"].Value.ToString();
                                    }
                                    Int32 mask = Int32.Parse(ace["AccessMask"].ToString());
                                    String TypeAcces="";
                                    if (Convert.ToInt32(ace["AceType"]) == (int)AceType.AccessDenied)
                                    {
                                        TypeAcces = "Deny";
                                    }
                                    else
                                    {
                                        TypeAcces = "Allow";
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception exc)
                    {
                        Log(exc);
                    }
                }
    Pour info, voici quelques valeurs de mask de L'AccessMask :

    1179817 -> Read Acces
    1245631-> Modify Acces
    2032127 -> Full Acces

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Par défaut
    Merci pour ton code,
    Je vais l'utiliser comme piste...

    Je ne sais pas pourquoi, il ne me liste que les répertoires partagés qui se trouvent sur d:\ et pas les autres.
    Exemple, j'en ai 5 dans d:\shares\xxx et ils n'apparaissent pas :-/

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Par défaut
    J'ai trouvé un bout de code qui permet de définir une (et une seule) permission... Je ne sais pas comment en ajouter plusieurs...

    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
     
                string groupName = "HRISSelRecrutRO1DEV";
                string computerName = "CIS1100873";
                string sharedFolderName = "hristest12";
     
                NTAccount ntAccount = new NTAccount(groupName);
     
                //SID
                SecurityIdentifier userSID = (SecurityIdentifier)ntAccount.Translate(typeof(SecurityIdentifier));
                byte[] utenteSIDArray = new byte[userSID.BinaryLength];
                userSID.GetBinaryForm(utenteSIDArray, 0);
     
                //Trustee
                ManagementObject userTrustee = new ManagementClass(new ManagementPath("Win32_Trustee"), null);
                userTrustee["Name"] = computerName + @"\" + groupName;
                userTrustee["SID"] = utenteSIDArray;
     
                //ACE
                ManagementObject userACE = new ManagementClass(new ManagementPath("Win32_Ace"), null);
                userACE["AccessMask"] = 1179817;  //Full access = 2032127 ; Change = 1245631 ; Read = 1179817
                userACE["AceFlags"] = AceFlags.ObjectInherit | AceFlags.ContainerInherit;
                userACE["AceType"] = AceType.AccessAllowed;
                userACE["Trustee"] = userTrustee;
     
                ManagementObject userSecurityDescriptor = new ManagementClass(new ManagementPath("Win32_SecurityDescriptor"), null);
                userSecurityDescriptor["ControlFlags"] = 4; //SE_DACL_PRESENT 
                userSecurityDescriptor["DACL"] = new object[] { userACE };
     
                //UPGRADE SECURITY PERMISSION
                //string CondivisionName = "HRISSelRecrutRO1DEV";
                string CondivisionName = sharedFolderName;
                ManagementClass mc = new ManagementClass("Win32_Share");
                ManagementObject share = new ManagementObject(mc.Path + ".Name='" + CondivisionName + "'");
                share.InvokeMethod("SetShareInfo", new object[] { Int32.MaxValue, "", userSecurityDescriptor });

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Par défaut
    Je m'auto répond, cela pourrais servir à quelqu'un d'autre...

    Voici la solution pour définir une liste de users (et/ou groupes) ainsi que leurs accès à un shared folder:


    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 setPermissionOnFolder()
            {
                string sharedFolderName = "hristest12";
                string computerName = "CIS1100873";
     
                //Full access = 2032127 ; Change = 1245631 ; Read = 1179817
                List<ManagementObject> lst = new List<ManagementObject>();
                lst.Add(getUserACE(computerName, "HRISSelRecrutRO1DEV", 1179817));
                lst.Add(getUserACE(computerName, "HRISHelpSelRecrutDEV", 2032127));
     
                ManagementObject userSecurityDescriptor = new ManagementClass(new ManagementPath("Win32_SecurityDescriptor"), null);
                userSecurityDescriptor["ControlFlags"] = 4; //SE_DACL_PRESENT 
                userSecurityDescriptor["DACL"] = lst.ToArray();
     
                //UPGRADE SECURITY PERMISSION
                ManagementClass mc = new ManagementClass("Win32_Share");
                ManagementObject share = new ManagementObject(mc.Path + ".Name='" + sharedFolderName + "'");
                share.InvokeMethod("SetShareInfo", new object[] { Int32.MaxValue, "desc of " + sharedFolderName, userSecurityDescriptor });
            }
     
            private ManagementObject getUserACE(string computerName, string groupName, int rightMask)
            {
                NTAccount ntAccount = new NTAccount(groupName);
     
                //SID
                SecurityIdentifier userSID = (SecurityIdentifier)ntAccount.Translate(typeof(SecurityIdentifier));
                byte[] utenteSIDArray = new byte[userSID.BinaryLength];
                userSID.GetBinaryForm(utenteSIDArray, 0);
     
                //Trustee
                ManagementObject userTrustee = new ManagementClass(new ManagementPath("Win32_Trustee"), null);
                userTrustee["Name"] = computerName + @"\" + groupName;
                userTrustee["SID"] = utenteSIDArray;
     
                //ACE
                ManagementObject userACE = new ManagementClass(new ManagementPath("Win32_Ace"), null);
                userACE["AccessMask"] = rightMask;  //Full access = 2032127 ; Change = 1245631 ; Read = 1179817
                userACE["AceFlags"] = AceFlags.ObjectInherit | AceFlags.ContainerInherit;
                userACE["AceType"] = AceType.AccessAllowed;
                userACE["Trustee"] = userTrustee;
     
                return userACE;
            }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier les permissions d'un répertoire
    Par zan001 dans le forum Général Java
    Réponses: 0
    Dernier message: 30/04/2009, 18h57
  2. Définir les droits à la création d'un répertoire
    Par Concombre Masqué dans le forum Langage
    Réponses: 4
    Dernier message: 04/03/2009, 19h46
  3. Réponses: 2
    Dernier message: 18/09/2008, 09h53
  4. lister les répertoires partagés
    Par koKoTis dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 03/12/2007, 18h01
  5. les répertoires partagés
    Par LN(a) dans le forum Delphi
    Réponses: 7
    Dernier message: 07/12/2006, 21h53

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