2009-06-30 18 views
8

Mi sto connettendo a una directory LDAP in C#, quindi ho utilizzato la classe DirectoryEntry.Come sapere se il mio DirectoryEntry è realmente connesso alla mia directory LDAP?

Quando si esegue la "nuova DirectoryEntry" con indirizzo, accesso e password, è necessario connettersi alla directory LDAP.

Tuttavia, anche se la connessione non ha funzionato, restituisce senza problemi e viene impostata la variabile directoryentry.

Quindi so che la mia connessione è davvero aperta? In questo momento, sto usando un trucco molto molto brutto: ho inserito un "if (mydirectory.SchemaEntry)" che genera un'eccezione se la connessione non è stata stabilita, perché alcuni membri di DirectoryEntry, come SchemaEntry, sono aren impostato se la connessione fallisce. Ma 1: deve essere 11/10 sulla scala della bruttezza 2: ci vuole un sacco di tempo prima di fallire.

Quindi qual è il modo migliore per farlo? Sicuramente, Microsoft deve aver fornito qualcosa (anche se sto usando una directory LDAP e non una Active Directory) per sapere se sono realmente connesso?

risposta

1

Ok, quindi la soluzione di marc_s è stato di circa quello che stavo facendo (tranne che cercavo SchemaEntry e non NativeObject). Ma il ritardo di timeout è troppo lungo (la query viene eseguita per riempire i valori del completamento automatico per un modulo). Penso che in realtà preferisco fingere che la connessione sia aperta e lasciare che la query funzioni. In questo modo, posso impostare il mio ritardo di timeout più piccolo.

11

Solo "aggiornamento" di una DirectoryEntry fa NON creare una connessione all'archivio LDAP.

Solo dopo aver iniziato a utilizzare le sue proprietà o quando si accede esplicitamente alla proprietà .NativeObject, si otterrà effettivamente una connessione all'archivio LDAP.

Al fine di assicurarsi che si è connessi, basta leggere il (DirectoryEntry).NativeObject in una clausola try ... catch - se le bombe fuori, hanno un problema, altrimenti la connessione è ora installato e attivo.

Sfortunatamente, per quanto ne so, non esiste una proprietà o un metodo che è possibile chiamare per capire se ci si è connessi correttamente a LDAP utilizzando DirectoryEntry.

Marc

+0

+1 per la precisione. Grazie. – Ksempac

+0

Spiegazione pulita – Roshe

2

È possibile controllare DirectoryEntry.Properties.Count. Se è> 0, è un oggetto valido. .Properties non è mai nullo: sarai in grado di leggere il conteggio anche se non sei connesso a una DirectoryEntry valida e un DE valido avrà sempre almeno una proprietà.

Nessun tentativo/cattura o eccezioni necessarie.

+0

Sfortunatamente non vero (testato su .NET 4, nel 2015); è un peccato per me, dato che sto cercando un test non-exception. Mentre DirectoryEntry.Properties di per sé non è nullo, anche il tentativo di accedere al relativo Conteggio causa la valutazione, e questo si verifica con errore (ad es. "Il server non è operativo" se disconnesso). – JonBrave

1

È possibile controllare DirectoryEntry.Properties.Count. Se è> 0, per un oggetto valido. Ma continuiamo a dire che il server LDAP non funziona. non è possibile identificare con uno qualsiasi dei suoi properties.Instead si può prendere con il blocco catch try

try   
{  
    entry = new DirectoryEntry("priorityLDAPServer", sUserName, sPassword, AuthenticationTypes.None);  
    if(entry.Properties.Count > 0) 
    {    
     object o = entry.NativeObject;   
    ` next need to check user record in application database`  
    } 
}   
    catch (System.Runtime.InteropServices.COMException comex)  
{  

//throws you the error if LDAP server is down or wrong "Server is invalid "   
// you can further do a nested try catch within this block if you to try a  optional LDAP server.* 
}  

Spero che questo ti aiuta

Problemi correlati