Как получить информацию об адресе в Active Directory, используя UserPrincipal в С#

Я занят созданием функции поиска в моем приложении с графическим интерфейсом, которое работает на моем Windows Server, для добавления, удаления, обновления и поиска пользователей. Я почти закончил создание приложения, но не могу решить проблему получения сведений из другого свойства, которое не указано в UserPrincipal, например свойство «Адрес». Как я могу попасть в эту собственность?

Я пробовал много стилей кодирования, чтобы попасть в данное свойство «Адрес», но он все еще не работает.

Вот код:

private void ListOfUsers(String ou)
{
    List<string> users = new List<string>();

    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "EMRE", "OU=" + ou + ",dc=emre,dc=han");
    UserPrincipal qbeUser = new UserPrincipal(ctx);
    PrincipalSearcher search = new PrincipalSearcher(qbeUser);


    foreach (UserPrincipal user in search.FindAll())
    {
        users.Add(user.UserPrincipalName);
        users.Add("********");
        users.Add(user.GivenName);
        users.Add(user.Surname);

        if (user.GetUnderlyingObjectType() == typeof(DirectoryEntry))
        {
            using (var entry = (DirectoryEntry)user.GetUnderlyingObject())
            {
                if (entry.Properties["Address"] != null)
                    users.Add(entry.Properties["Street"].Value.ToString());
            }
        }
        users.Add(user.VoiceTelephoneNumber);
        users.Add(user.EmailAddress);
        users.Add(ou);

    }

    string[] row = users.ToArray();
    var listViewItem = new ListViewItem(row);
    lstStudents.Items.Add(listViewItem);

}

Я всегда получаю значение null, даже если свойство не равно null


person Emre    schedule 15.10.2019    source источник


Ответы (1)


Атрибут, который вам нужен, на самом деле называется streetAddress. Вы также можете использовать Properties.Contains, чтобы проверить, существует ли значение (хотя эффект действительно такой же, как при проверке null, просто его легче читать).

if (entry.Properties.Contains("streetAddress"))
    users.Add(entry.Properties["streetAddress"].Value.ToString());

Лично мне нравится использовать DirectoryEntry/DirectorySearcher напрямую, а не UserPrincipal/PrincipalSearcher, потому что это дает мне больше контроля над тем, что он делает, что может привести к повышению производительности. Я немного писал об этом здесь: Active Directory : Лучшая производительность

person Gabriel Luci    schedule 15.10.2019
comment
Я использовал, но после некоторых проблем, которые у меня возникли с использованием DirectoryEntry, я изменил метод на UserPrincipal - person Emre; 15.10.2019
comment
UserPrincipal просто использует DirectoryEntry в фоновом режиме, поэтому я уверен, что любая проблема, с которой вы столкнулись, могла быть решена. Но если он работает сейчас (и работает приемлемо), это все, что имеет значение. - person Gabriel Luci; 15.10.2019
comment
Должен ли я делать то же самое при создании пользователя? Итак, сначала я должен создать пользователя, сохранить его, затем убедиться в свойстве с именем Address, а затем добавить в него данные? - person Emre; 15.10.2019
comment
Да, вы должны использовать streetAddress везде. Это атрибут, на который смотрит Outlook, и это атрибут, который изменяется в поле «Улица» на вкладке «Адрес» в AD «Пользователи и компьютеры». - person Gabriel Luci; 15.10.2019