Вы должны попытаться разбить это на отдельные части, так что легче управлять логикой и проще находить места, где происходят ваши ошибки. Я обычно хожу со следующим подходом в этой ситуации:
- Создать
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, я настоятельно рекомендую вам скачать ее - она будет бесценна при диагностике проблем подключения с активной директорией.
Какие ** значения ** у вас есть в 'this.Host' и' ServerName' ?? Как выглядит ваша полная строка LDAP, которую вы используете для создания этой «DirectoryEntry»? –
Вот как выглядит моя строка LDAP: LDAP: //xyz.sdomain.com/CN=xyz,CN=Servers,CN=Default-First-Site,CN=Sites,CN=Configuration,DC=sdomain,DC= com – user2327795
И на ** какая строка точно ** эта ошибка возникает при отладке? –