Question

J'utilise le code ci-dessous pour rechercher des informations dans le répertoire actif lorsqu'un utilisateur se connecte à un site Web. La course contre un domaine local, il est très rapide, mais en cours d'exécution sur un réseau privé virtuel à un domaine de confiance à distance, il est très lent (prend environ 7 ou 8 secondes). Exécution dsa.msc de la même boîte au domaine distant est presque aussi rapide que l'exécuter localement.

J'utilise le filtrage de la propriété pour récupérer le montant minimum de données possibles, il est donc quelque chose d'intrinsèquement lent à System.DirectoryServices dans ce scénario, ou que quelqu'un a des conseils sur la façon d'améliorer la performance?

La connexion réseau à travers le VPN est très bien, il est seulement ce code qui fonctionne lentement.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var LDAPConnection = new DirectoryEntry("LDAP://domain/dc=domain,dc=com", "username", "password"))
            {
                LDAPConnection.AuthenticationType = AuthenticationTypes.Secure;
                using (DirectorySearcher Searcher = new DirectorySearcher(LDAPConnection))
                {
                    Searcher.Filter = "(&(&(objectclass=user)(objectcategory=person))sAMAccountName=username)";
                    Searcher.PropertiesToLoad.Add("mail");

                    SearchResult result = Searcher.FindOne(); //this line takes ages!

                    string EmailAddress = result.Properties["mail"][0].ToString();
                    Console.WriteLine(EmailAddress);
                }
            }
        }
    }
}
Était-ce utile?

La solution

Une autre suggestion est d'utiliser directement System.DirectoryServices.Protocols; votre code ressemblera à:

string filter = "(&(&(objectclass=user)(objectcategory=person))" + 
                "sAMAccountName=username)";
NetworkCredential credentials = new NetworkCredential(...);
LdapDirectoryIdentifier directoryIdentifier = 
   new LdapDirectoryIdentifier("server", 389, false, false);
using (LdapConnection connection = 
   new LdapConnection(directoryIdentifier, credentials, AuthType.Basic))
{
    connection.Timeout = new TimeSpan(0, 0, 30);
    connection.SessionOptions.ProtocolVersion = 3;
    SearchRequest search = 
        new SearchRequest(query, filter, SearchScope.Base, "mail");
    SearchResponse response = connection.SendRequest(search) as SearchResponse;
    foreach(SearchResultEntry entry in response.Entries)
    {
        Console.WriteLine(entry.Attributes["mail"][0]);
    }
}

Autres conseils

Je ne l'ai jamais essayé le scénario que vous décrivez (connexion via VPN à Active Directory), mais la ligne que vous avez marqué est la ligne qui provoque la connexion à ouvrir. Vous n'êtes pas connecté au serveur avant d'appeler FindOne. Je suppose que l'établissement de la connexion dure 7-8 secondes.

Si vous ne pouvez pas trouver réponse exacte sur stackoverflow essayer ce forum: http://directoryprogramming.net/forums /default.aspx (je ne dis pas que stackoverflow est pas utile, mais j'ai trouvé des réponses à mes questions ad / ldap sur le forum DirectoryProgramming.net).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top