2013-07-23 15 views
7

Jest to kod używam do podłączenia do LDAPSerwer nie działa

using (DirEntry = new DirectoryEntry(string.Format("LDAP://{0}/{1}", this.Host, ServerName))) 
     { 
      DirEntry.RefreshCache(); 
      if (!string.IsNullOrEmpty(UserName)) 
      { 
       DirEntry.Username = UserName; 
       DirEntry.Password = PassWord; 
      } 
      if (DirEntry.Properties.Contains("objectGUID")) 
      { 
       byte[] guiddatet = (byte[])DirEntry.Properties["objectGUID"].Value; 
       return new Guid(guiddatet); 
      } 

otrzymuję „serwer nie działa” komunikat o błędzie podczas uruchamiania kodu.

Czy ktoś może mi powiedzieć, co robię źle. I czy mimo to należy zastąpić powyższy kod przez bezpośrednie zapytanie LDAP.

+0

Jakie ** wartości ** masz w 'this.Host' i' ServerName' ?? Jak wygląda Twój kompletny łańcuch LDAP, aby utworzyć "DirectoryEntry"? –

+0

Oto jak wygląda mój ciąg LDAP: LDAP: //xyz.sdomena.com/CN=xyz,CN=Services,CN=Default-First-Site,CN=Sites,CN=Configuration,DC=sdomain ,DC= com – user2327795

+0

I na ** która linia dokładnie ** robi błąd podczas debugowania? –

Odpowiedz

2

Powinieneś spróbować podzielić to na osobne części, dzięki czemu łatwiej jest zarządzać logiką i łatwiej zlokalizować miejsce występowania błędów. I zwykle z poniższej podejścia w tej sytuacji:

  • Utwórz obiekt LdapConnection więc można ustawić opcje potrzebne
  • Skonfiguruj NetworkCredential wystąpienie z nazwy użytkownika i hasła administratora
  • wiążą się do katalogu z użytkownik więc można wydać bezpośredni kwerendy LDAP
  • zwrócić SearchResultEntry więc można przetwarzać właściwości

masz kilka opcji, które pomogą Ci osiągnąć ten cel, ale chcę spróbować czegoś takiego:

//Delcare your Network Credential with the administrative Username, Password, and your active directory domain 
var credentials = new NetworkCredential(userName, password, domain); 

//Create a directory identifier and connection, 
var ldapidentifier = new LdapDirectoryIdentifier(serverName, port, false, false); 
var ldapconn = new LdapConnection(ldapidentifier, credentials); 

Dalej, upewnij się, że ustalenia prawa AuthType dla danej instancji. Ponieważ łączysz się przez port 389, po prostu użyj AuthType.Basic.

ldapconn.AuthType = AuthType.Basic; 

Tak jak prosiłeś, istnieje bardzo prosty sposób ustawienia bezpośredniego zapytania LDAP przy użyciu tego podejścia. Zakładam, że szukasz przez sAMAccountName, ale można modyfikować wedle potrzeb:

string ldapFilter = "(&(objectCategory=person)(objectClass=user)(&(sAMAccountName={{UserYouAreTryingToFind}})))"; 

Teraz musimy skonfigurować żądania wyszukiwania i wysłać go odpowiednio:

//Send the search request with our delimited attribute list 
var getUserRequest = new SearchRequest(domain, ldapFilter, SearchScope.Subtree, AttributeList) 
            {SizeLimit = 1}; 

//Suppress any refferal creation from happening during the search 
var SearchControl = new SearchOptionsControl(SearchOption.DomainScope); 
getUserRequest.Controls.Add(SearchControl); 
var userResponse = (SearchResponse)ldapconn.SendRequest(getUserRequest); 

//This is where I load up the entry I've located, 
SearchResultEntry ResultEntry = userResponse.Entries[0]; 

które powinny zwróć użytkownikowi, którego dotyczyło zapytanie, wraz z wszelkimi właściwościami wprowadzonymi do AttributeList. W tym kontekście AttributeList jest po prostu tablicą ciągów znaków (string[]) nazw właściwości - w twoim przypadku będziesz chciał dodać jeden o nazwie "objectGUID".

chodzi o czytanie właściwości na SearchResultEntry można zrobić dokładnie to, co trzeba było pierwotnie:

if(ResultEntry.Attributes.Contains("objectGUID")) 
{ 
    // do some stuff here 
} 

To powinno pomóc Ci idą w dobrym kierunku.

Ponadto, jeśli nie masz jeszcze egzemplarza wireshark, wysoce sugeruję, aby go pobrać - będzie to nieocenione w diagnozowaniu problemów z połączeniem z aktywnym katalogiem.

Powiązane problemy