Как получить / обновить «Контакты» в Active Directory? - PullRequest
3 голосов
/ 20 февраля 2011

есть ли способ найти и обновить контакты в Active Directory?Я создаю пример приложения на C # .NET для решения этой задачи.Буду признателен за любой код.

Ответы [ 2 ]

9 голосов
/ 21 февраля 2011

Конечно, вы можете сделать это в System.DirectoryServices.

Я думаю, что вам действительно нужно научиться использовать System.DirectoryServices .Если у вас еще нет хорошей книги, я рекомендую эту .

Это не так сложно, правда.Вам просто нужно освоить два класса, DirectoryEntry и DirectorySearcher . DirectoryEntry представляет объект LDAP на сервере LDAP.Предполагая, что у вас есть достаточные разрешения, вы можете вносить изменения в любой объект LDAP, включая объект контакта, используя DirectoryEntry .Каждый объект LDAP имеет ряд атрибутов.Два важных атрибута, которые вам нужно знать, это objectCategory и objectClass.Для контактного объекта objectCategory должно быть person, а objectClass должно быть contact.Вы также можете проверить атрибут targetAddress объекта контакта, в котором хранится адрес электронной почты.Существует несколько расширенных атрибутов Exchange для объекта контакта.Вы, вероятно, хотели бы проверить каждого из них по одному.Для просмотра объектов на сервере LDAP вы можете использовать инструмент, такой как AD Explorer или ADSI Edit

Чтобы выполнить поиск, вам нужно предоставить четыре вещи для DirectorySearcher .

  1. Поиск корня
  2. Фильтр поиска LDAP
  3. Область поиска
  4. Возвращенные атрибуты

Если ваша машина уже присоединена к домену и вы входите в систему как пользователь домена, вот пример того, как вывести список всех контактов в вашем домене.

DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
string domainContext = rootDSE.Properties["defaultNamingContext"].Value as string;
DirectoryEntry searchRoot = new DirectoryEntry("LDAP://" + domainContext);
using (DirectorySearcher searcher = new DirectorySearcher(
    searchRoot, 
    "(&(objectCategory=person)(objectClass=contact))", 
    new string[] {"targetAddress"}, 
    SearchScope.Subtree))
{
    foreach (SearchResult result in searcher.FindAll())
    {
        foreach (string addr in result.Properties["targetAddress"])
        {        
           Console.WriteLine(addr);
        }
        Console.WriteLine(result.Path);
    }
}

Первые три строкичтобы помочь вам найти правильный путь LDAP к корню вашего домена.Это работает, только если вы входите в систему как пользователь домена.Если вы знаете правильный путь LDAP вашего домена, вы можете просто передать его непосредственно в DirectoryEntry.

Я поместил все четыре параметра в DirectorySearcher .Когда вы знакомитесь с программированием служб каталогов, вы можете пропустить некоторые из них, и .NET предоставит вам значение по умолчанию.

Результат, возвращаемый DiectorySearcher , равен SearchResult .Обратите внимание, что SearchResult всегда возвращает коллекцию объектов, даже если targetAddress не является многозначным атрибутом.Это потому, что некоторые атрибуты объекта LDAP могут быть многозначными.

Другая важная информация, которую вы можете получить от SearchResult - это Path.Вы можете создать объект DirectoryEntry , используя этот путь позже.Чтобы обновить свой контактный объект, вам нужно использовать его метод Properties и метод CommitChanges.

DirectoryEntry de = new DirectoryEntry(result.Path);
de.Properties["targetAddress"].Value = "SMTP:jane.doe@foo.bar";
de.CommitChanges();

Наконец, вы можете легко найти множество онлайн-руководств по обоим DirectorySearcher и DirectoryEntry .Попробуйте Google.

5 голосов
/ 20 февраля 2011

Я думаю, вы имеете в виду обновление свойств объекта пользователя в Active Directory. И да, это возможно.

С .Net 3.5 мы получили пространство имен System.DirectoryServices.AccountManagement, что делает работу с AD намного проще по сравнению с тем, что было в пространстве имен System.DirectoryServices ранее.

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

string sUserName = "someusertoload";
string sDomain = "test.local";
string sDefaultOU = "OU=test,DC=test,DC=local";
string sServiceUser = "userwithrights";
string sServicePassword = "somepassword";
PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, sDomain, sDefaultOU,ContextOptions.SimpleBind, sServiceUser, sServicePassword);
UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, sUserName);
oUserPrincipal.GivenName = "new givenname";
oUserPrincipal.Save();

Вы можете найти несколько вспомогательных методов здесь .

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

DirectoryEntry root = new DirectoryEntry("LDAP://server/DC=test,DC=local");
DirectorySearcher searcher = new DirectorySearcher( root, "(&(objectCategory=person)(objectClass=user)(sAMAccountName=john))" );
SearchResult result = searcher.FindOne();
DirectoryEntry user = result.GetDirectoryEntry();
user.Properties["streetAddress"][0] = "My Street 12";
user.CommitChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...