Симон Робинсон - C# для профессионалов. Том II
- Название:C# для профессионалов. Том II
- Автор:
- Жанр:
- Издательство:Лори
- Год:2003
- Город:Москва
- ISBN:5-85582-187-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Симон Робинсон - C# для профессионалов. Том II краткое содержание
Платформа .NET предлагает новую среду, в которой можно разрабатывать практически любое приложение, действующее под управлением Windows, а язык C# — новый язык программирования, созданный специально для работы с .NET.
В этой книге представлены все основные концепции языка C# и платформы .NET. Полностью описывается синтаксис C#, приводятся примеры построения различных типов приложений с использованием C# — создание приложений и служб Windows, приложений и служб WWW при помощи ASP.NET, а также элементов управления Windows и WWW Рассматриваются общие библиотеки классов .NET, в частности, доступ к данным с помощью ADO.NET и доступ к службе Active Directory с применением классов DirectoryServices.
Для кого предназначена эта книгаЭта книга предназначена для опытных разработчиков, возможно, имеющих опыт программирования на VB, C++ или Java, но не использовавших ранее в своей работе язык C# и платформу .NET. Программистам, применяющим современные технологии, книга даст полное представление о том, как писать программы на C# для платформы .NET.
Основные темы книги• Все особенности языка C#
• C# и объектно-ориентированное программирование
• Приложения и службы Windows
• Создание web-страниц и web-служб с помощью ASP NET
• Сборки .NET
• Доступ к данным при помощи ADO NET
• Создание распределённых приложений с помощью NET Remoting
• Интеграция с COM, COM+ и службой Active Directory
C# для профессионалов. Том II - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Сначала мы соединяемся с организационной единицей Wrox Press. Здесь начинается поиск. Создадим объект DirectorySearcher
, где задан SearchRoot
. Фильтр определяется как ( &(objectClass=user)(description=Auth*)
) для того, чтобы мы нашли все объекты типа user
, где свойство description
начинается с последовательности Auth
, за которой может следовать что-то еще. Область поиска должна быть поддеревом, чтобы поиск происходил в порождаемых организационных единицах для Wrox Press:
DirectoryEntry de new DirectoryEntry();
de.Path = "LDAP://OU=Wrox Press, " + "DC=eichkogelstrasse, DC=local";
DirectorySearcher searcher = new DirectorySearcher();
searcher.SearchRoot = de;
searcher.Filter = "(&(objectClass=user)(description=Auth*))";
searcher.SearchScope = SearchScope.Subtree;
В результате поиска мы хотим получить свойства name
, description
, givenName
, и wWWHomePage
.
searcher.PropertiesToLoad.Add("name");
searcher.PropertiesToLoad.Add("description");
searcher. PropertiesToLoad.Add("givenName");
searcher.PropertiesToLoad.Add("wWWHomePage");
Мы готовы начать поиск. Однако, результат необходимо отсортировать. DirectorySearcher
имеет свойство Sort
, где можно задать SortOption
. Первый аргумент конструктора SortOption
определяет свойство, по которому будет проводиться сортировка, второй аргумент определяет направление сортировки. Перечисление SortDirection
имеет значения Ascending
и Descending
.
Чтобы начать поиск, можно использовать метод FindOne()
для нахождения первого объекта или FindAll()
, чтобы найти все объекты. FindOne()
вернет простой SearchResult
, FindAll()
вернет SearchResultCollection
. Мы хотим получить всех авторов, поэтому используем FindAll()
:
searcher.Sort = new SortOption("givenName", SortDirection.Ascending);
SearchResultCollection Results = searcher.FindAll();
С помощью цикла foreach
мы получаем доступ ко всем SearchResult
в SearchResultCollection
. SearchResult
представляет один объект в кэше поиска. Свойство Properties
возвращает ResultPropertyCollection
, где мы получаем доступ ко всем свойствам и значениям по имени свойства и по индексу.
SearchResultCollection results = Searcher.FindAll();
foreach (SearchResult result in results) {
ResutPropertyCollection props = result.Properties;
foreach (string propName in props.PropertyNames) {
Console.Write(propName + ": ");
Console.WriteLine(props[propName][0]);
}
Console.WriteLine();
}
}
Если необходимо получить весь объект после поиска, то это также возможна. SearchResult
имеет метод GetDirectoryEntry()
, который возвращает соответствующую запись DirectoryEntry
найденного объекта.
Результирующий вывод показывает начале списка всех авторов книги Professional C# с выбранными свойствами

