У нас есть небольшое приложение, которое отвечает за считывание данных из активного каталога. В наших локальных тестах результаты, которые мы получили с помощью экземпляра SearchRequest, выглядели хорошо. Но теперь у нас есть клиент, у которого атрибут «cn» отсутствует без причины (или так мы думаем).
Контроллер домена клиента работает в той же ОС, что и наши локальные тесты (Windows Server 2016).
Некоторые различия между сценарием клиента и нашим тестом:
- Клиент использует порт 636, мы используем 389
- Активный каталог клиента не работает на том же сервере, что и наше приложение.
Наш подход выглядит следующим образом:
string domainName = "domain";
string baseDn = "basedn";
string adminDN = "CN=ADMINDN";
string adminPassword = "password";
int port = 389;
string userSearchFilter = "(&(objectClass=person)(objectClass=user))";
//SearchRequest APPROACH
IList<SearchResultEntryCollection> pagedResults = new List<SearchResultEntryCollection>();
LdapDirectoryIdentifier ldapDirectoryIdentifier = new LdapDirectoryIdentifier(domainName, port);
NetworkCredential networkCredential = new NetworkCredential(adminDN, adminPassword);
LdapConnection ldapConnection = new LdapConnection(ldapDirectoryIdentifier, networkCredential, AuthType.Basic);
ldapConnection.SessionOptions.ProtocolVersion = 3;
ldapConnection.Bind();
SearchRequest searchRequest = new SearchRequest
(baseDn,
userSearchFilter,
System.DirectoryServices.Protocols.SearchScope.Subtree,
null);
SearchOptionsControl searchOptions = new SearchOptionsControl(System.DirectoryServices.Protocols.SearchOption.DomainScope);
searchRequest.Controls.Add(searchOptions);
SearchResponse searchResponse = (SearchResponse)ldapConnection.SendRequest(searchRequest);
textBuilder.Clear();
foreach (SearchResultEntry searchResultEntry in searchResponse.Entries)
{
foreach (DirectoryAttribute directoryAttribute1 in searchResultEntry.Attributes.Values)
{
object[] objectArray = directoryAttribute1.GetValues(typeof(byte[]));
byte[] byteArray = (byte[])objectArray[0];
textBuilder.AppendLine("UC Attributename:" + directoryAttribute1.Name + " AttributeValue: " + Encoding.UTF8.GetString(byteArray));
}
}
File.WriteAllText(".\\searchRequestlOutput.txt", textBuilder.ToString());
Чтобы проверить, действительно ли проблема заключается в реализации, я реализовал то же самое с PrincipalClass, который выглядит следующим образом:
string username = "admin";
string adminPassword = "password";
string domainName = "domain";
StringBuilder textBuilder = new StringBuilder();
//PRINCIPAL APPROACH
using (var context = new PrincipalContext(ContextType.Domain, domainName, username, adminPassword))
{
using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
foreach (var result in searcher.FindAll())
{
DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
textBuilder.AppendLine();
foreach (string strProperty in de.Properties.PropertyNames)
{
textBuilder.AppendLine(strProperty + ": " + de.Properties[strProperty].Value);
}
}
}
File.WriteAllText(".\\principalOutput.txt", textBuilder.ToString());
}
С основным подходом я могу прочитать все атрибуты, в том числе 'cn' на стороне клиента. Подход SearchRequest не предлагает никаких «cn» и никаких ошибок, которые мы могли бы исследовать далее. Словарь просто не предлагает атрибут 'cn'.
Что мне здесь не хватает?