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 :

SystemException sur SecurityIdentifier


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 SystemException sur SecurityIdentifier
    Bonjour,
    J'ai une fonction qui me permet d'ajouter un NTAccount dans une AcessControlList (ACL).
    La voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                DirectoryInfo dInfo = new DirectoryInfo(_path);
                DirectorySecurity dSecurity = dInfo.GetAccessControl();
                //Get the account
                NTAccount acct = new NTAccount(userName);
                IdentityReference id = acct.Translate(typeof(SecurityIdentifier));
                //Add write access to the directory
                FileSystemAccessRule rule = new FileSystemAccessRule(acct, rights, AccessControlType.Allow);
                dSecurity.AddAccessRuleAll(rule);
                //Apply the changes
                dInfo.SetAccessControl(dSecurity);
    J'ai une exception levée type SystemException sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IdentityReference id = acct.Translate(typeof(SecurityIdentifier));
    Avec message d'erreur :
    La relation d'approbation entre le domaine principal et le domaine approuvé a échoué.
    J'ai entendu parlé des opérations de Marshalling sur le forum, et j'ai l'impression qu'il y aurait un problème de conversion (managée, non-managée, aucune idée).

    Bref après avoir posté 2 sujets à ce propos j'avoue que je me sens vaincu
    Si quelqu'un aurait une idée, un conseil, une proposition, je lui serais entièrement reconnaissant étant donné mon désespoir.
    Merci.

  2. #2
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut.

    Quelques questions :

    • la ligne de code qui te pose une erreur => à quoi elle va te servir derrière la variable "id" ? On ne le voit pas dans ce que tu as posté...
    • la méthode "AddAccessRuleAll" tu l'as trouvée où (je ne vois que "AddAccessRule") ?
    • le NTAccount il est local ou de domaine ?
    • avec quels privilèges exécutes-tu ton application ?
    • Etc.

    Donne le max d'infos possible

    PS : ton code fonctionne parfaitement chez moi

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 96
    Par défaut
    Bonjour,
    Ton code a l'air de bien fonctionné ...
    mais pour que ça marche il faut qu'il soit exécuter par un compte administrateur (en plus faut vérifier que ce compte a les droits d'ajouter un nouvel utilisateur)...

    Et comme "eusebe19" a dit: Donne le max d'infos possible

    Cdt

  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
    Tout d'abord merci à vous d'avoir pris un peu de votre temps.

    • Je suis un des admins du domaine
    • Par la même occasion, je suis en fullcontrol, et l'application tourne sur mon poste


    Fonctionnement du module d'ajout d'ACE dans une ACL :

    L'utilisateur de l'application saisit un samAccountName (login) d’un user pour l’ajouter dans l’ACL d’un dossier.
    L’appli fait une recherche dans toute la forêt de mon domaine. (constructeur DirectorySearcher)
    S’il trouve un résultat, alors l'appli ajoute l’utilisateur à la liste de contrôle d’accès. (constructeur FileSystemAccessRule)
    id : identifie l'utilisateur d'un compte.

    Par rapport au NTAccount :
    Et bien justement, ma question est la suivante :
    Je peux uniquement ajouter les utilisateurs de mon groupe local aux ACL.

    Le code complet si vous en avez besoin :

    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
     
                try
                {
                    string userName = textBox3.Text;
                    DirectoryInfo dInfo = new DirectoryInfo(_path);
                    DirectorySecurity dSecurity = dInfo.GetAccessControl();
     
                    string ldapReq = @"(&(objectCategory=user)(samAccountName=" + userName + "))";
                    string ldapRoot = "LDAP://domain.net/DC=DOMAIN,DC=NET";
     
                    DirectoryEntry sroot = new DirectoryEntry(ldapRoot, "login", "password");
                    DirectorySearcher searcher = new DirectorySearcher(sroot, ldapReq, new string[] { "member" }, SearchScope.Subtree);
     
                    SearchResultCollection sr = searcher.FindAll();
     
                    if (sr.Count > 0)
                    {
                        NTAccount acct = new NTAccount(userName);
                        IdentityReference id = acct.Translate(typeof(SecurityIdentifier));
                        FileSystemAccessRule rule = new FileSystemAccessRule(id, FileSystemRights.ReadAndExecute | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
     
                        dSecurity.AddAccessRule(rule);
                        dInfo.SetAccessControl(dSecurity);
                        m_parent.UserViewFill();
                        this.Close();
                    }
     
                    else
                    {
                        MessageBox.Show("Utilisateur non trouvé !", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
    SystemException est levé lorsque l'utilisateur saisit n'est pas dans le même groupe que le mien.
    Pourtant quand j'ajoute cet utilisateur à la main (Serveur de fichier > Propriétés Dossier > Onglet sécurité > Ajouter) ça fonctionne.

    La classe Marshal n'a rien à voir avec mon problème ?
    Merci.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 96
    Par défaut
    Non, la classe Marshal n'a rien à voir avec ton problème...
    essaye ça:

    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
     
    // Connexion à l'annuaire
    DirectoryEntry Ldap = new DirectoryEntry("LDAP://votre-nom-AD", "Login", "Password");
    // Création du user Test User et initialisation de ses propriétés
    DirectoryEntry user = Ldap.Children.Add("cn=Test User", "user");
    user.Properties["SAMAccountName"].Add("testuser");
    user.Properties["sn"].Add("User");
    user.Properties["givenName"].Add("Test");
    user.Properties["description"].Add("Compte de test créé par le code");
    // On envoie les modifications au serveur
    user.CommitChanges();
     
    // On va maintenant lui définir son password. L'utilisateur doit avoir été créé
    // et sauvé avant de pouvoir faire cette étape
    user.Invoke("SetPassword", new object [] {"motdepasse"});
    // On va maintenant activer le compte : ADS_UF_NORMAL_ACCOUNT
    user.Properties["userAccountControl"].Value = 0x0200;
    // On envoie les modifications au serveur
    user.CommitChanges();

  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
    Oula, malheuresement je ne cherche pas à créer un utilisateur dans l'AD.
    Le code est bon, j'ai essayé avec le constructeur
    NTAccount(string domainName, string accountName).
    Mais je peine à trouver la bonne syntaxe du domaineName
    Donc :
    Impossible de traduire certaines ou toutes les références d'identité
    Problème :
    Je peux uniquement ajouter les utilisateurs qui sont situés dans le même OU (Unité d'Organisation de mon AD) que le mien.
    Les autres utilisateur qui sont dans d'autres OU ne peuvent pas être ajoutée à une ACL.
    J'ai ce message d'erreur qui revient à chaque manipulation :
    La relation d'approbation entre le domaine principal et le domaine approuvé a échouée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                        NTAccount acct = new NTAccount(userName);
     
                        IdentityReference id = (IdentityReference)acct.Translate(typeof(SecurityIdentifier));
                        //MessageBox.Show(userName + " : " + id.Value);
     
                        FileSystemAccessRule rule = new FileSystemAccessRule(id, FileSystemRights.ReadAndExecute | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
     
                        dSecurity.AddAccessRule(rule);
                        dInfo.SetAccessControl(dSecurity);
    Le problème vient peut être de l'administration réseau ?
    Merci

  7. #7
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par Zhamy Voir le message
    Mais je peine à trouver la bonne syntaxe du domaineName (donc : Impossible de traduire certaines ou toutes les références d'identité).
    Si on prend un exemple un peu plus tordu que celui que tu as donné plus haut, avec un domaine version pure couche LDAP AD qui serait "DC=monSousDC,DC=monAutreSousDC,DC=net" et version AD qui serait donc "monSousDC.monAutreSousDC.net" : effectivement tu peux te logguer avec le nom court (monSousDC), mais t'emmerdes pas, prends toujours le domaine complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NTAccount myAccount = new NTAccount("monSousDC.monAutreSousDC.net", "userName")
    Citation Envoyé par Zhamy Voir le message
    Je peux uniquement ajouter les utilisateurs qui sont situés dans le même OU (Unité d'Organisation de mon AD) que le mien.
    Le problème vient peut être de l'administration réseau ?
    Je dirais que non (mais à vérifier ), car dans l'hypothèse ou tu aurais une GPO appliquée aux stations de travail qui te permettrait de donner des droits uniquement aux membres de ton OU, tu ne pourrais le faire ni via le code ni "à la main", or tu dis pouvoir le faire...

    As-tu essayé avec la création d'un NTAccount avec le nom de domaine ?

  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
    C'est relativement louche. Effectivement, les admins on posé des stratégies de sécurité dans l'AD. Cela dit j'arrive quand même à ajouter un utilisateur à l'ACL à la main.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NTAccount acct = new NTAccount("mondomaine.net", userName);
    ne fonctionne pas :
    Impossible de traduire certaines ou toutes les références d'identité.
    Qu'entends tu par :
    As-tu essayé avec la création d'un NTAccount avec le nom de domaine ?
    Merci.

  9. #9
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    J'entendais par là la ligne de code que tu cites comme ne fonctionnant pas

    Mais là je comprends plus : tu arrives à récupérer le user name via une requête LDAP et derrière tu ne peux pas créer un objet NTAccount... Tu utilises bien le même nom de domaine ???

  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
    Oui exactement, mon ldaproot ressemble à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string ldapRoot = "LDAP://domain.net/DC=DOMAIN,DC=NET";
    Et quand j'instancie NTAccount :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NTAccount acct = new NTAccount("domain.net", userName);
    Erreur :
    Impossible de traduire certaines ou toutes les références d'identité.
    Donc je garde la forme du constructeur NTAccount(string userName);
    Là ça marche je peux ajouter les objets, mais uniquement ceux qui appartiennent au même OU que le mien.

Discussions similaires

  1. Erreur "javax/transaction/SystemException" sur test Maven
    Par pcouas dans le forum Tests et Performance
    Réponses: 4
    Dernier message: 13/06/2012, 21h50
  2. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  3. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59
  4. Réponses: 4
    Dernier message: 27/03/2002, 11h03
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 15h28

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