Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 32

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

Π’ рассматриваСмом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ поиска ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΠΉΡ‚ΠΈ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ Wrox Press, Π³Π΄Π΅ свойство description содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Author.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ соСдиняСмся с ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ 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"));

 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 Π½Π΅ всСгда хочСтся, Ρ‚ΠΎ с Ρ†Π΅Π»ΡŒΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° имя пространства ΠΈΠΌΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ

namespace DS = System.DirectoryServices;

ИмСнно ΠΎΡ‚ΡΡŽΠ΄Π° появляСтся DS.PropertyCollection.

Π¨Π°Π³ 2 прилоТСния Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½. Окно списка (listbox) содСрТит всС ΠΈΠΌΠ΅Π½Π° свойств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² User.

Поиск ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² User

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для ΠΊΠ½ΠΎΠΏΠΊΠΈ поиска Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ FillResult():

private void buttonSearch_Click(object render, System.EventArgs e) {

 try {

  FillResult();

 } catch (Exception ex) {

  MessageBox.Show("Check your input: " + ex.Message)

 }

}

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ FillResult() выполняСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ поиск Π² ΠΏΠΎΠ»Π½ΠΎΠΌ Π΄ΠΎΠΌΠ΅Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅. SearchScope задаСтся ΠΊΠ°ΠΊ Subtree, Filter для строки ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ· TextBox, Π° свойства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² кэш, Π·Π°Π΄Π°ΡŽΡ‚ΡΡ значСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π² ΠΎΠΊΠ½Π΅ списка