Wednesday, December 27th, 2006...6:00 pm

Znak slash w distinguished name obiektu AD

Jump to Comments

Rozbudowując ostatnio kawałek oprogramowania, które korzysta z Active Directory natrafiłem na problem który powodował, że przy dostępie do niektórych obiektów zgłaszany był wyjątek z kodem błędu E_ADS_BAD_PATHNAME.

Po krótkim przyjrzeniu siÄ™ obiektom, dla których ten wyjÄ…tek byÅ‚ zgÅ‚aszany zauważyÅ‚em że charkateryzujÄ… siÄ™ one tym, że w wartoÅ›ci atrbybutu distinguishedName tych obiektów zawierajÄ… znak slash ‘/’. Obiekty te reprezentowaÅ‚y oddziaÅ‚y organizacji i w nazwie zawieraÅ‚y adres tej lokalizacji, czyli na przykÅ‚ad:

CN=Post at 1/2,OU=Location1,OU=Employees,DC=w2k,DC=pl

Za każdym razem, gdy tworzony był obiek DirectoryEntry z użyciem nazwy obiektu zawartej w wartości distinguishedName zawierającej znak slash rzucany był wyjątek:

Unhandled Exception: System.Runtime.InteropServices.COMException (0x80005000):

Unknown error (0x80005000)

at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)

at System.DirectoryServices.DirectoryEntry.Bind()

Na pierwszy rzut oka wyglÄ…daÅ‚o to trochÄ™ dziwnie, ponieważ znak ten nie jest wskazany na liÅ›cie zastrzeżonych znaków, których obecność w distinguishedName wymaga (i tutaj ogÅ‚aszam konkurs na polski odpowiednik sÅ‚owa escape) użycia dodatkowego znaku “ucieczki” 🙂 (ang. escape), czyli ‘\’. Lista ta, wraz z opisem jak należy radzić sobie z takimi znakami przedstawiona jest w artykule MSDN opisujÄ…cym nazwy wyróżniajÄ…ce LDAP. W przypadku obiektów powodujÄ…cych problem wartość DN zwracana byÅ‚a bez dodatkowych znaków escape zarówno przez narzÄ™dzia takie jak LDP.EXE czy ADSIEdit, jak i w przypadku wyszukiwania z użyciem DirectorySearcher. W przypadku znaków wspomnianych w wymienionym artykule MSDN narzÄ™dzia te zwracajÄ… “zabezpieczonÄ…” Å›cieżkÄ™, która nie powoduje problemu.

Jak więc się można domyśleć znak slash również zalicza się do znaków specjalnych i wymaga specjalnego traktowania, i w naszym kodzie skryptu lub programu musimy sami o to zadbać.

Innym rozwiązaniem, które pozwoli nam na bezproblemowe połączenie się do takich obiektów jest wykonanie połączenia z użyciem GUID lub wartość atrybutu ADsPath obiektu. W przypadku wspomnianego wyżej obiektu ADsPath będzie zawierało następującą wartość:

LDAP://CN=Post at 1\/2,OU=Location1,OU=Employees,DC=w2k,DC=pl

Jak widać wszystkie znak sÄ… już poprawnie zabezpieczone z użyciem ‘\’.

Właściwie to powinienem się tego dowiedzieć już wcześniej, ale pomimo że wcześniej spotykałem się już z obiektami z różnymi specjalnymi znakami w wartości DN to nigdy z takimi, które zawierały slash.

Mam nadzieję, że wiadomości zawarte w tym poście przydadzą się początkującym lub osobom, które napotkają ten problem. Ci którzy już na niego trafili zapewne już sami znaleźli odpowiednie rozwiązanie.

2 Comments

  • Czy DirectorySearcher zostanie kiedyÅ› poprawiony uwzglÄ™dniaÅ‚ ten specjalny znak specjalny?

  • A nie wiem :). Generalnie jeżeli posÅ‚ugujesz siÄ™ DirectorySearcher żeby uzyskać DN obiektów do dalszych zapytaÅ„, to możesz posÅ‚ugiwać siÄ™ atrybutem AdsPath który zawiera poprawnÄ… Å›cieżkÄ™ z uwzglÄ™dnieniem tego znaku.

Leave a Reply