2010-11-29 21 views
5

Je dois vérifier les utilisateurs de l'entreprise en utilisant uniquement leur nom d'utilisateur et non leur mot de passe.Comment vérifier si un utilisateur existe sur LDAP

donc je besoin d'une méthode comme celle

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

Je suis conscient de l'espace de noms System.DirectoryServices mais ne sais pas où commencer.

Des idées?

Il existe plus de 80 000 enregistrements, alors gardez cela à l'esprit.

Merci.

Edit:

Je l'ai fait - mon code est:

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

Je ne sais pas si elle est correcte, mais il semble fonctionner jusqu'à présent.

La réponse de Michael a deux parties concernées:

Mise à jour # 2:

J'ai utilisé ceci:

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

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

    return foundUser != null; 
} 
+2

Vous ne devez PAS ** utiliser ** le fournisseur WinNT - c'est strictement pour rétrocompatibilité, mais cela ne fonctionne généralement pas bien dans un réseau AD –

Répondre

5

Dans .NET 3.5 et, vous pouvez utiliser les System.DirectoryServices.AccountManagement namespaces pour ce faire, tout simplement:

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

Cela fonctionne avec le régulier nom d'utilisateur John Doe, ou bien vous pouvez utiliser l'adresse e-mail de l'utilisateur ([email protected]) ou son nom unique (CN=John Doe) - voir ce que l'énumération IdentityType a ffer :-)

+0

merci marc, c'est beaucoup mieux. – Nobody

+0

Je suppose que cette recherche sur le domaine en cours? Est-il de toute façon d'utiliser cette méthode et spécifier un domaine? – Eddie

+1

@Eddie: bien sûr - le ['PrincipalContext' a de nombreux constructeurs surchargés (parfaitement documentés sur MSDN)] (http://msdn.microsoft.com/fr-fr/library/system.directoryservices.accountmanagement.principalcontext.aspx), qui vous permettent de spécifier un domaine et/ou un conteneur dans ce domaine à utiliser pour la recherche –