Ватсон Карли
Шрифт:
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
не всегда хочется, то с целью разрешения конфликта имя пространства имен можно сократить с помощью