2010-08-12 4 views
4

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

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

ответ

3

Изменение параметра имя пользователя из «сп = ххх, DC = ууу, DC = ZZZ» в «Домен \ Имя пользователя»

+0

Это работает! Благодаря! – KevinDeus

+0

Имела ту же проблему в Windows 7, но она отлично работает на WinXP. К счастью, мой коллега отправил мне этот пост. Благодарю. – Ghazaly

0

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

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

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

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

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

SearchResult result = srch.FindOne(); 

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

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

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    result = srch.FindOne(); 
}); 
Смежные вопросы