Le serveur n'est pas opérationnel

wheelshot Messages postés 5 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 29 janvier 2008 - 15 janv. 2008 à 15:25
wheelshot Messages postés 5 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 29 janvier 2008 - 29 janv. 2008 à 19:41
J'ai un problème qui n'arrive pas 100% du temps sur mon poste et 100% du temps quand je l'exécute sur le serveur qui héberge la tâche.

Sur mon poste j'obtiens l'erreur "La méthode d'authentification demandée n'est pas prise en charge par le serveur".

Sur le serveur j'obtiens "Le serveur n'est pas opérationnel".

Comme je l'ai dis, si j'exécute le code sur mon poste, 2 fois sur 3, le code s'exécute sans problème.

Voici un partie de mon code:
<!-- BEGIN TEMPLATE: bbcode_code -->
publicvoid CreerComptesEnLot(string nomDomaine, string loginDomaine, string passwordDomaine, string LoginLdap, string passwordLdap, DataTable listeComptes)
        {
            try
            {
                // Connexion à l'annuaire (avec aucun OU de spécifié, pour faire la recherche sur tout l'A/D
                // exemple, un étudiant qui est aussi membre du personnel
                DirectoryEntry Ldap = new DirectoryEntry("LDAP://" + nomDomaine + "/dc=domaine, dc=ca", loginDomaine, passwordDomaine, AuthenticationTypes.Secure);
 
                DirectorySearcher searcher = new DirectorySearcher(Ldap);
 
                //On parcours la liste des users du fichier
                foreach(DataRow row in listeComptes.Rows)
                {
                    //On filtre sur tous les objets de la catégorie User et dont le cn est le cip qu'on veut insérer
                    searcher.Filter = "(&(objectCategory=user)(cn=" + row["cip"].ToString() + "))";
 
                    //On vérifie que l'usager n'existe pas déjà
                    if(searcher.FindOne() == null)
                    {
                        Ldap.Close();
                        Ldap = null;
 
                        //Maintenant on se place dans le OU étudiants pour faire la création des comptes
                        Ldap = new DirectoryEntry("LDAP://" + nomDomaine + "/ou=Etudiants, dc=domaine, dc=ca", loginDomaine, passwordDomaine, AuthenticationTypes.Secure);
                       
                        //On format la date du fichier en dd/mm/yyyy
                        string dateNaissance = row["dateNaissance"].ToString().Substring(row["dateNaissance"].ToString().Length - 2, 2);
                        dateNaissance += "/" + row["dateNaissance"].ToString().Substring(row["dateNaissance"].ToString().Length - 4, 2);
                        dateNaissance += "/" + row["dateNaissance"].ToString().Substring(0, 4);
 
                        // Création du user et initialisation de ses propriétés
                        DirectoryEntry user = Ldap.Children.Add("cn=" + row["cip"].ToString(), "User");
                        user.Properties["SAMAccountName"].Add(row["cip"].ToString());
                        user.Properties["sn"].Add(row["nom"].ToString());
                        user.Properties["givenName"].Add(row["prenom"].ToString());
                        user.Properties["userPrincipalName"].Add(row["cip"].ToString() + "@domain.ca");
                        user.Properties["displayName"].Add(row["prenom"].ToString() + " " + row["nom"].ToString());
                        user.Properties["info"].Add(row["matricule"].ToString());
 
                        //On va chercher le email du user sur le Ldap et si on ne le trouve pas on va mettre matricule@domaine.ca
                        user.Properties["mail"].Add(GetEmailFromLdapExterne(LoginLdap, passwordLdap, row["cip"].ToString(), row["matricule"].ToString()));
 
                        user.Properties["scriptPath"].Add("etudiant.bat");
 
                        user.Properties["comment"].Add(dateNaissance);
 
                        // 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", newobject[]{ row["matricule"].ToString()});
                        // On va maintenant activer le compte et faire en sorte que le mot de passe n'expire jamais (0x0200 + 0x10000)
                        user.Properties["userAccountControl"].Value = 0x10200;
                        // On envoie les modifications au serveur
                        user.CommitChanges();
 
                        //on ajoute le user dans le groupe des etudiants
                        if(AddUserToGroupEtudiant(user))
                        {
                            //On crée son répertoire personnel
                            DirectoryInfo homefolder = CreateUserHomeDirectory(@"\\serveur\etudiant$" + row["cip"].ToString());
 
                            if(homefolder != null)
                            {
                                //On donne les droits par défaut à l'étudiant sur son répertoire
                                SetUserDefaultRightsOnHomeFolder(@"\\serveur\etudiant$" + row["cip"].ToString(), row["cip"].ToString(), nomDomaine);
                            }
                        }
 
                        user.Close();
                        Log("INFO - " + row["cip"].ToString() + " créé avec succès");
                    }
                    else
                    {
                        Log("WARNING - " + row["cip"].ToString() + " n'a pas été créé car il est déjà existant (Soit dans le OU Etudiants ou dans un autre conteneur).");
                    }
                }
            }
            catch(Exception exc)
            {
                Log("ERROR - " + exc.Message);
                throw exc;
            }
        }

Cette fonction permet d'ajouter des comptes en lots à partir d'un fichier CSV dans l'active directory.

Ce que je trouve étrange aussi, c'est que ca ne plante pas au premier enregistrement, mais après 30-40 aléatoirement. Se pourrait-il qu'il me manque un "flush" de quelques objets que ce soit?...

J'ai tracé un peu plus profondément dans le type d'erreur recu et la classe d'erreur (DirectoryServicesCOMException) recu et voici le message que j'obtiens comme ExtendedErrorMessage:

"Failed bind for user , unsupported SASL mechanism GSS-SPNEGO specified"

J'ai fais des recherches sur le web et à part 3-4 en thaï rien de pertinent

De plus, j'ai mis des tags pour essayer de savoir sur quelle ligne il plante et il plante sur la ligne "if (searcher.FindOne() == null)" donc lorsqu'il recherche dans l'A/D la présence d'un usager.

Merci de votre aide à l'avance!<!-- / message -->

La vie peut être siii simple... quelque fois
A voir également:

3 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
17 janv. 2008 à 23:59
salut,

tu peux peut être appelé Dispose en + ou à la place de Close...

ShareVB
0
wheelshot Messages postés 5 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 29 janvier 2008
22 janv. 2008 à 22:29
Non, malheureusement cela ne corrige pas le problème.  J'ai lu par contre à quelques endroits qu'il s'agissait d'un bug côté serveur.  Le serveur ne peut pas répondre assez rapidement aux requêtes sur l'A/D. 

La vie peut être siii simple... quelque fois
0
wheelshot Messages postés 5 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 29 janvier 2008
29 janv. 2008 à 19:41
J'ai finalement changé ma façon de fonctionner.  J'ai créé une tâche planifiée qui exporte le contenu de l'A/D en fichier LDF que j'utilise ensuite pour faire ma recherche.  Moi jolie, mais bon, ca fonctionne ;) 

La vie peut être siii simple... quelque fois
0
Rejoignez-nous