2008-11-27 7 views
11

Что Вы ищете для пользователей в Active Directory?.NET: Как найти пользователя в Active Directory?

Некоторые примеры являются имена пользователей:

Важно отметить, что я не знаю названия домена, and i shouldn't be hard-coding it.

Существует некий sample code on stack-overflow, который терпит неудачу.

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

Он специально гарантирует, что вы не прошли полное имя пользователя. например

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

Потому что вы не можете передать домен, он не может различать между двумя пользователями

ian 
ian 

Другой парень the same question на sackoverflow, но принятый ответ говорит, что вы должны

первым найти контекст именования нужный домен

i don't know Что такое «контекст именования», и я не знаю, что такое «требуемый домен». я бы предпочел не писать регулярное выражение, чтобы попытаться проанализировать имена пользователей в именах доменов и именах учетных записей, например.

domain.something\user-name 

в

domain.something 
user-name 

, потому что я знаю, что будет какой-то крайний случай, что я буду ошибиться. Я хочу, чтобы правильный, предназначенный, способ поиска пользователя в активном каталоге.

Там хорошая страница на CodeProject How to do almost everything in Active Directory, но вы не можете поиск информации пользователя по имени пользователя

я надеюсь, что я могу дать контроллер домена (whoever it is, where ever it is, whatever it's called) имя пользователя, и он будет выяснить, какой домен к которому принадлежит пользователь, поговорить с этим контроллером домена и выполнить эту работу.

ответ

5

Это работает для меня.

Вы должны иметь возможность различать разных пользователей на разных контроллерах домена (например, домен/имя пользователя), поскольку ldappaths будут отличаться. И, согласно вам, вас не волнует, потому что вы not specifying an ldappath.

Вы делаете ставку на удаление домена/пользователя User.Identity.Name. но я не уверен, что вас беспокоит, вам просто нужно нарезать строку на две половины, и в первый раз, когда вы столкнулись с «пора», нарезать.

и если вам не нравится, что вы можете использовать "правильный путь": http://msdn.microsoft.com/en-us/library/ms973834.aspx

это тоже хорошо 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; 
     } 
    } 

Для домена/имя пользователя

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

Для имени пользователя @ доменного стиля

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

У вас есть код, который разбивает `ian @ avatopia.local` – 2008-11-27 20:31:16

Смежные вопросы