C # Active Directory: получить доменное имя пользователя?

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

В настоящее время наша служба Windows опрашивает AD, используя LDAP (например, LDAP: //10.32.16.80) и список групп пользователей на этом сервере AD для поиска. Он извлекает всех пользователей из указанных группы, рекурсивно ища в этих группах и другие группы. Затем каждый пользователь добавляется в другой список пользователей, прошедших проверку подлинности приложения.

Эта часть приложения работает успешно. Однако нам нужно понятное доменное имя каждого пользователя (т.е. часть его логина DOMAIN / username)

Итак, если есть пользователь, который является частью TEST домена, по имени Steve: TEST / steve - его логин. Я могу найти Стива в AD, однако мне также нужно, чтобы "TEST" хранился вместе с его информацией AD.

Опять же, я могу найти «Стив» в порядке, используя поисковик в каталоге и предоставленный мне IP-адрес LDAP, но, учитывая IP-адрес LDAP, как я могу найти понятное доменное имя?

Когда я пробую следующий код Я получаю сообщение об ошибке при попытке доступа к 'defaultNamingContext':

System.Runtime.InteropServices.COMException (0x8007202A): механизм аутентификации неизвестен.

Вот код:

    private string SetCurrentDomain(string server)
    {
        string result = string.Empty;
        try
        {
            logger.Debug("'SetCurrentDomain'; Instantiating rootDSE LDAP");
            DirectoryEntry ldapRoot = new DirectoryEntry(server + "/rootDSE", username, password);
            logger.Debug("'SetCurrentDomain'; Successfully instantiated rootDSE LDAP");

            logger.Debug("Attempting to retrieve 'defaultNamingContext'...");
            string domain = (string)ldapRoot.Properties["defaultNamingContext"][0]; //THIS IS WHERE I HIT THE COMEXCEPTION
            logger.Debug("Retrieved 'defaultNamingContext': " + domain);
            if (!domain.IsEmpty())
            {

                logger.Debug("'SetCurrentDomain'; Instantiating partitions/configuration LDAP entry");
                DirectoryEntry parts = new DirectoryEntry(server + "/CN=Partitions,CN=Configuration," + domain, username, password);

                logger.Debug("'SetCurrentDomain'; Successfully instantiated partitions/configuration LDAP entry");
                foreach (DirectoryEntry part in parts.Children)
                {
                    if (part.Properties["nCName"] != null && (string)part.Properties["nCName"][0] != null)
                    {
                        logger.Debug("'SetCurrentDomain'; Found property nCName");
                        if ((string)part.Properties["nCName"][0] == domain)
                        {
                            logger.Debug("'SetCurrentDomain'; nCName matched defaultnamingcontext");
                            result = (string)part.Properties["NetBIOSName"][0];
                            logger.Debug("'SetCurrentDomain'; Found NetBIOSName (friendly domain name): " + result);
                            break;
                        }
                    }
                }
            }
            logger.Debug("finished setting current domain...");
        }
        catch (Exception ex)
        {
            logger.Error("error attempting to set domain:" + ex.ToString());
        }
        return result;
    }

edit

Я добавил этот пример метода, чтобы попытаться сделать предложение, но получаю исключение: «Неопределенная ошибка», когда я нажимаю вызов «FindAll ()» в поисковике. Передаваемая строка: "CN = TEST USER, CN = Users, DC = tempe, DC = ktregression, DC = com"

        private string GetUserDomain(string dn)
    {
        string domain = string.Empty;
        string firstPart = dn.Substring(dn.IndexOf("DC="));
        string secondPart = "CN=Partitions,CN=Configuration," + firstPart;
        DirectoryEntry root = new DirectoryEntry(secondPart, textBox2.Text, textBox3.Text);
        DirectorySearcher searcher = new DirectorySearcher(root);
        searcher.SearchScope = SearchScope.Subtree;
        searcher.ReferralChasing = ReferralChasingOption.All;
        searcher.Filter = "(&(nCName=" + firstPart + ")(nETBIOSName=*))";
        try
        {
            SearchResultCollection rs = searcher.FindAll();
            if (rs != null)
            {
                domain = GetProperty(rs[0], "nETBIOSName");
            }
        }
        catch (Exception ex)
        {

        }


        return domain;
23
задан ghost_mv 22 November 2010 в 21:56
поделиться