2010-11-29 47 views
5

Necesito verificar los usuarios de la compañía utilizando solo su nombre de usuario, no su contraseña.Cómo verificar si un usuario existe en LDAP

por eso es necesario un método como este

public bool UserExists(string username) 
{ ... } 

Soy consciente de la System.DirectoryServices espacio de nombres, pero no saben por dónde empezar.

¿Alguna idea?

Hay más de 80,000 registros, así que trate de tener esto en cuenta.

Gracias.

Editar:

lo he hecho - mi código es:

private bool UserExists(string userName, string domain) 
{ 
    try 
    { 
     DirectoryEntry.Exists("WinNT://" + domain + ".[hidden].com/" + userName); 
     return true; 
    } 
    catch (COMException) 
    { 
     return false; 
    } 
} 

No sé si es correcto, pero parece que funciona hasta ahora.

respuesta de Michael tiene dos partes relevantes:

Actualización # 2:

realidad utilicé esta:

public static bool LoggedOnUserExists() 
{ 
    var domain = new PrincipalContext(ContextType.Domain); 

    UserPrincipal foundUser = UserPrincipal.FindByIdentity(domain, IdentityType.SamAccountName, Environment.UserName); 

    return foundUser != null; 
} 
+2

** NO ** debe usar el proveedor de WinNT más, es estrictamente por compatibilidad con versiones anteriores, pero normalmente no funciona bien en una red AD –

Respuesta

5

En .NET 3.5 y arriba, se pueden utilizar los espacios de nombres System.DirectoryServices.AccountManagement hacer esto simplemente:

public bool UserExists(string username) 
{ 
    // create your domain context 
    using (PrincipalContext domain = new PrincipalContext(ContextType.Domain)) 
    { 
     // find the user 
     UserPrincipal foundUser = UserPrincipal.FindByIdentity(domain, IdentityType.Name, username); 

     return foundUser != null; 
    } 
} 

Esto funciona con la regularidad nombre de usuario John Doe, o alternativamente puede usar la dirección de correo electrónico del usuario ([email protected]), o su nombre completo (CN=John Doe) - vea lo que la enumeración IdentityType tiene que hacer o ffer :-)

+0

gracias marc, esto es mucho mejor. – Nobody

+0

Supongo que esto busca en el dominio actual? ¿Hay alguna forma de usar este método y especificar un dominio? – Eddie

+1

@Eddie: seguro - el ['PrincipalContext' tiene numerosos constructores sobrecargados (perfectamente documentado en MSDN)] (http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.principalcontext.aspx), que le permiten especificar un dominio y/o un contenedor en ese dominio para usar en la búsqueda –

Cuestiones relacionadas