Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

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

 listBoxProperties.Items.Clear;

 foreach (string s in properties) {

listBoxProperties.Items.Add(s);

 }

}

В методе

GetSchemaProperties
мы снова обращаемся к активному каталогу. В этот раз вместо
rootDSE
используется имя LDAP в схеме, которое мы обнаружили ранее. Свойство
systemMayContain
содержит коллекцию всех атрибутов, которые допустимы в классе
objectType
:

protected string[] GetSchemaProperties(string schemaNamingContext, string objectType) {

 string [] data;

 using (DirectoryEntry de = new DirectoryEntry) {

de.Username = username;

de.Password = password;

de.Path = "LDAP://" + hostname + "/CN=" + objectType + "," + schemaNamingContext;

DS.PropertyCollection properties = de.Properties;

DS.PropertyValueCollection values = properties["systemMayContain"];

data = new String[values.Count];

values.CopyTo(data, 0);

 }

 return data;

}

Одно интересное замечание к этому коду: в приложении Windows Forms класс

PropertyCollection
пространства имен
System.DirectoryServices
имеет конфликт имен с
System.Data.PropertyCollection
. Поскольку писать такие длинные имена как
System.DirectoryServices.PropertyCollection
не всегда хочется, то с целью разрешения конфликта имя пространства имен можно сократить с помощью

  • Читать дальше
  • 1
  • ...
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: