Подключитесь к Active Directory с помощью класса LdapConnection на удаленном сервере.

У меня проблема: мне нужно подключиться с удаленного сервера к Active Directory, но код должен использовать класс LdapConnection. Мне это нужно, потому что таким образом я могу тестировать уведомления об изменениях только тогда, когда происходит какое-то событие (например, пользователь деактивирован или он изменил группу, данные и т. д.). ОС на удаленном сервере — Windows Server 2012.

Мне удалось сделать это локально, используя DirectoryServices со следующим кодом:

String ldapPath = "LDAP://XRMSERVER02.a24xrmdomain.info";
directoryEntry = new DirectoryEntry(ldapPath, @"A24XRMDOMAIN\username", "pass");

//// Search AD to see if the user already exists.
DirectorySearcher search = new DirectorySearcher(directoryEntry);
search.Filter = "(&(objectClass=user))";
SearchResult result = search.FindOne();

Это нормально, и соединение работает, но теперь мне нужно подключиться, используя класс LdapConnection.

Я пробовал что-то подобное разными способами, но ни один из них не помог мне:

LdapConnection connection = new LdapConnection(XRMSERVER02.a24xrmdomain.info);
var credentials = new NetworkCredential(@"A24XRMDOMAIN\username", "pass");             
connection.Credential = credentials;
connection.Bind();

Он говорит, что учетные данные недействительны, но это не так.

Пояснения:

  • XRMSERVER02 — Контроллер домена
  • a24xrmdomain.info - Домен
  • A24XRMDOMAIN - Домен, используемый для ведения журнала

Спасибо за вашу помощь.


person Dan    schedule 13.09.2016    source источник


Ответы (2)


Попробуйте использовать конструктор NetworkCredential с 3 параметрами: имя пользователя, пароль и домен. Укажите домен отдельно от имени пользователя

person oldovets    schedule 15.09.2016
comment
Не рекомендую использовать уведомления об изменениях, если вы собираетесь мониторить весь домен. Этот метод предназначен для использования, когда вам нужно отслеживать изменения атрибутов указанного объекта или нескольких объектов. В высоконагруженных средах этот прием просто не работает: вы не будете получать все уведомления об изменениях (добавьте 10К пользователей в домен и посмотрите, что будет). Для опроса изменений во всем домене используйте технику DirSync или USN. - person oldovets; 26.09.2016
comment
Вы имели в виду мой вопрос об уведомлениях stackoverflow.com/questions/39261263/ .. Я использую для этого уведомления. Я не уверен, как перейти на другие методы, возможно, чтобы установить какой-то TImer каждые 5 секунд для проверки состояния атрибута uSNChanged? У меня есть предыдущее состояние объекта, поэтому он может работать таким образом. Я не уверен, что есть другие варианты. Не могли бы вы проверить мой ответ по предоставленной ссылке? Спасибо - person Dan; 05.10.2016
comment
Для метода uSNChanged вы можете сделать следующие шаги: 1. Подключиться к DC. 2. Запросите текущий наивысшийCommitedUsn из этого контроллера домена (назовите его hcusn) (см. 110).aspx" rel="nofollow noreferrer">msdn.microsoft.com/en-us/library/). 3. Соберите текущий моментальный снимок AD с этого контроллера домена, указав (uSNChanged ‹= hcusn) в фильтре LDAP, если вам нужны предыдущие значения. 4. Сохраните hcusn на диске. 5. Снова подключитесь к тому же DC. 6. Запросите highCommitedUsn (назовите его hcusnnew) 4. Соберите изменения, указав &(uSNChanged›hcusn)(uSNChanged‹=hcusnew) в фильтре LDAP. - person oldovets; 06.10.2016
comment
Я настоятельно рекомендую использовать LDAP, а не ADSI (DirectorySearcher) для запроса изменений. Вот пример LDAP Searcher: dunnry.com/blog/2008/06/05 /, так как у DirectorySearcher есть некоторые проблемы при использовании в сервисном приложении (см. resulte" title="system directoryservices directorysearcher, вызывающий арифметическую операцию resulte"> stackoverflow.com/questions/10291009/) - person oldovets; 06.10.2016
comment
А вот пример метода опроса DirSync: как запрашивать изменения в активном каталоге, включая удаленные объекты"> stackoverflow.com/questions/3819824/. - person oldovets; 06.10.2016

Несмотря на то, что я решил свою проблему, я хочу поделиться с другими разработчиками своими достижениями. Проблема, с которой я столкнулся, заключалась в том, что у меня был удаленный сервер с ОС Windows server 2012 и Active Directory на нем. Мне нужно было подключиться к нему через мою локальную машину (Windows 10). Как я уже говорил в своем вопросе, это можно сделать через DirectoryServices со следующим кодом:

String ldapPath = "LDAP://(DomainController).a24xrmdomain.info";
directoryEntry = new DirectoryEntry(ldapPath, @"DOMAIN\username","pass");

//// Test search on AD to see if connection works.
DirectorySearcher search = new DirectorySearcher(directoryEntry);
search.Filter = "(&(objectClass=user))";
SearchResult result = search.FindOne();

Это одно из решений, но поскольку моя задача заключалась в том, чтобы получать уведомления и определять, когда какой-либо объект изменился в Active Directory, мне нужно было подключиться к Active Directory на удаленном сервере через класс LDAP. Код для получения уведомлений взят из:
- Регистрация изменений уведомление с помощью Active Directory с помощью C#

Мне удалось подключиться к классу LDAP с помощью следующего кода:

String ldapPath2 = "(DomainController).a24xrmdomain.info";
LdapConnection connection = new LdapConnection(ldapPath2);
var credentials = new NetworkCredential(@"username", "pass");             
connection.Credential = credentials;
connection.Bind();

Хочу отметить, что не нужен IP-адрес удаленного сервера, нужен только контроллер домена, который используется на нем, и этот домен, используемый для ведения журнала, не нужен.

Удачного кодирования

person Dan    schedule 25.09.2016