Как я могу запросить Active Directory, используя C # и ADODB?

2

Ищем пример подключения через ADODB к Active Directory с помощью С#.

Моя цель - запустить поиск, чтобы убедиться, что пользователь действителен в Active Directory на основе одного из этих атрибутов пользователей (идентификатор пользователя, адрес электронной почты и т.д.).

[Хотелось бы подчеркнуть, что использование ADODB является требованием для этого, использование DirectoryServices не является допустимым ответом.]

Мой текущий подход не работает (исключение в cmd.Execute bit):

object parms = null;
object recs = null;
ADODB.Connection conn = new ADODB.Connection();
ADODB.Command cmd = new ADODB.Command();
ADODB.Recordset rs = new ADODB.Recordset();

conn.Open("Provider=ADsDSOObject",obfsUser,obfsPass,0);

cmd.ActiveConnection = conn;
cmd.CommandText = "<LDAP://OU=obfsOU,DC=obfsDC,DC=corp,DC=Net>;;name;subtree";
rs = cmd.Execute(out recs, ref parms, 0);

Я не уверен, если/где я должен предоставить ссылку на сервер, и я не совсем уверен, что параметры, переданные в метод cmd.Execute по ref, должны быть. Не тонна документации для подключения к ActiveDirectory из С# через ADODB.

conn.State возвращает 1, поэтому я считаю, что получаю активное соединение. Я думаю, что проблема заключается в параметрах, переданных методу cmd.Execute().

Теги:
active-directory
adodb

3 ответа

2
Лучший ответ

Это работает.

Надеюсь, что это поможет кому-то, у кого есть такая же потребность и проблемы.

[Обратите внимание на отсутствие объекта ADODB.Command и использование формата SQL для запроса вместо формата ADSI.]

object recs;

ADODB.Connection conn = new ADODB.Connection();
ADODB.Recordset rs = new ADODB.Recordset();

// You may need to provide user id and password instead of empty strings        
conn.Open("Provider=ADsDSOObject", "", "", 0);

// replace <> elements with your server name and OU/DC tree org
string server = "<enter your server name here>";
string start = "OU=<blah>,DC=<blah>,DC=<blah>,DC=<blah>";
string where = "objectClass = '*'";
string qry = string.Format("SELECT cn FROM 'LDAP://{0}/{1}' WHERE {2}", server, start, where);

rs = conn.Execute(qry, out recs, 0);

for (; !rs.EOF; rs.MoveNext())
{
    Console.WriteLine(rs.Fields["cn"].Value.ToString());
}
  • 0
    это только выручило меня, три года спустя :)
  • 0
    Отлично - рад, что помог.
4

Ответ ScottCher работает, но у него есть ограничения, в частности, что вы не можете справиться с пределом результата 1000 записей. Для этого единственный способ - использовать объект Command, и, поверьте, это минное поле, потому что на интерфейсах С# нет хорошей документации и (b) нет полного решения, которое может быть Googled начиная с этого письма.

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

Во-первых, как отмечалось в тоннах мест (к сожалению, только с примерами VB!), если вы не делаете что-то особенное, то все запросы ADSI ограничены 1000 строками результатов. Ключом избежать этого является установка свойства "Размер страницы" в объекте Command. Мы займемся этим за секунду, но сначала нам нужно получить базовый запрос, используя команду. Если вы используете исходный код в этом потоке, вы получите исключение в cmd.Execute, жалуясь на несоответствие параметров. Вы могли бы подумать, что передать null в качестве объекта ref будет достаточно, тем более, что синтаксис LDAP не имеет (по-видимому) параметров.

Я нашел ответ на это в двух местах. Во-первых, даже если вы явно не указываете параметры, кажется, что синтаксиса LDAP SQL достаточно: чтобы ADO считал, что требуются параметры. Странно, но, похоже, правда. Во-вторых, ПРАВИЛЬНЫЙ способ указать случай "нет параметров" - установить значение Type.Missing, а не null, как в:

object parms = Type.Missing;

Это было ключом к тому, чтобы заставить Execute не генерировать исключение.

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

cmd.Properties["Page Size"].Value = 500;

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

0

Ознакомьтесь с сайтом Ричарда Мюллера в Active Directory - у него есть страница с советами ADO Search для AD:

http://www.rlmueller.net/ADOSearchTips.htm

Там также множество отличных справочных материалов на его веб-сайте, таких как листы Excel со всеми свойствами AD и их характеристиками.

Настоятельно рекомендуется!

Марк

  • 0
    Спасибо за информацию, и это хорошая информация. Однако он не включает примеры C # и параметры, необходимые для методов C #, с которыми у меня были проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню