В первой части, публикую некоторые куски кода своей программы UserInfo, которые считаю ключевыми. Без их понимания я, как не программист, не мог программно получить доступ к Active Directory. Здесь будут два основных блока это:
- Чтение атрибутов объекта из Active Directory
- Запись атрибутов объекта в Active Directory
И так. все по порядку…
“Программирование” началось с изучения доступа к службе Active Directory:
- http://msdn.microsoft.com/ru-ru/library/wwzcae1f.aspx
- http://msdn.microsoft.com/ru-ru/library/9t2667d1.aspx
В итоге стало понятно, для того чтобы найти нужный объект, необходимо выполнить предварительные операции:
- Определить контекст Active Directory
- Определить домен Active Directory
- Определить куда и как мы будем подключаться к Active Directory
- Выполнить поиск объекта
textBox1.Text - поле ввода поисковых данных.
String typeSearch = null;
DirectoryContext DomainContext = new DirectoryContext(DirectoryContextType.Domain);
Domain DomainName = Domain.GetDomain(DomainContext);
DirectoryEntry ADEntry = new DirectoryEntry("LDAP://" + DomainName, null, null, AuthenticationTypes.Secure);
DirectorySearcher ADSearchUser = new DirectorySearcher(ADEntry);
ADSearchUser.Filter = "(&(objectClass=" + typeSearch + ")(objectCategory=Person)(|(displayName=" + textBox1.Text + "*)(mail=" + textBox1.Text + "*)))";
SearchResult result = ADSearchUser.FindOne();
дальше обрабатываем то, что находится в result. Я использовал массив User_atrib для того, чтобы было удобнее работать с результатом поиска в дальнейшем. Получаем данные следующим образом:
if (result != null) {
try { User_atrib.Add(result.GetDirectoryEntry().Properties["sn"].Value.ToString()); }
catch { User_atrib.Add(""); }
…
}
На данный момент программа работает с 14 атрибутами пользователя или контакта.
После того как мы нашли и отредактировали данные, нам надо их сохранить. С сохранением оказалось все проще, чем с поиском. Мы знаем где находится объект и какие атрибуты нам нужно изменить.
Подключаемся к объекту в Active Directory:
DirectoryEntry UserEntry = new DirectoryEntry("LDAP://" + textBox14.Text, null, null, AuthenticationTypes.Secure);
textBox14.Text – поле типа label где храниться путь к объекту. Это поле мне иногда нужно, чтобы знать в каком контейнере Active Directory находится объект.
Usr_att – массив данных собирается из полей, которые мы изменили
Все сохраняем:
if (Usr_att[0].ToString() != String.Empty) { UserEntry.Properties["sn"].Value = Usr_att[0].ToString(); }
else { UserEntry.Properties["sn"].Value = null; }
UserEntry.CommitChanges(); // применить изменения
UserEntry.RefreshCache(); // обновить данные об объекте
После окончания работы с объектом при поиске или сохранении атрибутов необходимо закрыть объекты и освободить ресурсы не дожидаясь мусорщика операционной системы.
UserEntry.Close();
UserEntry.Dispose();
В итоге получилась программа, которая сняла с ИТ рутинную работу без дополнительных затрат на программные продукты.
С какими атрибутами объекта работает программа:
sn
givenName
displayName
l
streetAddress
company
department
title
physicalDeliveryOfficeName
telephoneNumber
drink
distinguishedname
userAccountControl
Не много об атрибуте drink.
После некоторого времени удачного использования программы пользователями, у них появилось предложения о введении в нее дополнительного функционала. А именно, пожелание добавить к объекту пользователя дополнительный атрибут, в который заносилась бы информация о рабочих обязанностях пользователя. В программе я это поле назвал “Функции”, а в Active Directory выбрал атрибут drink.
Как я доставал этот объект и привязывал к объекту user. Открыл схему Active Directory. Нашел в атрибутах. Поставил галочки.

Затем в Классе user добавил этот атрибут:

Все. На этом привязка нового атрибута к объекту user закончена.
P.S.
В скором будущем постараюсь описать как включаются/выключаются учетные записи, а также как происходит их блокировка/разблокировка.