2010-01-06 10 views
0

Je développe une application SharePoint qui nécessite des utilisateurs à partir d'une unité organisationnelle Active Directory Windows Server 2003 spécifiée.Impossible de répondre rapidement à la récupération AD

Premièrement, je ne m'inquiétais pas des opérations 'Dispose' et 'Close' sur les objets DirectoryServices. À ce stade, les opérations de récupération ont été rapides et réussies.

Mais cela provoquait l'erreur 'Le serveur n'est pas opérationnel' après 2 tentatives. Et cette erreur rend l'application entière plus mauvaise, comme l'arrêt d'autres opérations AD.

Ensuite, j'ai corrigé cette erreur en ajoutant des instructions using sur chaque objet DirectoryEntry, DirectorySearcher et SearchResultCollection.

Ensuite, j'ai atteint un point où je n'ai plus l'erreur «Le serveur n'est pas opérationnel». Mais lorsque j'essaie de récupérer des utilisateurs de AD 1 fois ou plus en utilisant la méthode DirectorySearcher.FindAll, le premier fonctionne rapidement et avec succès, les autres plus lentement mais avec succès. Cela prend un peu la durée d'un timeout. Pourriez-vous s'il vous plaît m'aider avec ma situation à propos de ce ralentissement?

Voici l'exemple de code:

using (DirectoryEntry directoryEntry = new DirectoryEntry(connectionString, userName, password)) 
      { 
       using (DirectorySearcher search = new DirectorySearcher(directoryEntry)) 
       { 
        search.SearchScope = SearchLevel.OneLevel; 
        search.ReferralChasing = ReferralChasingOption.All; 
        search.Filter = filter; 
        search.SizeLimit = 200; 
        //Limits the property count for search result 
        SetUserDirectorySearcherPropertiesToLoad(search); 

        using (SearchResultCollection result = search.FindAll()) 
        { 
         foreach (SearchResult searchResult in result) 
         { 
          // Get user attributes 
         }}}} 

Merci à l'avance

+0

Existe-t-il des erreurs Schannel dans le journal des événements système? Quelle est la version de AD (2000, 2003 etc)? – DmitryK

+0

AD fonctionne sur 2003. Event Viewer semble bien. –

Répondre

0

Tout semble être normal ici. J'utilise quelque chose de similaire, la seule différence notable est que je passe habituellement le paramètre "propertiesToLoad" au constructeur de DirectoryEntry, ainsi que je passe le filtre au constructeur de DirectorySearcher.

Une autre différence est que vous utilisez "nom d'utilisateur" et "mot de passe" pour le DirectoryEntry - peut-être que cela vaut la peine d'utiliser l'identité du pool d'applications? Je fais généralement SPSecurity.RunWithElevatedPrivileges(method pointer) pour ces appels.

+0

J'ai essayé les deux façons et cela n'a aucun effet du tout. L'identité du pool d'applications ne possède pas les privilèges requis dans Active Directory, par exemple l'ajout d'un membre de domaine à un groupe. Je dois donc prendre des informations d'identification à partir du fichier de configuration. –

+0

pouvez-vous poster un exemple, comment vos variables 'connectionString' et' filter' ressemblent? – naivists

+0

Ma chaîne de connexion est LDAP: // nomDD/OU = ou1, OU = ou2, DC = nomdc Mon filtre est (& (& (ObjectClass = personne)) (& (! MemberOf = CN = Etudiants, OU = UEPOU, DC = l, DC = local) (! MemberOf = CN = Instructeurs, OU = UEPOU, DC = l, DC = local) (! MemberOf = CN = directeurs, OU = UEPOU, DC = lst, DC = local) (! userAccountControl: 1.2.840.113556.1.4.803: = 2))) Je sais que cela peut sembler compliqué mais ces variables fonctionnent sur un navigateur LDAP. –