Подключение к Active Directory через .NET

У меня есть виртуальная машина с Active Directory, к которой я хочу подключиться с помощью .NET. Я уже подключился к машине с Ubuntu, на которой работает OpenLDAP, но при подключении к AD все работает не так гладко.

Код, который я пытаюсь подключить, выглядит следующим образом:

var directoryEntry = 
    new DirectoryEntry("LDAP://192.168.1.1", @"EXAMPLE\Administrator", "Abc1234");

try
{
   var test = directoryEntry.NativeObject;
}
catch (Exception e)
{
    System.Diagnostics.Debug.WriteLine(e.Message);
}

Наблюдая за окном местных жителей, переменная directoryEntry Guid, имя и т. Д. Говорит: «Время ожидания оценки функции истекло».

Затем, когда он достигает блока try, он просто говорит: «Сервер не работает».

Я также пробовал этот код, и он терпит неудачу в «ldap.bind», говоря мне, что «ldap-сервер недоступен».

using (var ldap = new LdapConnection("192.168.1.1:389"))
{
    ldap.AuthType = AuthType.Basic;
    ldap.SessionOptions.ProtocolVersion = 3;
    ldap.Bind(new NetworkCredential(@"EXAMPLE\Administrator", "Abc1234"));
}

Я знаю, что сервер запущен и работает, я знаю, что у них есть соединение (машины могут пинговать друг друга), но я не могу понять, почему оно не работает. Может ли кто-нибудь из вас увидеть, есть ли какие-либо недостатки в коде? (и да, я гуглил все ошибки и различные вопросы о подключении к AD, прежде чем задавать этот вопрос, но ни одно из решений не сработало).


person CattleDecap    schedule 11.02.2015    source источник


Ответы (3)


Если ваше доменное имя «example.com» и допустим, что у вас есть организационная единица (OU) под названием «users». Это прекрасно работает для меня.

Однако машина, на которой работает этот код, добавляется в домен AD и работает с учетной записью пользователя AD. Если у вас нет машины, добавленной в тот же домен, который вы запрашиваете, вы можете попробовать опцию «Запустить от имени» (Shift + правый клик), чтобы запустить программу или визуальную студию.

    public static List<string> GetAllUsers()
    {
        List<string> users = new List<string>();

        using (DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,DC=example,DC=local"))
        {
            using (DirectorySearcher ds = new DirectorySearcher(de))
            {
                ds.Filter = "objectClass=user";
                SearchResultCollection src = ds.FindAll();
                foreach (SearchResult sr in src)
                {
                    using (DirectoryEntry user = new DirectoryEntry(sr.Path))
                    {
                        users.Add(new string(user.Properties["sAMAccountName"][0].ToString()));

                    }
                }
            }

        }
        return users;
    }
person Ravi M Patel    schedule 11.02.2015

Я протестировал ваш код (с измененным доменом/паролем...) в своей собственной тестовой среде Active Directory, он работает. Если я преднамеренно использую неправильный пароль для целей тестирования, я получаю «недействительные учетные данные». Отлично.

«Сервер не работает» будет возвращен, если LDAP полностью недоступен. Таким образом, кажется, что, например. порт 389 недоступен. Брандмауэр ?

LDAP SSL (порт 636) ??

Если у вас нет машины, добавленной в тот же домен, который вы запрашиваете, вы можете попробовать опцию «Запустить от имени» (Shift + правый клик), чтобы запустить программу или визуальную студию.

Да, это была и моя первая идея, когда я увидел этот вопрос. Однако похоже, что в этом случае вы получите еще одну ошибку.

Что я предлагаю: установите WireShark, сетевой анализатор, и проверьте, что отправляется по сети (при условии, что ваш AD работает на другом компьютере). WireShark более чем часто помогал мне диагностировать ошибки с AD, входом в систему, SMB или другими протоколами.

PS:

Ответ от Ravi M Patel - хороший пример поиска, я почти делаю то же самое в своем собственном коде.

person Rainer Schaack    schedule 11.02.2015

Задача решена. У меня было два сетевых адаптера, а адаптер 1 имел dhcp, а статический IP-адрес, который я пытался подключить, работал на адаптере 2. Я просто дал адаптеру 1 статический адрес и смог подключиться таким образом, по-видимому, код подключается через адаптер 1 по умолчанию. . И спасибо за все ответы, ребята :)

person CattleDecap    schedule 12.02.2015