2008-11-27 5 views
11

Comment rechercher un utilisateur dans Active Directory?.NET: Comment rechercher un utilisateur dans Active Directory?

Quelques exemples de noms d'utilisateur sont:

Il est important de noter que je ne connais pas le nom du domaine, and i shouldn't be hard-coding it.

Il y a quelques sample code on stack-overflow qui échoue.

using System.DirectoryServices; 

/// <summary> 
/// Gets the email address, if defined, of a user from Active Directory. 
/// </summary> 
/// <param name="userid">The userid of the user in question. Make 
/// sure the domain has been stripped first!</param> 
/// <returns>A string containing the user's email address, or null 
/// if one was not defined or found.</returns> 
public static string GetEmail(string userid) 
{ 
    DirectorySearcher searcher; 
    SearchResult result; 
    string email; 

    // Check first if there is a slash in the userid 
    // If there is, domain has not been stripped 
    if (!userid.Contains("\\")) 
    { 
     searcher = new DirectorySearcher(); 
     searcher.Filter = String.Format("(SAMAccountName={0})", userid); 
     searcher.PropertiesToLoad.Add("mail"); 
     result = searcher.FindOne(); 
     if (result != null) 
     { 
      email = result.Properties["mail"][0].ToString(); 
     } 
    } 

    return email; 
} 

Il vérifie spécifiquement que vous n'avez pas réussi un nom d'utilisateur complet. par exemple.

Bad: avatopia\ian 
Bad: avatar\ian 
Good: ian 
Good: ian 

Parce que vous n'êtes pas autorisé à passer le domaine, il ne peut pas différencier entre les deux utilisateurs

ian 
ian 

Un autre gars a the same question sur sackoverflow, mais la réponse acceptée dit que vous devez

d'abord trouver le contexte de nommage pour le domaine requis

i don't know ce qu'est un "contexte de nommage", et je ne sais pas ce qu'est le "domaine requis". Je préfère vraiment ne pas écrire une expression régulière pour essayer d'analyser les noms d'utilisateur en noms de domaine et de compte, par ex.

domain.something\user-name 

dans

domain.something 
user-name 

parce que je sais qu'il y aura certains cas, de bord que je vais mal. Je veux la méthode appropriée, prévue, de rechercher un utilisateur dans le répertoire actif.

Il y a une belle page sur CodeProject How to do almost everything in Active Directory, mais vous ne pouvez pas rechercher les informations d'un utilisateur par nom d'utilisateur

j'espère que je peux donner mon contrôleur de domaine (whoever it is, where ever it is, whatever it's called) un nom d'utilisateur, et ce sera de savoir quel domaine cet utilisateur appartient à, parler à ce contrôleur de domaine, et faire le travail.

Répondre

5

Cela fonctionne pour moi.

Vous devriez être en mesure de différencier les différents utilisateurs sur différents contrôleurs de domaine (ie domaine/nom d'utilisateur) car les ldappaths seront différents. Et selon vous, vous ne vous souciez pas parce que vous êtes not specifying an ldappath.

Vous faites une offre d'enchère sur l'élimination du domaine/de User.Identity.Name. mais je ne suis pas sûr de ce qui vous inquiète, vous avez juste besoin de couper la ficelle en deux moitiés et la première fois que vous rencontrez "\" il est temps de couper.

et si vous ne voulez pas que vous pouvez utiliser la "bonne façon": http://msdn.microsoft.com/en-us/library/ms973834.aspx

c'est bon aussi http://geekswithblogs.net/mhamilton/archive/2005/09/30/55621.aspx

 /// This is some imaginary code to show you how to use it 

     Session["USER"] = User.Identity.Name.ToString(); 
     Session["LOGIN"] = RemoveDomainPrefix(User.Identity.Name.ToString()); // not a real function :D 
     string ldappath = "LDAP://your_ldap_path"; 
     // "LDAP://CN=<group name>, CN =<Users>, DC=<domain component>, DC=<domain component>,..." 


     Session["cn"] = GetAttribute(ldappath, (string)Session["LOGIN"], "cn"); 
     Session["displayName"] = GetAttribute(ldappath, (string)Session["LOGIN"], "displayName"); 
     Session["mail"] = GetAttribute(ldappath, (string)Session["LOGIN"], "mail"); 
     Session["givenName"] = GetAttribute(ldappath, (string)Session["LOGIN"], "givenName"); 
     Session["sn"] = GetAttribute(ldappath, (string)Session["LOGIN"], "sn"); 


/// working code 

public static string GetAttribute(string ldappath, string sAMAccountName, string attribute) 
    { 
     string OUT = string.Empty; 

     try 
     { 
      DirectoryEntry de = new DirectoryEntry(ldappath); 
      DirectorySearcher ds = new DirectorySearcher(de); 
      ds.Filter = "(&(objectClass=user)(objectCategory=person)(sAMAccountName=" + sAMAccountName + "))"; 

      SearchResultCollection results = ds.FindAll(); 

      foreach (SearchResult result in ds.FindAll()) 
      { 
       OUT = GetProperty(result, attribute); 
      } 
     } 
     catch (Exception t) 
     { 
      // System.Diagnostics.Debug.WriteLine(t.Message); 
     } 

     return (OUT != null) ? OUT : string.Empty; 
    } 

public static string GetProperty(SearchResult searchResult, string PropertyName) 
    { 
     if (searchResult.Properties.Contains(PropertyName)) 
     { 
      return searchResult.Properties[PropertyName][0].ToString(); 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 

Pour le domaine/nom d'utilisateur

public static string GetDomain(string s) 
    { 
     int stop = s.IndexOf("\\"); 
     return (stop > -1) ? s.Substring(0, stop + 1) : null; 
    } 

    public static string GetLogin(string s) 
    { 
     int stop = s.IndexOf("\\"); 
     return (stop > -1) ? s.Substring(stop + 1, s.Length - stop - 1) : null; 
    } 

Pour nom d'utilisateur @ style de domaine

public static string GetDomain(string s) //untested 
    { 
     int stop = s.IndexOf("@"); 
     return (stop > -1) ? s.Substring(stop + 1, s.Length - stop - 1) : null; 
    } 


    public static string GetLogin(string s) //untested 
    { 
     int stop = s.IndexOf("@"); 
     return (stop > -1) ? s.Substring(0, stop) : null; 
    } 
+0

Avez-vous du code qui divise 'ian @ avatopia.local' –

+0

peut-être .. voir ci-dessus – inspite

2

Je ne connais pas de méthode .net pure. Mais vous pouvez utiliser CredUIParseUserName de win32.