Si dovrebbe provare a suddividerlo in parti separate, quindi è più semplice gestire la logica e individuare più facilmente dove si verificano gli errori. Io di solito vado con l'approccio seguito in questa situazione:
- Creare un oggetto
LdapConnection
in modo da poter impostare le opzioni necessarie
- Setup un'istanza
NetworkCredential
con un nome utente e password amministrativi
- Bind alla directory con l'utente in modo da poter emettere un'interrogazione diretta LDAP
- Return un
SearchResultEntry
in modo da poter elaborare le proprietà
Hai una alcune opzioni per aiutare a realizzare questo, ma mi piacerebbe provare qualcosa di simile:
//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);
Quindi, assicurarsi che si sta impostando il diritto AuthType
per il vostro caso particolare. Dal momento che ti stai collegando sulla porta 389, usa solo AuthType.Basic
.
ldapconn.AuthType = AuthType.Basic;
Come richiesto, esiste un modo molto semplice per impostare una query LDAP diretta utilizzando questo approccio. Sto assumendo che stai cercando da sAMAccountName
, ma è possibile modificare questo in base alle esigenze:
string ldapFilter = "(&(objectCategory=person)(objectClass=user)(&(sAMAccountName={{UserYouAreTryingToFind}})))";
Ora non ci resta che impostare la richiesta di ricerca, e inviarlo di conseguenza:
//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];
Questo dovrebbe restituisci l'utente per il quale hai effettuato una query, insieme alle proprietà che hai inserito in AttributeList
. In questo contesto, AttributeList
è solo un array di stringhe (string[]
) di nomi di proprietà - nel tuo caso ti consigliamo di aggiungerne uno chiamato "objectGUID".
Per quanto riguarda la lettura delle proprietà sul SearchResultEntry
, si può fare esattamente quello che aveva in origine:
if(ResultEntry.Attributes.Contains("objectGUID"))
{
// do some stuff here
}
che dovrebbe aiutare a farti andare nella giusta direzione.
Inoltre, se non si dispone già di una copia di wireshark, suggerisco caldamente di scaricarlo - sarà prezioso per la diagnosi dei problemi di connessione con la directory attiva.
Quali ** valori ** hai in 'thisHost' e' ServerName' ?? Che aspetto ha la tua stringa LDAP completa che usi per creare 'DirectoryEntry'? –
Ecco come appare la mia stringa LDAP: LDAP: //xyz.sdomain.com/CN=xyz,CN=Servers,CN=Default-First-Site,CN=Sites,CN=Configuration,DC=sdomain,DC= com – user2327795
E su ** quale linea esattamente ** fa questo errore si verifica quando si esegue il debug attraverso? –