.NET: как найти пользователя в Active Directory?

Как найти пользователя в Active Directory?

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

Важно отметить, что я не знаю имени домена, и я не должен жестко кодировать его.

В стеке есть пример кода . переполнение, которое не удается.

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

У другого парня есть тот же вопрос о sackoverflow. , но принятый ответ говорит, что вы должны

сначала найдите контекст именования для требуемого домена

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

domain.something\user-name

в

domain.something
user-name

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

В CodeProject есть хорошая страница Как делать почти все в Active Directory, но вы не можете искать информацию о пользователе по имени пользователя

я надеюсь, что смогу передать свой контроллер домена (кто бы он ни был , где бы он ни находился, как бы он ни назывался) имя пользователя, и он выяснит, к какому домену принадлежит этот пользователь, пообщается с этим контроллером домена и выполнит свою работу.


person Ian Boyd    schedule 27.11.2008    source источник


Ответы (2)


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

Вы должны иметь возможность различать разных пользователей на разных контроллерах домена (т. е. домен/имя пользователя), потому что ldapppaths будут разными. И, по вашему мнению, вам все равно, потому что вы не указан путь к ldapp.

Вы заключаете сделку по удалению домена/пользователя.Идентификация.Имя. но я не уверен, о чем вы беспокоитесь, вам просто нужно разрезать строку на две половины, и в первый раз, когда вы сталкиваетесь с '\', пора резать.

и если вам это не нравится, вы можете использовать «правильный способ»: 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;
    }
person inspite    schedule 27.11.2008

Я не знаю чистого метода .net. Но вы можете использовать CredUIParseUserName Win32.

person Igal Serban    schedule 27.11.2008