Saturday, November 11th, 2006...4:39 pm

Problem przy wyszukiwaniu z użyciem DirectorySeracher (S.DS)

Jump to Comments

Przestrzeń System.DirectoryServices (S.DS) dla wszystkich programistów .NET (a w tej chwili również dla użytkowników PowerShell) jest wygodnym sposobem na dostęp do danych w Active Directory \ ADAM. S.DS pozwala na proste wyszukiwanie i modyfikację obiektów w katalogu z użyciem zaledwie kilku klas i metod.

PrzestrzeÅ„ S.DS ukrywa przed programistami .NET warstwÄ™ COM, czyli znany wiÄ™kszoÅ›ci interfejs ADSI. Jakkolwiek jest to bardzo wygodne z punktu widzenia programisty, czasami potrafi być kÅ‚opotliwe – te wypadki to momenty kiedy aplikacja zgÅ‚asza wyjÄ…tek z poziomu COM i trzeba przeprowadzić proces rozwiÄ…zania tego problemu.

Ostatnio kolega pracujący nad jednym z projektów napotkał na problem występujący w szczególnych warunkach, gdy klasa DirectorySeracher była używana do przeprowadzenia stosunkowo prostego wyszukania danych w katalogu Active Directory. Zapytanie to zwracało pewną ilośc danych, do odczytania której konieczne było skorzystanie ze stronicowania wyników wyszukiwania. Po wykonaniu zapytania do katalogu poprzez wyknanie metody .FindAll(), a następnie próby enumeracji wyników poprzez foreach zgłaszany był wyjątek COM:

System.DirectoryServices.DirectoryServicesCOMException (0x800700EA): More data is available.

Po przeprowadzonych testach udało nam się ustalić, że błąd ten występuje tylko w sytuacji gdy serwer Active Directory jest stosunkowo mocno obciążony, stąd też brały sie problemy z powtórzeniem tego błędu w środowisku produkcyjnym (wydajność fizycznej maszyny jest trochę większa niż maszyny wirtualnej). Po przeszukaniu zasobów KB i kilku wyjaśnieniach udało nam się ustalić, że błąd ten opisany został w KB 833879, i pomimo że ten artykuł odnosi sie tylko do .NET 1.1 to zarówno problem jak i rozwiązanie odnosi sie również do .NET 2.0. Jedyne co należy zmienić w rozwiązaniu opisanym w tym artykule to wersję assembly w pliku konfiguracyjnym z:

Version=1.0.5000.0

na

Version=2.0.0.0

Wprowadzenie tej zmiany w konfiguracji rozwiązało problem z występowaniem tego wyjątku.

Innym rozwiÄ…zaniem dla tego problemu jest użycie do przeszukania katalogu innej przestrzeni dostÄ™pnej w .NET – System.DirectoryServices.Protocols (S.DS.P). S.DS.P jest to nowa przestrzeÅ„ dostÄ™pna w .NET 2.0, która używa bezpoÅ›rednio LDAP API dostÄ™pnego w systemie Windows. Nie wprowadza to dodatkowej warstwy poÅ›redniej jakÄ… jest interfejs ADSI i pozwala ominąć niektóre z problemów wprowadzanych przez ADSI. Niestety jak to zwykle bywa ma to swój koszt – kod pisany w S.DS.P w stosunku do kodu używajÄ…cego S.DS jest trochÄ™ bardziej skomplikowany.

Bardzo dobry przykÅ‚ad użycia S.DS.P do wykonania operacji przeszukania katalogu Active Directory ze stronicowaniem znajduje siÄ™ na stronie Ray’a Dunn.

Jeżeli już mówimy o programowaniu w .NET pod kÄ…tem dostÄ™pu do usÅ‚ug katalogowych chciaÅ‚bym wszystkim tym tematem zainteresowanym szczerze polecić książkÄ™ The .NET Developer’s Guide to Directory Services Programming, napisanÄ… przez Ray Dunn i Joe Kaplan. ObowiÄ…zkowa pozycja dla wszystkich poczÄ…tkujÄ…cych programistów oraz tych bardziej zaawansowanych.

Opis tego przypadku znalazł się na tym blogu dlatego, że podczas rozwiązywania tego problemu natrafiłem na kilka innych przypadków gdy ktoś próbował go rozwiązać bezskutecznie. Teraz mam nadzieję będzie łatwiej znaleźć zarówno opis jak i obejście \ rozwiązanie alternatywne.

Problem namierzył i rozwiązywał (w czym starałem się trochę pomóc) Czarek Nolewajka z MCS :).

Leave a Reply