Код не может искать AD - PullRequest
1 голос
/ 24 августа 2009

У меня проблема с доступом к объектам AD в C #. Целью кода является получение групп пользователей. У нас есть 2 вовлеченных домена - домен, в котором находится приложение и многие пользователи, плюс доверенный домен, который также содержит пользователей, поэтому код должен иметь возможность получать группы из обоих доменов.

Я использую объект DirectorySearcher и фильтрую его на основе SID пользователя. Он упакован в DLL для использования приложениями. В настоящее время приложение использует тот же код, и оно работает, но когда оно вызывает DLL, DLL ничего не возвращает из AD. Он не может получить пользователей из вызова FindOne ().

Раньше мы сталкивались с подобной проблемой при использовании поиска пользователей, когда у нас был задействован только один домен, но мы нашли обходной путь - мы могли открыть объект пользователя напрямую и не искали объект. Теперь, когда у нас есть второй домен, нам нужно использовать SID пользователя, и мы не можем просто открыть объект.

DLL работает в одной тестовой среде, но не будет работать в 2 других тестовых средах. Что может быть причиной такого типа поведения? Это проблема с DLL? AD Security? Безопасность приложения? Как определить, есть ли у пользователя доступ к поиску?

В качестве альтернативы (если мы не можем найти решение этой проблемы), как еще я могу получить группы пользователей на основе их SID без использования поиска?

Ответы [ 2 ]

2 голосов
/ 24 августа 2009

Вы на .NET 3.5? В версии 3.5. AD 100 для управления группами и пользователями («основное управление») было немного улучшено.

Существует новое пространство имен System.DirectoryServices.AccountManagement, которое чрезвычайно полезно - прочитайте все об этом здесь, в журнале MSDN в статье Итана Виланского и Джо Каплана.

Наконец, .NET 3.5 позволяет легко, программно получать группы пользователей и включать в себя основную группу пользователя и членство во всех вложенных группах.

Если вы используете .NET 3.5, вы можете использовать такой код:

using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    using(p = Principal.FindByIdentity(ctx, "yourUserName"))
    {
        var groups = p.GetGroups();

        using (groups)
        {
            foreach (Principal group in groups)
            {
                Console.WriteLine(group.SamAccountName + "-" + group.DisplayName);
            }
        }
    }
}

S.AD.AM также включает новые методы в классе «Principal» для поиска принципалов (пользователей, групп, компьютеров) по различным критериям поиска, например, по имени, SID, GUID:

FindByIdentity содержит две перегрузки, оба из которых принимают PrincipalContext и значение, чтобы найти. За ценность вы Можно указать любой из поддерживаемых типы удостоверений: SamAccountName, Name, UserPrincipalName, DistinguishedName, Сид, или Гид.

Довольно аккуратно, а? : -)

Марк

0 голосов
/ 24 августа 2009

Вообще говоря, использование DLL не изменит работу System.DirectoryServices. Я использовал подход сборки плагинов для поиска в AD, и он работает так же, как и запуск самой сборки.

Есть несколько вопросов (которые вы должны задать себе), которые могут пролить некоторый свет:

  1. Являются ли тестовые среды одинаковыми? Тот же уровень функциональной области (Win2000, Win2003 и т. Д.), То же доверие расстановок?
  2. Машина работает код домена присоединился (т.е. вы предоставление учетных данных при создании объект DirectoryEntry)? 1. Учетная запись, которую вы используете для поиска домена иметь междоменное доверие.
  3. Ваши домены настроены как родительский / дочерний? отношения?
  4. Что произойдет, если вы будете искать домены через sAMAccountName или UPN?
  5. У вас установлены параметры DirectorySearch? автоматически искать другие домены?

Есть несколько способов отладки.

Если FindOne ничего не возвращает (и никакое исключение не выдается), значит, FindOne не находит никаких результатов, соответствующих вашим критериям.

Или FindOne выдает исключение (обычно это ComException), и вы можете использовать код ошибки comexception для поиска происходящего.

Вы можете запустить WireShark, отключить, запечатывание и безопасное связывание, а также прослушать пакеты из вашего приложения. Вы увидите ответы LDAP на ваш поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...