2008-09-25 31 views
10

Mam aplikację WWW działającą na podstawie uwierzytelniania systemu Windows przy użyciu naszej usługi Active Directory. Mam nowy wymóg pobierania pewnych danych osobowych z wpisu Active Directory. Jaki byłby najprostszy sposób uzyskania dostępu do tych informacji?Active Directory: Pobierz informacje o użytkowniku

Odpowiedz

17

Dostęp użytkownika bezpośrednio przez DirectoryEntry wydaje się najprostszym podejściem. Oto kilka ciekawostek związanych z AD, których nauczyłem się od mojego pierwszego projektu związanego z reklamami:

  • W URI wpisz LDAP małymi literami. W przeciwnym razie dostaniesz błąd tajemnicy. Spędziłem więcej niż jeden dzień nad tym przygnębiającym problemem ...
  • Aby usunąć właściwość o pojedynczej wartości, ustaw ją na pusty ciąg, a nie na zero. Null powoduje wyjątek.
  • Aby wyczyścić właściwość z wieloma wartościami, należy użyć metody DirectoryEntry.Property.Clear().
  • Odwołanie do schematu Active Directory określa, jaki typ danych ma być wartość i czy jest wielowartościowa, czy pojedyncza.
  • Nie trzeba ręcznie odświeżaćCache() na stanowisku katalogu, ale jeśli kiedykolwiek użyjesz go i określisz właściwości do buforowania, wiedz, że nie będzie automatycznie pobierał żadnych innych właściwości w przyszłości.
  • Wyjątek COMException można wywołać w dowolnym momencie podczas korzystania z klas w System.DirectoryServices. Miej oko na te bloki try. Nie zakładaj, że cokolwiek jest bezpieczne.

Prawdopodobnie będziesz musiał użyć DirectorySearchera, aby uzyskać wpis do katalogu użytkownika, jeśli nie znasz jego ścieżki (co nie byłoby możliwe, po zalogowaniu się). Używanie go było dość łatwe, ale uważaj na dziwactwa w składni LDAP; mianowicie, konieczności kodowania znaków spoza ASCII (i innych?). Łańcuch wyszukiwania, którego użyjesz będzie prawdopodobnie podobny do: (& (sAMAccountName = cokolwiek) (class = user)). To jest poza moim zasięgiem i może być trochę niepoprawne.

Przydadzą się Active Directory schema reference. Zrozum, że schemat można modyfikować i rozszerzać (np. Instalacja programu Exchange doda informacje o skrzynce pocztowej do użytkowników).

AD Explorer to przydatne narzędzie, które można wykorzystać do debugowania i zarządzania danymi AD na niskim poziomie. Znalazłem to przydatne, gdy wiem, którą właściwość chcę ustawić, ale nie mogę znaleźć odpowiedniego okna dialogowego w narzędziu zarządzania AD.

+0

Właśnie skończyłem dodawać kod, który jest w zasadzie tym, co powiedziałeś.Użyłem aplikacji DirectorySearcher i uzyskałem informacje, których potrzebowałem. Na szczęście muszę tylko pobrać bardzo podstawowe informacje. –

+0

dla mnie, pisanie ldap małymi literami rzuciło wyjątek COMException. –

0

Użyłem standardowej biblioteki LDAP do pobrania informacji z serwera Active Directory, ale trzeba sprawdzić, czy potrzebne dane są dostępne za pośrednictwem schematu serwera LDAP. Ogólnie można uzyskać wszelkie informacje przechowywane w InetOrganizationalPerson i większość informacji związanych z grupami, do których należą.

5

Poniższy fragment może być przydatny jako starter.

public static bool IsUserInGroup(string lanid, string group) 
{ 
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH); 
    if(entry != null) 
    { 
     [email protected]"LDAPUSER"; 
     entry.Password="LDAPPASSWORD"; 
     DirectorySearcher srch = new DirectorySearcher(entry); 
     srch.Filter = String.Format("(&(objectClass=person)(sAMAccountName={0}))", lanid); 
     srch.PropertiesToLoad.Add("memberOf"); 

     SearchResult result = srch.FindOne(); 
     if(result != null) 
     { 
      if(result.Properties.Contains("memberOf")) 
      { 
       string lookfor = String.Format("cn={0},", group.ToLower()); 
       foreach(string memberOf in result.Properties["memberOf"]) 
       { 
        if(memberOf.ToLower().StartsWith(lookfor)) 
         return true; 
       } 
      } 
     } 
     return false; 
    } 
    throw new Exception(String.Format("Could not get Directory lanid:{0}, group{1}", lanid, group)); 
} 
Powiązane problemy