2009-06-30 23 views
8

Me estoy conectando a un directorio LDAP en C#, así que he usado la clase DirectoryEntry.¿Cómo saber si mi DirectoryEntry está realmente conectado a mi directorio LDAP?

Cuando realiza la "nueva entrada de directorio" con dirección, inicio de sesión y contraseña, se supone que debe conectarse al directorio LDAP.

Sin embargo, incluso si la conexión no funcionó, vuelve sin problemas y se establece la variable directoryentry.

Entonces, ¿sé que mi conexión realmente está abierta? En este momento, estoy usando un truco muy muy feo: puse un "if (mydirectory.SchemaEntry)" que genera una excepción si la conexión no se estableció, porque algunos de los miembros de DirectoryEntry, como SchemaEntry, aren 't set si la conexión falló. Pero 1: tiene que ser 11/10 en la escala de fealdad 2: eso lleva mucho tiempo antes de fallar.

Entonces, ¿cuál es la mejor manera de hacerlo? Seguramente, Microsoft debe haber proporcionado algo (incluso si estoy usando un directorio LDAP y no un Active Directory) para saber si estoy realmente conectado.

Respuesta

1

Ok por lo que la solución de marc_s fue aproximadamente de lo que estaba haciendo (excepto que estaba buscando y no SchemaEntry NativeObject). Pero el tiempo de espera es demasiado largo (la consulta se ejecuta para completar los valores de autocompletado de un formulario). Creo que en realidad prefiero fingir que la conexión está abierta y dejar que se ejecute la consulta. De esa forma, puedo establecer mi propio retraso de tiempo de espera más pequeño.

11

Solo "actualizar" una entrada de directorio hace NO crear una conexión a la tienda LDAP.

Solo una vez que comience a utilizar sus propiedades, o cuando acceda explícitamente a la propiedad .NativeObject, obtendrá una conexión al almacén LDAP.

Para asegurarse de que está conectado, simplemente lea (DirectoryEntry).NativeObject en una cláusula try ... catch: si se dispara, tiene un problema; de lo contrario, su conexión estará activada.

Lamentablemente, que sepa, no hay ninguna propiedad o método al que pueda llamar para determinar si se ha conectado correctamente o no a LDAP utilizando DirectoryEntry.

Marc

+0

1 para la precisión. Gracias. – Ksempac

+0

Explicación limpia – Roshe

2

Puede marcar DirectoryEntry.Properties.Count. Si es> 0, es un objeto válido. .Propiedades nunca es nula: podrá leer el recuento incluso si no está conectado a un DirectoryEntry válido, y un DE válido siempre tendrá al menos una propiedad.

No se necesita prueba/captura o se requieren excepciones.

+0

Desafortunadamente no es cierto (probado en .NET 4, en 2015); lo cual es una pena para mí, ya que estoy buscando una prueba sin excepción. Si bien DirectoryEntry.Properties en sí mismo no es nulo, incluso el intento de acceder a Count causa la evaluación y se agota el tiempo de espera (por ejemplo, "El servidor no está operativo" si está desconectado). – JonBrave

1

Puede marcar DirectoryEntry.Properties.Count. Si es> 0, para un objeto válido. Pero aún así digamos que su servidor LDAP no funciona. no se puede identificar con cualquiera de sus properties.Instead puede atraparlo usando el bloque intento de captura

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.* 
}  

la esperanza que esto le ayuda

Cuestiones relacionadas