none
[PS] Интерактивный поиск в Active Directory RRS feed

  • Общие обсуждения

  • Доброго утра!

    Изначальна была такая задача:
    Нужно сделать воможным поиск пользователей в AD, желательно ч/з некое меню/окно, чтобы было удобней выбирать и делать поиск. После выбора пользователя запускается скрипт, выполняющий некие действия.

    После поиска и общения, был найден скрипт:
    http://www.windowspowershell.ru/public/usersview.ps1.txt

    По сути это то, что нужно, только вместо типа contact указать user. Все отлично работает, есть поиск, красота, но:

    Проблема заключается в принципе работы:
    Сперва делается выборка данных в переменную, далее эта переменная обрабатывается. Все хорошо, когда данных немного, но если пользователей более 1000 то возникает проблема, все очень долго-долго работает, т.к. загрузить такой массив в переменную и обработать его не так просто.

    Отсюда вопрос:
    Когда мы назначаем права на каталог то появляется замечательное диалоговое окно ввода имени пользователя, и поиск происходит почти мгновенно, т.е. явно все пользователи не загружаются из АД в локальную переменную.

    Также при поиске пользователя ч/з dsa.msc поиск идет быстро, минуя выгрузку данных в переменные.

    Как можно напрямую задать такой поиск, минуя выгрузку всех данных, ведь по сути АД это база данных.

    Пойду читать документацию.

    MCSE, MCSA:Messaging (2000/2003) MCTS: Exchange 2007
    16 апреля 2009 г. 2:49

Все ответы

  • Надо мерить разные части скрипта и определить оператор, который тормозит.
    Загрузка информации с переменную скорее должна вести к увеличению быстродействия - это только замедляет старт скрипта, когда происходит считывание информации из AD.
    Значит тормозит либо поиск, либо формирование списка отображения информации.
    Сазонов Илья http://www.itcommunity.ru/blogs/sie/
    16 апреля 2009 г. 4:11
    Модератор
  • Надо мерить разные части скрипта и определить оператор, который тормозит.
    Загрузка информации с переменную скорее должна вести к увеличению быстродействия - это только замедляет старт скрипта, когда происходит считывание информации из AD.
    Значит тормозит либо поиск, либо формирование списка отображения информации.
    Сазонов Илья http://www.itcommunity.ru/blogs/sie/

    Проблема именно в старте скрипта, при запуске ждать 30-40 секунд оператору будет не так удобно :(
    Проблема думается тут: $Contacts = $Selector.FindAll() т.е. в самом запросе.
    А также в том, что идет "постраничный" перебор всех значений, нет индексов :( были бы индексы, было бы быстрей.

    Должен же быть способ напрямую запросить AD - читаю далее :) продолжаю эксперименты. 


    MCSE, MCSA:Messaging (2000/2003) MCTS: Exchange 2007
    16 апреля 2009 г. 5:14
  • вообще хэштаблицы в net довольно сложны в реализации и для правильного использования необходимо соблюдать ряд требований (это можно прочитать в любой книге по .net/c#, обычно там рассказывается специфика работы класса HashTable)

    я бы посоветовал использовать класс DataTable и потом его прибиндить например к DataGrid..

    приведу небольшой код он не на PS (руки не доходят поизучать), он на C#:
    можно его доработать и прикрутить к PS.

    using System.Windows.Forms;
    using System.DirectoryServices;
    System.Data;
    ...........

                DataGrid dataGrid1 = new DataGrid();
                dataGrid1.Top = dataGrid1.Left = 0;
                dataGrid1.Width = dataGrid1.Height = 300;
                this.Controls.Add(dataGrid1);
                dataGrid1.BeginInit();
                DirectoryEntry rootSearchObj = new DirectoryEntry("LDAP://OU=Users,OU=ONOS,DC=ONOS,DC=LOCAL");
                DirectorySearcher ds = new DirectorySearcher(rootSearchObj, "objectCategory=user");
                DataTable dt = new DataTable("Result");
                dt.Columns.Add(new DataColumn("UserName",typeof(string)));
                dt.Columns.Add(new DataColumn("Mail", typeof(string)));
                foreach (SearchResult result in ds.FindAll())
                {
                    DataRow dr = dt.NewRow();
                    dr[0] = result.GetDirectoryEntry().InvokeGet("Name");
                    dr[1] = result.GetDirectoryEntry().InvokeGet("mail");
                    dt.Rows.Add(dr);
                }
                dataGrid1.SetDataBinding(dt, null);
                dataGrid1.EndInit();
    mcp, mcdba, mcsa, mcse, ccna
    16 апреля 2009 г. 6:02
  • А зачем вообще выполнять первлоначальное заполнение?
    Не проще выполнять вывод в таблицу только когда введено значение маски?
    Будет намного быстрее....
    16 апреля 2009 г. 6:27
  • или попробуйте при создании хэш таблицы указать вместимость побольше и коэффициент заполнения.. штобы память под хэштаблицу выделялась один раз и не перераспределялась часто..

    mcp, mcdba, mcsa, mcse, ccna
    16 апреля 2009 г. 6:31
  • Спасибо за информацию, попробую реализовать.
    MCSE, MCSA:Messaging (2000/2003) MCTS: Exchange 2007
    16 апреля 2009 г. 6:33
  • Никакие оптимизации хеша тут не помогут, дело действительно не в нём. Сергей правильно смотрит - AD - база данных, и соответственно если требуется производительность, то лучше доверить поиск ей. Сделать это можно изменив $Filter - добавить туда дополнительные критерии, например "имя начинается с 'Во'". Ну и разумеется запросы надо будет выполнять не при загрузке списка, а каждый раз когда необходимо получить новые данные. Язык в запросах к AD используется - LDAP. Примеры можно посмотреть в ADUC создавая свои поисковые запросы.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    16 апреля 2009 г. 11:00
    Модератор
  • У меня получился примерно такой скриптик, доработал :) , загрузка списка происходит только если в текстбокс введено не менее 5 символов:
    usersinfo.ps1
    16 апреля 2009 г. 14:09
  • Артем, а можно получить этот доработанный скрипт в почту marvinfs@gmail.com

    ато хостинг на яндексе уже закончился...

    заранее спасибо!

    15 декабря 2010 г. 18:29
  • Могу предложить реализовать поиск таким вот образом:
    http://social.technet.microsoft.com/Forums/ru-RU/scrlangru/thread/faa7af26-1582-4329-861f-d6f1808d149d

    Через ADODB.Connection у меня поиск шел быстрее чем через DirectorySearcher


    Andy Mishechkin
    16 декабря 2010 г. 18:00
  • Артем, а можно получить этот доработанный скрипт в почту marvinfs@gmail.com

    ато хостинг на яндексе уже закончился...

    заранее спасибо!


    А вот он:

    http://www.itcommunity.ru/blogs/sysadminnest/archive/category/3750.aspx


    Если ответ Вам помог, нажмите на изображение зеленой галочки - «пометить как ответ». Так же, Вы можете пометить это сообщение как «полезное», нажав на ссылку "проголосовать за полезное сообщение".
    20 декабря 2010 г. 7:05