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.
Jakie ** wartości ** masz w 'this.Host' i' ServerName' ?? Jak wygląda Twój kompletny łańcuch LDAP, aby utworzyć "DirectoryEntry"? –
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
I na ** która linia dokładnie ** robi błąd podczas debugowania? –