Чтение онлайн

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

DirectoryEntry de = new DirectoryEntry;

de.Path = "LDAP://celticrain/OU=Wrox Press, " + "DC=eichkogelstrasse, DC-local";

Console.WriteLine("Children of " + de.Name);

de.Children.SchemaFilter.Add("user");

foreach(DirectoryEntry obj in de.Children) {

 Console.WriteLine(obj.Name);

}

В результате мы видим в организационной единице только объекты пользователей:

Кэш

Чтобы

уменьшить сетевой трафик, ADSI использует кэш для свойств объектов. Как было показано ранее, обращение к серверу не происходит при создании объекта
DirectoryEntry
, а происходит, когда впервые считывается значение из хранилища каталога. При считывании первого свойства все свойства записываются в кэш, поэтому повторное обращение к серверу не нужно, когда считывается следующее свойство. Этот кэш свойств может быть выключен при задании свойства
DirectoryEntry.UsePropertyCache
как
false
. Лучше этого не делать, так как это будет порождать множество ненужных обращений к серверу.

Запись изменений в объекты также происходит только в кэше. Задание множества свойств не генерирует сетевого трафика. Метод

DirectoryEntry.CommitChanges
требуется для очистки кэша и переноса всех измененных данных на сервер. Чтобы снова получить вновь записанные данные из хранилища каталога, можно для чтения свойств использовать метод
DirectoryEntry.RefreshCache
. Задание свойства
UsePropertyCache
как
false
может быть очень полезно для отладки, чтобы увидеть, какое свойство было изменено неправильно.

Обновление записей каталога

Объекты в активном каталоге обновляются так же легко, как и читаются. Изменение значений возможно после считывания объекта. Чтобы удалить все значения одного свойства, может вызываться метод

PropertyValueCollection.Clear
. С помощью метода
Add
к свойству могут добавляться новые значения.
Remove
и
RemoveAt
удаляют специфические значения из коллекции свойства:

using (DirectoryEntry de = new DirectoryEntry!)) {

 de.Path =

"LDAP://celticrain/CN=Christian Nagel, " +

"OU=Wrox Press, DC=eichkogelstrasse, DC=local";

 if (de.Properties.Contains("mobile")) {

de.Properties["mobile"][0] = "+43 (664) 3434343434";

 }

 de.CommitChanges;

}

Чтобы изменить значение, зададим ему определенное значение. Посредством следующей строки кода для номера мобильного телефона задается новое значение, если оно существует, с использованием индекса

PropertyValueCollection
. С помощью индекса значение может только изменяться. Поэтому необходимо всегда проверять методом
DirectoryEntry.Properties.Contains
, доступен ли атрибут:

de.Properties["mobile"][0] = "+43 (664) 3434343434";

He забудьте вызвать метод

DirectoryEntry.CommitChanges
после создания или обновления новых объектов каталога. Иначе обновляется только кэш, а изменения не посылаются службе каталога.

Создание

новых объектов

Новые объекты активного каталога, такие как пользователи, компьютеры, принтеры, контакты и другие программным путем можно создать с помощью класса

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");

Объект теперь имеет значения свойств по умолчанию. Чтобы присвоить специальные значения свойств, можно добавить свойства с помощью метода

Add
свойства
Properties
. Конечно, все свойства должны существовать в схеме для объекта пользователя. Если определенное свойство не существует, то возникнет исключение
COMException
"The specified directory service attribute or value doesn't exist" ("Указанный атрибут или значение службы каталога не существует"). Если имена атрибутов правильны, но сервер отказывает во входе в связи с незаконным паролем или пропущенным свойством, исключение
COMException
будет содержать сообщение "The server is unwilling to process the request" ("Сервер не желает обрабатывать запрос").

user.Properties["company"].Add("Some Company");

user.Properties["department"].Add("Sales");

user.properties["employeeID"].Add("4711");

user.Properties["samAccountName"].Add("John Doe");

user.Properties["userPassword"].Add("someSecret");

В данный момент не все данные записаны в активный каталог. Необходимо очистить кэш:

user.CommitChanges;

Поиск в активном каталоге

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

Для поиска в активном каталоге платформа .NET имеет класс

DirectorySearcher
.

Мы можем использовать поиск только с провайдером LDAP.

DirectorySearcher
не работает с провайдерами NDS или IIS.

В конструкторе класса

DirectorySearcher
существуют четыре важные части поиска. Можно также использовать конструктор по умолчанию и определять параметры поиска с помощью свойств.

Поделиться с друзьями: