2013-07-23 2 views
7

Это код, я использую для подключения к LDAPСервер не работает

using (DirEntry = new DirectoryEntry(string.Format("LDAP://{0}/{1}", this.Host, ServerName))) 
     { 
      DirEntry.RefreshCache(); 
      if (!string.IsNullOrEmpty(UserName)) 
      { 
       DirEntry.Username = UserName; 
       DirEntry.Password = PassWord; 
      } 
      if (DirEntry.Properties.Contains("objectGUID")) 
      { 
       byte[] guiddatet = (byte[])DirEntry.Properties["objectGUID"].Value; 
       return new Guid(guiddatet); 
      } 

я получаю «Сервер не работает» сообщение об ошибке при запуске кода.

Может кто-нибудь, пожалуйста, скажите мне, где я делаю это неправильно. И все равно, чтобы заменить вышеуказанный код прямым запросом LDAP.

+0

Какие ** значения ** у вас есть в 'this.Host' и' ServerName' ?? Как выглядит ваша полная строка LDAP, которую вы используете для создания этой «DirectoryEntry»? –

+0

Вот как выглядит моя строка LDAP: LDAP: //xyz.sdomain.com/CN=xyz,CN=Servers,CN=Default-First-Site,CN=Sites,CN=Configuration,DC=sdomain,DC= com – user2327795

+0

И на ** какая строка точно ** эта ошибка возникает при отладке? –

ответ

2

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

  • Создать LdapConnection объект, так что вы можете установить параметры, необходимые
  • настроить NetworkCredential экземпляр с административным именем и паролем
  • Bind в каталог с пользователь, так что вы можете выдавать прямые запросы LDAP
  • возвращающие SearchResultEntry, так что вы можете обработать его свойства были

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

//Delcare your Network Credential with the administrative Username, Password, and your active directory domain 
var credentials = new NetworkCredential(userName, password, domain); 

//Create a directory identifier and connection, 
var ldapidentifier = new LdapDirectoryIdentifier(serverName, port, false, false); 
var ldapconn = new LdapConnection(ldapidentifier, credentials); 

Далее, убедитесь, что вы устанавливаете право AuthType для вашего конкретного случая. Поскольку вы подключаетесь через порт 389, просто используйте AuthType.Basic.

ldapconn.AuthType = AuthType.Basic; 

Как вы уже сказали, существует очень простой способ настроить прямой запрос LDAP с использованием этого подхода. Я предполагаю, что вы ищете по sAMAccountName, но вы можете изменить это по мере необходимости:

string ldapFilter = "(&(objectCategory=person)(objectClass=user)(&(sAMAccountName={{UserYouAreTryingToFind}})))"; 

Теперь мы просто должны установить запрос поиска, и отправить его соответствующим образом:

//Send the search request with our delimited attribute list 
var getUserRequest = new SearchRequest(domain, ldapFilter, SearchScope.Subtree, AttributeList) 
            {SizeLimit = 1}; 

//Suppress any refferal creation from happening during the search 
var SearchControl = new SearchOptionsControl(SearchOption.DomainScope); 
getUserRequest.Controls.Add(SearchControl); 
var userResponse = (SearchResponse)ldapconn.SendRequest(getUserRequest); 

//This is where I load up the entry I've located, 
SearchResultEntry ResultEntry = userResponse.Entries[0]; 

Это должно верните пользователя, которого вы запросили, а также все свойства, которые вы поместили в AttributeList. В этом контексте AttributeList - это только строковый массив (string[]) имен свойств - в вашем случае вам нужно добавить один объект «objectGUID».

Как для чтения свойств на SearchResultEntry, вы можете сделать именно то, что вы были изначально:

if(ResultEntry.Attributes.Contains("objectGUID")) 
{ 
    // do some stuff here 
} 

Это должно помочь вам начать работу в правильном направлении.

Кроме того, если у вас еще нет копии wireshark, я настоятельно рекомендую вам скачать ее - она ​​будет бесценна при диагностике проблем подключения с активной директорией.

Смежные вопросы