DirectorySearcher FindOne () délai lors de l’exécution initiale

Un délai initial de 2 à 5 secondes s’est écoulé entre le moment où j’exécute DirectorySearcher FindOne () et le premier paquet réseau que je vois a été envoyé au serveur LDAP. Après l’exécution initiale, les exécutions suivantes se terminent instantanément pendant environ 45 secondes. Après cette période d’exécutions rapides, la prochaine exécution sera retardée et toutes les exécutions suivantes se termineront instantanément. Il semble qu’il y ait une sorte de cache en cours, mais je n’ai trouvé aucune ressource pour le confirmer ou décrire la cause du retard initial.

Nous l’avons remarqué sur un serveur client Windows 2008, puis reproduit sur nos propres boîtes Windows 2008 et Windows 7.

Voici à quoi ressemble ma simple application .NET 4.0 C #. Le délai se produit entre les messages “Démarré” et “Terminé”.

Une idée de pourquoi ce délai se produit lors de l’exécution initiale de FindOne ()? Toute aide est très appréciée!

using System; using System.Collections.Generic; using System.Text; using System.DirectoryServices; namespace LdapTest { class Program { static void Main(ssortingng[] args) { ssortingng[] fetchAtsortingbutes; fetchAtsortingbutes = new ssortingng[] { "{ssortingng[0]}" }; using (DirectoryEntry searchRoot = new DirectoryEntry("LDAP://localserver/ou=lab,dc=ourdomain,dc=com", "cn=binduser,ou=Services,dc=ourdomain,dc=com", "Password", AuthenticationTypes.ReadonlyServer)) { using (DirectorySearcher searcher = new DirectorySearcher(searchRoot, "(sAMAccountName=UserName)", fetchAtsortingbutes, SearchScope.Subtree)) { Console.WriteLine("Started"); SearchResult result = searcher.FindOne(); Console.WriteLine("Finished"); } } } } 

Selon l’article LDAP ADsPath MSDN , vous devez spécifier l’indicateur ServerBind si votre chemin LDAP de liaison pointe vers un serveur afin d’éviter le trafic réseau inutile. Il est également recommandé de donner le nom DNS complet du serveur. De plus, l’indicateur ReadonlyServer n’a pas de sens lorsqu’il pointe vers un serveur. Ma première suggestion est donc de remplacer l’indicateur ReadonlyServer par ServerBind (et de préférence donner le nom DNS complet), ou de supprimer la partie serveur de la chaîne (dans votre exemple, indiquez LDAP: // ou = lab, dc = ourdomain, dc = com ou LDAP: //ourdomain.com/ou=lab,dc=ourdomain,dc=com).

L’autre chose à considérer est que vous fournissez le nom d’utilisateur par nom distinctif. Si vous examinez l’API principale utilisée par DirectoryEntry, IADsOpenDSObject :: OpenDSObject , l’indicateur lpReserved [le paramètre AuthenticationTypes dans DirectoryEntry] est défini sur zéro ou inclut l’option ADS_USE_SSL [ SecureSocketsLayer ] lors de la transmission d’un nom SecureSocketsLayer pour le nom d’utilisateur . Notez que l’indicateur SecureSocketsLayer requirejs qu’Active Directory exige qu’un serveur de certificates soit installé avant de pouvoir utiliser cet indicateur. Vous voudrez peut-être transmettre le nom d’utilisateur dans un format différent.

Enfin, cette page MDSN indique que, sans indicateurs d’authentification, le nom d’utilisateur et le mot de passe sont envoyés en clair. Vous devriez append le drapeau Secure .