Ищем пример подключения через 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().
Это работает.
Надеюсь, что это поможет кому-то, у кого есть такая же потребность и проблемы.
[Обратите внимание на отсутствие объекта 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());
}
Ответ 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, чтобы получить все результаты. И я искренне надеюсь, что это поможет кому-то.
Ознакомьтесь с сайтом Ричарда Мюллера в Active Directory - у него есть страница с советами ADO Search для AD:
http://www.rlmueller.net/ADOSearchTips.htm
Там также множество отличных справочных материалов на его веб-сайте, таких как листы Excel со всеми свойствами AD и их характеристиками.
Настоятельно рекомендуется!
Марк