У нас есть ситуация, когда код приложения, работающий на сервере в одном домене, должен перечислить пользователей в другом домене. Давайте назовем домены «PRODUCTION» и «CORPORATE» - этот код должен запускаться в PRODUCTION и взаимодействовать с ресурсами PRODUCTION, но есть определенный поток, в котором он должен позволить пользователю выбрать члена CORPORATE \ Domain Users ( ну, технически более конкретная группа, но это техническая часть). Все контроллеры домена CORPORATE расположены удаленно с серверов PRODUCTION, доступных через VPN, которая достаточно быстра, но далека от локальных. У меня возникли трудности с поиском способа эффективного составления списка членов группы CORPORATE.
Я пробовал различные API, последний раз модуль PowerShell ActiveDirectory, который, как я подозреваю, построен поверх System.DirectoryServices в .NET Framework. Следующая команда выполняется на компьютере в КОРПОРАТИВНОМ домене и в КОРПОРАТИВНОЙ ЛВС напрямую через несколько секунд:
Get-ADGroup "Domain Users" | Get-ADGroupMember
Однако, если я перехожу к машине в PRODUCTION, для которой удаленный КОРПОРАТИВНЫЙ DC, эквивалентная команда:
Get-ADGroup -Server CORPORATEDC "Domain Users" | Get-ADGroupMember
... занимает более 10 минут.
В наборе результатов содержится 1288 элементов.
Есть ли какой-нибудь более быстрый способ получить членов группы? По характеристикам производительности создается впечатление, что он настраивает удаленный итератор, а затем запускает отдельную двустороннюю сеть (или, возможно, несколько) для каждого отдельного элемента. Есть ли API, который может возвращать результаты за один прием?
В конечном итоге я хочу сделать это из кода C # и просто использовал PowerShell для проверки концепций. Я не против использования нативного P / Invoke или COM API, если он предлагает необходимые мне функции.