de.Path = 'LDAP://celticrain/CN=Christian Nagel, ' +
'OU=Wrox Press, DC=eichkogelstrasse, DC=local';
Console.WriteLine('Name: '+ de.Name);
Console.WriteLine('GUID: ' + de.Guid);
Console.WriteLine('Type: ' + de.SchemaClassName);
Console.WriteLine();
Объект активного каталога содержит значительно больше информации. Доступность информации зависит от типа объекта. Чтобы получить всю информацию об объекте, свойство Properties
возвращает PropertyCollection
. Каждое свойство само является коллекцией, так как одно свойство может иметь несколько значений, например, объект пользователя может иметь несколько телефонных номеров. Мы перебираем значения с помощью внутреннего цикла foreach
. Коллекция, которая возвращается из properties[name]
является массивом объектов. Значения атрибутов могут быть строками, числами или другими типами данных. Мы используем метод ToString()
для вывода значений.
Console.WriteLine('Attributes: ');
PropertyCollection properties = de.Properties;
foreach (string name in properties.PropertyNames) {
foreach (object о in properties[name]) {
Console.WriteLine(name + ': ' + o.ToString());
}
}
В выходных результатах мы видим все атрибуты объекта пользователя Christian Nagel. Заметим, что otherTelephone является многозначным свойством, которое содержит несколько телефонных номеров. Некоторые из значений свойств просто выводят тип объекта System._ComObject
. Чтобы получить значения этих атрибутов, необходимо непосредственно использовать интерфейсы ADSI COM, которые также берутся из классов в пространстве имен System.DirectoryServices
.
В главе 19 можно прочитать, как работать с объектам и и интерфейсами COM.
Для получения дополнительной информации об ADSI можно прочитать книгу Simon Robinson, Professional ADSI Programming, Wrox Press, ISBN 1-861002-26-2.
С помощью DirectoryEntry.Properties
можно получить доступ ко всем свойствам. Если имя свойства известно, можно получить значение непосредственно:
foreach (string homePage in de.Properties['wWWHomePage'])
Console.WriteLine('Home page; ' + homePage);
Коллекции объектов
Объекты хранятся в активном каталоге иерархически. В контейнерных объектах содержатся объекты-потомки. Их можно перечислить с помощью свойства Children
класса DirectoryEntry
. В другом направлении можно получить контейнер объекта с помощью свойства Parent
.
Объект пользователя не имеет потомков, поэтому воспользуемся теперь организационной единицей. Давайте получим все объекты пользователей из организационной единицы Wrox Press в домене eichkogelstrasse.local. Свойство Children
возвращает коллекцию DirectoryEntries
, которая содержит объекты DirectoryEntry
. Мы просматриваем все объекты DirectoryEntry
для вывода имен объектов-потомков:
DirectoryEntry de = new DirectoryEntry();
de.Path. = 'LDAP://celticrain/OU=Wrox Press, ' + 'DC=eichkogelstrasse, DC=local';
Console.WriteLine('Children of ' + de.Name);
foreach (DirectoryEntry obj in de.Children) {
Console.WriteLine(obj.Name);
}
В данном примере мы видим все объекты в организационной единице: пользователей, контакты, принтеры, общие ресурсы и другие организационные единицы. Если нужно увидеть только некоторые типы объектов, можно использовать свойство SchemaFilter
класса DirectoryEntries
:
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()
удаляют