System.DirectoryServices.Protocol вопрос поиска

Я пытаюсь переписать поиск с System.DirectoryServices на System.DirectoryServices.Protocol

В S.DS я получаю все запрошенные атрибуты обратно, но в S.DS.P я не получаю GUID или HomePhone...

Остальное работает на одного пользователя.

Есть идеи?

public static List<AllAdStudentsCV> GetUsersDistinguishedName( string domain, string distinguishedName )
        {
            try
            {

                NetworkCredential credentials               = new NetworkCredential( ConfigurationManager.AppSettings[ "AD_User" ], ConfigurationManager.AppSettings[ "AD_Pass" ] ); 
                LdapDirectoryIdentifier directoryIdentifier = new LdapDirectoryIdentifier( domain+":389" ); 

                using ( LdapConnection connection           = new LdapConnection( directoryIdentifier, credentials ) )
                {

                    SearchRequest searchRequest = new SearchRequest( );
                    searchRequest.DistinguishedName = distinguishedName;
                    searchRequest.Filter = "(&(objectCategory=person)(objectClass=user)(sn=Afcan))";//"(&(objectClass=user))";
                    searchRequest.Scope = SearchScope.Subtree;
                    searchRequest.Attributes.Add("name");
                    searchRequest.Attributes.Add("sAMAccountName");
                    searchRequest.Attributes.Add("uid");
                    searchRequest.Attributes.Add("telexNumber"); // studId
                    searchRequest.Attributes.Add("HomePhone"); //ctrId
                    searchRequest.SizeLimit = Int32.MaxValue;
                    searchRequest.TimeLimit = new TimeSpan(0, 0, 45, 0);// 45 min - EWB

                    SearchResponse searchResponse = connection.SendRequest(searchRequest) as SearchResponse;

                    if (searchResponse == null) return null;

                    List<AllAdStudentsCV> users = new List<AllAdStudentsCV>();

                    foreach (SearchResultEntry entry in searchResponse.Entries)
                    {
                        AllAdStudentsCV user = new AllAdStudentsCV();

                        user.Active = "Y";
                        user.CenterName = "";
                        user.StudId = GetstringAttributeValue(entry.Attributes, "telexNumber");
                        user.CtrId = GetstringAttributeValue(entry.Attributes, "HomePhone");
                        user.Guid = GetstringAttributeValue(entry.Attributes, "uid");
                        user.Username = GetstringAttributeValue(entry.Attributes, "sAMAccountName");

                        users.Add(user);
                    }

                    return users;
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }

Кроме того, если я хочу получить КАЖДОГО пользователя в AD, чтобы я мог синхронизировать данные с моей базой данных SQL, как мне это сделать, я продолжал получать превышение максимального размера, ошибки. Я установил размер maxInt32... есть ли опция "игнорировать размер"?

Спасибо,

Eric-

1 ответ

Решение

Я думаю, что стандартным способом является использование System.DirectoryServices, а не System.DirectoryServices.Protocol. Почему вы хотите использовать позже?

Что касается вашего второго вопроса о сообщении об ошибке "превышен максимальный размер", то это может быть связано с тем, что вы пытаетесь получить слишком много записей одновременно.
Active Directory ограничивает количество объектов, возвращаемых запросом, чтобы не перегружать каталог (ограничение составляет около 1000 объектов). Стандартный способ получения всех пользователей - использование поисковых запросов.

Алгоритм такой:

  1. Вы строите запрос, который будет выбирать всех пользователей
  2. В этом запросе вы указываете определенный элемент управления (Paged Result Control), указывающий, что это поисковый поиск, с 500 пользователями на страницу
  3. Вы запускаете запрос, выбираете первую страницу и анализируете первые 500 записей на этой странице.
  4. Вы просите AD для следующей страницы, разбираете следующие 500 записей
  5. Повторяйте, пока не останется страниц
Другие вопросы по тегам