Как я могу запросить Active Directory, используя C # и ADODB? - PullRequest
2 голосов
/ 17 июля 2009

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

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

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

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

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 из C # через ADODB.

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

Ответы [ 3 ]

4 голосов
/ 05 сентября 2009

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

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

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

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

object parms = Type.Missing;

Это был ключ к выполнению Execute, чтобы не выдавать исключение.

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

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

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

2 голосов
/ 17 июля 2009

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

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

[Обратите внимание на отсутствие объекта 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 голосов
/ 17 июля 2009

Посетите веб-сайт Ричарда Мюллера в Active Directory - у него есть страница, посвященная советам по поиску ADO для AD:

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

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

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

Марк

...