Объект пользователя не имеет потомков, поэтому воспользуемся теперь организационной единицей. Давайте получим все объекты пользователей из организационной единицы Wrox Press в домене eichkogelstrasse.local. Свойство
данном примере мы видим все объекты в организационной единице: пользователей, контакты, принтеры, общие ресурсы и другие организационные единицы. Если нужно увидеть только некоторые типы объектов, можно использовать свойство
В результате мы видим в организационной единице только объекты пользователей:
Кэш
Чтобы уменьшить сетевой трафик, ADSI использует кэш для свойств объектов. Как было показано ранее, обращение к серверу не происходит при создании объекта
DirectoryEntry
, а происходит, когда впервые считывается значение из хранилища каталога. При считывании первого свойства все свойства записываются в кэш, поэтому повторное обращение к серверу не нужно, когда считывается следующее свойство. Этот кэш свойств может быть выключен при задании свойства
DirectoryEntry.UsePropertyCache
как
false
. Лучше этого не делать, так как это будет порождать множество ненужных обращений к серверу.
Запись изменений в объекты также происходит только в кэше. Задание множества свойств не генерирует сетевого трафика. Метод
DirectoryEntry.CommitChanges
требуется для очистки кэша и переноса всех измененных данных на сервер. Чтобы снова получить вновь записанные данные из хранилища каталога, можно для чтения свойств использовать метод
DirectoryEntry.RefreshCache
. Задание свойства
UsePropertyCache
как
false
может быть очень полезно для отладки, чтобы увидеть, какое свойство было изменено неправильно.
Обновление записей каталога
Объекты в активном каталоге обновляются
так же легко, как и читаются. Изменение значений возможно после считывания объекта. Чтобы удалить все значения одного свойства, может вызываться метод
PropertyValueCollection.Clear
. С помощью метода
Add
к свойству могут добавляться новые значения.
Remove
и
RemoveAt
удаляют специфические значения из коллекции свойства:
using (DirectoryEntry de = new DirectoryEntry!)) {
Чтобы изменить значение, зададим ему определенное значение. Посредством следующей строки кода для номера мобильного телефона задается новое значение, если оно существует, с использованием индекса
PropertyValueCollection
. С помощью индекса значение может только изменяться. Поэтому необходимо всегда проверять методом
после создания или обновления новых объектов каталога. Иначе обновляется только кэш, а изменения не посылаются службе каталога.
Создание новых объектов
Новые объекты активного каталога, такие как пользователи, компьютеры, принтеры, контакты и другие программным путем можно создать с помощью класса
DirectoryEntries
.
Чтобы добавить новые объекты в каталог, мы должны сначала соединиться с объектом-контейнером, подобным организационной единице, куда можно вставить новые объекты. Объекты, которые не могут содержать другие объекты, использовать нельзя. Здесь используется контейнерный объект с известным именем
CN=Users, DC=eichkogelstrasse, DC=local
:
DirectoryEntry de = new DirectoryEntry;
de.Path = "LDAP://celticrain/CN=Users, " +
"DC=eichkogelstrasse, DC=local";
Можно получить доступ к объекту
DirectoryEntries
с помощью свойства
Children
объекта
DirectoryEntry
:
DirectoryEntries users = de.Children;
Объект
DirectoryEntries
имеет методы для добавления, удаления, и поиска объектов в коллекции. Здесь создается новый объект пользователя. Для метода
Add
нам нужно имя объекта и имя типа. Можно легко получить имена типов с помощью ADSI Edit.
DirectoryEntry user = users.Add("John Doe", "user");