Не могу запросить AD (получить исключение DirectoryServicesCOMException)

Я пытаюсь запросить AD в приложении ASP.Net (4.0), работающем на Windows Server 2008 R2 (установлен IIS7). (Это также не работает при запуске в качестве приложения 2.0)

В этом нет ничего нового для меня, так как я делал это много раз раньше. Я написал небольшую программу ASP.Net, которая отлично работает на моем собственном компьютере (Windows XP с IIS6), но не работает на компьютере 2008 года.

(В результате вы видите список групп, членом которых является пользователь, в текстовом поле)

(on button_click) 
var userName = txtUserName.Text;

if (userName.Trim().Length == 0)
{
     txtResults.Text = "-- MISSING USER NAME --";
     return;
}

var entry = new DirectoryEntry("LDAP://blah.blah/DC=blah,DC=blah",
                               "cn=acct, dc=blah, dc=blah",
                               "pass");

var search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + userName + ")";
search.PropertiesToLoad.Add("memberOf");

var groupsList = new StringBuilder();

var result = search.FindOne();

if (result != null)
{
   int groupCount = result.Properties["memberOf"].Count;

   for (int counter = 0; counter < groupCount; counter++)
   {
           groupsList.Append((string)result.Properties["memberOf"][counter]);
           groupsList.Append("\r\n");
    }
}

txtResults.Text = groupsList.ToString();

Когда я запускаю этот код, я получаю следующую ошибку в search.FindOne():

System.DirectoryServices.DirectoryServicesCOMException (0x8007203B): A local error has occurred.

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
   at System.DirectoryServices.DirectorySearcher.FindOne()
   at WebApplication1._Default.btnSearch_Click(Object sender, EventArgs e)

Мы провели много исследований с этим и перебрали все настройки IIS7, которые только могли придумать, но не зашли так далеко. Любые подсказки?


person KevinDeus    schedule 12.08.2010    source источник


Ответы (4)


Измените параметр имени пользователя с "cn=xxx, dc=yyy, dc=zzz" на "Domain\Username"

person John    schedule 12.08.2010
comment
Была такая же проблема на Windows 7, но на WinXP все работает. К счастью, мой коллега прислал мне этот пост. Спасибо. - person Ghazaly; 04.04.2011

Вы также можете изменить пул приложений IIS, чтобы запустить учетную запись домена с привилегиями запросов, которые вы ищете.

У меня есть и другие комментарии:

  1. Убедитесь, что первая запись для конструктора DirectoryEntry также включает контейнер для пользователей. Это должно помочь DirectorySearcher работать более надежно.
  2. Я считаю, что вторым параметром в конструкторе DirectoryEntry должно быть имя пользователя, а не путь запроса AD.
  3. Вы также должны установить свойство AuthenticationType. В Server 2008 по умолчанию необходимо установить значение AuthenticationTypes.Secure | AuthenticationTypes.ServerBind | AuthenticationTypes.Sealing. Я предполагаю, что 2008R2 имеет аналогичные требования.
person Jeff Siver    schedule 12.08.2010

Я вижу, что вопрос довольно старый, но после борьбы с этим я подумал упомянуть, что действительно возможно использовать стиль LDAP для имени пользователя (в отличие от стиля DNS). Это хорошо работает для меня:

    string connString = "LDAP://MyDomain/CN=blah,DC=blah,DC=blah";
    string username = "CN=MyAdmin,CN=Users,CN=blah,DC=blah,DC=blah";
    string password = "myLittleSecret";
    DirectoryEntry root = new DirectoryEntry(
         connString, 
         username, 
         password, 
         AuthenticationTypes.None);

Где MyAdmin является членом роли Administrators.

Одна маленькая вещь, на поиск которой у меня ушло некоторое время, — это параметр AuthenticationTypes.None, который необходим, если вы не хотите обмениваться данными через SSL. Конечно, вы хотите сделать это в рабочей среде, но для целей разработки может быть нормально пропустить шифрование.

Окружающая среда: Windows 7

person Avada Kedavra    schedule 09.09.2012

Я также получал это исключение при попытке запросить активный каталог:

SearchResult result = srch.FindOne();

Чтобы решить эту проблему, просто поместите приведенный выше код внутрь Security.RunWithElevatedPrivileges().

Окончательное решение:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    result = srch.FindOne();
});
person nbi    schedule 30.05.2013