Отсутствующие атрибуты в SearchResultEntry - PullRequest
0 голосов
/ 23 апреля 2020

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

Что мне здесь не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...