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

ЖАНРЫ

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

Ватсон Карли

Шрифт:

Эта информация также уникальным образом определяет пользователя и может использоваться для регистрации:

Nagel@eichkogestrasse.local

Аутентификация

Для безопасной зашифрованной аутентификации можно также определить тип аутентификации. Аутентификация может задаваться с помощью свойства

AuthenticationType
класса
DirectoryEntry
. При этом присваиваемое значение является одним из перечислений
AuthenticationTypes
.

Связывание с помощью класса DirectoryEntry

Класс

System.DirectoryServices.DirectoryEntry
используется для определения всех связываемых данных. Можно использовать конструктор по умолчанию и определить данные связывания со свойствами
Path
,
Username
,
Password
и
AuthenticationType
или передать всю информацию в конструктор:

using (DirectoryEntry de = new DirectoryEntry) {

 de.Path = "LDAP://celticrain/DC=eichkogelstrasse, DC=local";

 de.Username = "nagel@eichkogelstrasse.local";

 de.Password = "someSecret";

 // использовать полномочия текущего пользователя

 DirectoryEntry de2 = new DirectoryEntry("LDAP://DC=eichkogelstrasse, DC=local");

Даже если создание объекта

DirectoryEntry
пройдет успешно, это не означает, что и связывание было успешным. Связывание произойдет, когда в первый раз будет прочитано свойство во избежание ненужного сетевого трафика. Существует ли объект или правильны ли полномочия определенного пользователя, можно будет увидеть при первом доступе к объекту.

Получение записей каталога

Теперь, когда мы знаем, как определить атрибута связывания с объектом в активном каталоге, давайте прочитаем атрибуты объекта.

Свойства объектов пользователей

Класс

DirectoryEntry
имеет некие свойства
Name
,
Guid
и
SchemaClassName
для получения информации об объекте. Первый раз при доступе к свойству объекта
DirectoryEntry
происходит связывание и заполняется кэш. Когда мы обращаемся к другому свойству, мы считываем его из кэша, и коммуникации с сервером не требуется для данных из того же объекта.

В следующем примере мы обращаемся к объекту пользователя с общим именем Christian Nagel в организационной единице Wrox Press.

DirectoryEntry de = new DirectoryEntry;

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
:

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