2013-07-23 6 views
7

Questo è il codice che sto usando per la connessione a LDAPIl server non è operativo

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); 
      } 

ottengo "Il server non è operativo" messaggio di errore quando si esegue il codice.

Qualcuno può dirmi dove sto sbagliando. E c'è comunque la possibilità di sostituire il codice precedente con la query LDAP diretta.

+0

Quali ** valori ** hai in 'thisHost' e' ServerName' ?? Che aspetto ha la tua stringa LDAP completa che usi per creare 'DirectoryEntry'? –

+0

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

+0

E su ** quale linea esattamente ** fa questo errore si verifica quando si esegue il debug attraverso? –

risposta

2

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.