2012-11-15 17 views
5

Widzę opóźnienie początkowe wynoszące 2-5 sekund pomiędzy wykonaniem polecenia FindSync DirectorySearcher() a pierwszym pakietem sieciowym, który widzę, wychodzącym na serwer LDAP. Po początkowym wykonaniu kolejne egzekucje są natychmiast wykonywane przez około 45 sekund. Po tym okresie szybkich egzekucji kolejne wykonanie będzie opóźnione i ponownie wszystkie kolejne egzekucje zakończą się natychmiast. Wygląda na to, że jest coś w rodzaju buforowania, ale nie udało mi się znaleźć żadnych zasobów potwierdzających to lub opisujących, co powoduje początkowe opóźnienie.Opóźnienie z instalacją DirectorySearcher FindOne() przy pierwszym uruchomieniu

Zauważyliśmy to na serwerze Windows 2008 klienta, a następnie odtworzono na naszych własnych opakowaniach Windows 2008 i Windows 7.

Oto, jak wygląda moja prosta aplikacja .NET 4.0 C#. Opóźnienie występuje między komunikatami "Rozpoczęty" i "Zakończony".

Każdy pomysł, dlaczego to opóźnienie występuje w początkowym wykonaniu FindOne()? Każda pomoc jest doceniana!

using System; 
using System.Collections.Generic; 
using System.Text; 

using System.DirectoryServices; 

namespace LdapTest 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] fetchAttributes; 
     fetchAttributes = new string[] { "{string[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)", fetchAttributes, SearchScope.Subtree)) 
      { 
       Console.WriteLine("Started"); 
       SearchResult result = searcher.FindOne(); 
       Console.WriteLine("Finished"); 
      } 
     } 
    } 
} 
+1

http://stackoverflow.com/questions/1846436/system-directoryservices-is-slow – orange

+1

Matka Boga !! to było pytanie, na które szukałem rozwiązania od tygodni !! dziękuję –

Odpowiedz

2

Według LDAP ADsPath MSDN article, należy określić flagi ServerBind jeśli wiążące elementy ścieżki LDAP do serwera, aby uniknąć niepotrzebnego ruchu sieciowego. Zaleca również podanie pełnej nazwy DNS serwera. Ponadto flaga ReadonlyServer nie ma znaczenia przy wskazywaniu serwera. Tak więc moją pierwszą propozycją jest zamiana flagi ReadonlyServer na ServerBind (najlepiej podać pełną nazwę DNS) lub usunięcie części serwerowej ciągu znaków (w twoim przykładzie uczyń go LDAP: // ou = lab, dc = ourdomain, dc = com lub LDAP: //ourdomain.com/ou=lab,dc=ourdomain,dc=com).

Należy również zwrócić uwagę na to, że podajesz nazwę użytkownika według nazwy wyróżniającej. Jeśli spojrzysz na podstawowy interfejs API, który używa DirectoryEntry, IADsOpenDSObject::OpenDSObject, wymaga to, aby flaga lpReserved [parametr AuthenticationTypes w DirectoryEntry] miała zero [None] lub zawierała flagę ADS_USE_SSL [SecureSocketsLayer] podczas przekazywania nazwy wyróżniającej dla nazwy użytkownika. Zwróć uwagę, że flaga SecureSocketsLayer wymaga, aby usługa Active Directory wymagała zainstalowania serwera certyfikatów przed użyciem tej flagi. Możesz przekazać nazwę użytkownika w innym formacie.

Na koniec this MDSN page mówi, że bez żadnych flag uwierzytelniających nazwa użytkownika i hasło są wysyłane jako zwykły tekst. Powinieneś dodać flagę Secure.

+0

Dzięki! Zmiana opcji AuthenticationType z ReadOnlyServer na ServerBind zmniejszyła całkowity czas trwania z 15 sekund do 2 sekund. – cooperaa