Не могу запросить AD (получить исключение DirectoryServicesCOMEx) - PullRequest
4 голосов
/ 12 августа 2010

Я пытаюсь запросить 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();

Когда я запускаю этот код, я получаю следующую ошибку при поиске.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, о которых мы только можем подумать, но пока не будем.Любые подсказки?

Ответы [ 4 ]

3 голосов
/ 12 августа 2010

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

0 голосов
/ 30 мая 2013

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

SearchResult result = srch.FindOne();

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

FinalРешение:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    result = srch.FindOne();
});
0 голосов
/ 10 сентября 2012

Я вижу, что вопрос довольно старый, но после борьбы с этим я подумал упомянуть, что действительно возможно использовать 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

0 голосов
/ 12 августа 2010

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

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

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