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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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