wheelshot
Messages postés5Date d'inscriptionvendredi 15 avril 2005StatutMembreDernière intervention29 janvier 2008
-
15 janv. 2008 à 15:25
wheelshot
Messages postés5Date d'inscriptionvendredi 15 avril 2005StatutMembreDernière intervention29 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()));
// 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:
Le serveur smtp requiert une connexion sécurisée ou le client n'était pas authentifié
wheelshot
Messages postés5Date d'inscriptionvendredi 15 avril 2005StatutMembreDernière intervention29 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.
wheelshot
Messages postés5Date d'inscriptionvendredi 15 avril 2005StatutMembreDernière intervention29 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 ;)