Поиск объектов пользователей
Последнее приложение, которое будет создано в этой главе, это приложение Windows Forms. С его помощью можно найти все объекты пользователей домена с динамически определяемой строкой фильтра. Можно также задать свойства объектов пользователей, которые должны выводиться.
Интерфейс пользователя
Интерфейс пользователя выводит нумерованные шаги, помогая использовать приложение.
1. На первом шаге можно ввести имя пользователя, пароль и контроллер домена. Вся эта информация является необязательной. Если контроллер домена не вводится, то соединение работает со связыванием без сервера. Если отсутствует имя пользователя, то используется контекст безопасности текущего пользователя.
2. С помощью кнопки все имена свойств объекта User
могут загружаться динамически в окно списка ListBoxProperties
.
3. После загрузки имен свойств, можно выбрать свойства, которые должны выводиться. Режим SelectionMode
окна списка задач как MultiSimple
.
4. Можно ввести фильтр для ограничения поиска. Значение по умолчанию, которое задается в этом диалоговом окне, ищет все объекты пользователей: ( objectClass=user
).
5. Теперь можно начать поиск.

Получение именующего контекста схемы
Это приложение имеет только два метода обработки событий: первый метод — обработчик для кнопки загрузки свойств и второй — для запуска поиска в домене. В первой части мы динамически считываем свойства класса User
из схемы для вывода его в интерфейсе пользователя.
В методе-обработчике buttonLoadProperties_Click()
с помощью метода SetLogonInformation()
имя пользователя, пароль и имя хоста считываются во время диалога и сохраняются в членах класса. Затем метод SetNamingContext()
задает имя LDAP схемы и имя LDAP используемого по умолчанию контекста. Имя LDAP этой схемы используется в вызове SetUserProperties()
для задания свойств в окне списка:
private void buttonLoadProperties_Click(object sender, System.EventArgs e) {
try {
SetLogonInformation();
SetNamingContext();
SetUserProperties(schemaNamingContext);
} catch (Exception ex) {
MessageBox.Show("Cheek your inputs! " + ex.Message);
}
}
protected void SetLogonInformation() {
username =
(textBoxUsername.Text == "" ? null :
textBoxUsername.Text);
password =
(textBoxPassword.Text == "" ? null :
textBoxPassword.Text);
hostname = textBoxHostname.Text;
if (hostname ! = "") hostname += "/";
}
Во вспомогательном методе SetNamingContext()
мы используем корень дерева каталога для получения свойств сервера. Мы заинтересованы в значениях двух свойств: SchemaNamingContext
.
protected string SetNamingContext() {
using (DirectoryEntry de = new DirectoryEntry()) {
string path = "LDAP://" + hostname + "/rootDSE";
de.Username = username;
de.Password = password;
de.Path = path;
schemaNamingContext =
de.Properties["schemaNamingContext"][0].ToString();
defaultNamingContext =
de.Properties["defaultNamingContext"][0].ToString();
}
}
Получение имен свойств класса пользователя
У нас есть имя LDAP для доступа к схеме. Можно использовать его для доступа к каталогу и для считывания свойств. Мы заинтересованы не только в свойствах класса User, но также в свойствах базовых классов для User
: Organizational-Person
, Person
и Top
. В этой программе имена базовых классов жестко закодированы. Можно было бы прочитать базовый класс динамически с помощью атрибута subClassOf
. Метод GetSchemaProperties()
возвращает строковый массив со всеми именами свойств определенного типа объектов. Все имена свойств собраны в объекте properties
типа StringCollection
:
protected void SetUserProperties(string schemaNamingContext) {
StringCollection properties = new StringCollection();
string[] data = GetSchemaProperties(schemaNamingContext, "User");
properties.AddRange(GetSchemaProperties(schemaNamingContext, "Organizational-Person"));
properties.AddRange(GetSchemaProperties(schemaNamingContext, "Person"));
properties.AddRange(GetSchemaProperties(schemaNamingContext, "Top"));
Интервал:
Закладка: