2010-11-26 10 views
8

Esta mañana descubrí un buen método (DirectoryEntry.Exists), que debería poder verificar si existe un objeto de Active Directory en el servidor. Así que he intentado con un simple:Cómo proporcionar DirectoryEntry.Exists con credenciales?

if (DirectoryEntry.Exists(path)) {} 

Por supuesto que carece de cualquier sobrecargas para proporcionar credenciales con él. Porque, si no se proporcionan credenciales obtengo esta excepción:

Error de inicio de sesión: nombre de usuario desconocido o contraseña incorrecta. (System.DirectoryServices.DirectoryServicesCOMException)

¿Hay alguna otra opción que me da la posibilidad de autenticar mi código en el servidor de AD? ¿O para verificar la existencia de un objeto?

Respuesta

13

En este caso no se puede utilizar el método estático existe como usted ha dicho:

DirectoryEntry directoryEntry = new DirectoryEntry(path); 
directoryEntry.Username = "username"; 
directoryEntry.Password = "password"; 

bool exists = false; 
// Validate with Guid 
try 
{ 
    var tmp = directoryEntry.Guid; 
    exists = true; 
} 
catch (COMException) 
{ 
    exists = false; 
} 
+0

Esa sería mi solución preferida, pero esta propiedad no me parece estática, eche un vistazo: http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.username.aspx –

+0

Oh Veo que no importa. Sí, tendrás que crear una nueva DirectoryEntry. Editado – JoeBilly

+0

Gracias por una buena muestra de código. Aparentemente esa es la única forma. Es una pena que no sea posible por defecto.métodos de red, pero al menos una buena solución hace el trabajo! –

0

Si el usuario que ejecutó el proceso no tiene permisos para llamar a DirectoryEntry.Exists, puede usar la suplantación.

Esto puede ser útil (discute la suplantación en un contexto dC): http://www.codeproject.com/KB/system/everythingInAD.aspx

Por cierto, si ya tiene las credenciales de un usuario que tiene acceso a todo lo que necesita, ¿por qué no sólo el proceso con ese usuario (por ejemplo, /correr como)?

+0

Gracias. Encontré eso también, pero no me proporciona una solución de descenso para mi problema. Runas realmente no es una opción en mi proyecto actual ... Suplantación tampoco, pero parece ser la mejor hasta ahora. –

1

Así que la respuesta a la pregunta: imposible.

Finalmente, escriba un método propio para obtener DirectoryEntry por nombre distinguido, con las credenciales especificadas. En ambos casos de existencia/inexistencia obtuve una instancia de DirectoryEntry. Para comprobar si se devuelve un objeto válido, lo intenté de forma simple ... ver si resulta en una excepción. Si es así, no es válido.

Cheque desagradable, pero funciona. Lástima que el método DirectoryEntry.Exists .net por defecto no proporciona una sobrecarga para proporcionar credenciales al igual que el constructor DirectoryEntry ...

Cuestiones relacionadas