Вопрос по c#, asp.net, active-directory – Запросить Active Directory, чтобы напрямую получить свойство электронной почты отличительного имени?

6

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

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

Поиск записи менеджера пользователя в Active Directory

Этот пост является моей точной проблемой, но это старый пост, и больше нет описания того, как двигаться дальше, и ОП знал, что делать дальше с выдающимся именем. Правда в том, что я не верю.

Поэтому мой вопрос заключается в том, как получить свойство адреса электронной почты из различающегося имени, которое я до сих пор хранил в виде строки с префиксом LDAP: // + & quot; MyDistinguishedName & quot ;?

 public string GetManagerEmail(string ActiveDirectoryPath, string ActiveDirectoryDomain, bool email)
    {

        DirectoryEntry entry = new DirectoryEntry(ActiveDirectoryPath);

        try
        {
            DirectorySearcher search = new DirectorySearcher(entry);

            search.Filter = "(SAMAccountName=" + workerID + ")";
            search.PropertiesToLoad.Add("cn");
            search.PropertiesToLoad.Add("givenname");  //firstname
            search.PropertiesToLoad.Add("sn");//surname
            search.PropertiesToLoad.Add("manager");
            search.PropertiesToLoad.Add("email");
            SearchResult result = search.FindOne();

            if (null == result)
            {
                return workerID;
            }
            if (email)
            {
                return (string)result.Properties["email"][0];
            }
            else
            {
                return (string)result.Properties["manager"][0];
                //return (string)result.Properties["manager"].IndexOf[];
            }
        }
        catch (Exception ex)
        {
            throw new Exception("Error. " + ex.Message);

        }
        finally
        {
            entry.Close();
        }
    }

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

Спасибо

Это мое решение для тех, кто может быть заинтересован

            string domainAndUsername = ActiveDirectoryDomain + @"\" + workerID;
        DirectoryEntry manager = new DirectoryEntry(ActiveDirectoryPath);

        try
        {
            if (manager != null)
            {
                // get e-mail of manager 
                if (manager.Properties["mail"] != null && manager.Properties["mail"].Count > 0)
                {
                    string managersEMail = manager.Properties["mail"].Value.ToString();
                    return managersEMail;
                }
            }

            //No email available, use contract manager
            return string.Empty;

        }
        catch (Exception ex)
        {
            throw new Exception("Error. " + ex.Message);

        }
        finally
        {
            manager.Close();
        }
Пожалуйста, добавьте ваше решение в качестве ответа ниже. Bill the Lizard

Ваш Ответ

1   ответ
8

Там нет "магии" ярлык для получения электронной почты менеджера.

Как только вы получили DN (отличительное имя) вашего менеджера (в строковой переменной с именемmanagerDN), вам нужно снова связать с Active Directory, создав другой экземплярDirectoryEntry получить информацию о пользователе менеджера.

Попробуйте что-то вроде этого:

 .....(your other code up here)......
 else
 {
     string managerDN = result.Properties["manager"][0].ToString();

     // fully-qualified DN for manager
     string managerFQDN = "LDAP://" + managerDN;

     DirectoryEntry manager = new DirectoryEntry(managerFQDN);

     if(manager != null)
     {
        // get e-mail of manager
        if(manager.Properties["mail"] != null && 
           manager.Properties["mail"].Count > 0)
        {
           string managersEMail = manager.Properties["mail"].Value.ToString();
           return managersEMail;
        }
     }

     // we couldn't retrieve the manager's e-mail  
     return string.Empty;
}
Также я настоятельно рекомендую manager.RefreshCache (string [] {& quot; mail & quot;}); В противном случае он будет медленным, потому что все свойства AD будут загружены, а не только "почта". недвижимость, которую вы ищете
Благодаря marc_s, строковые менеджеры EMail имеют значение «System.DirectoryServices.PropertyValueCollection», какие-либо предположения о том, чего не хватает? dotnetnewb
Также оберните DirectorySearcher и DirectoryEntry в использование операторов
Вы можете использовать if (manager.Properties.Contains (& quot; mail & quot;)) вместо if (manager.Properties [& quot; mail & quot;]! = Null & amp; manager.Properties [& quot; mail & quot;]. Count & gt; 0)
Взломал его менеджер. Свойства [& quot; почта & quot;]. Value.ToString (); СПАСИБО за помощь = 1 и ответ XD dotnetnewb

Похожие вопросы