System.DirectoryServices.Protocol вопрос поиска - PullRequest
1 голос
/ 02 сентября 2011

Я пытаюсь переписать поиск из 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 Ответ

1 голос
/ 04 сентября 2011

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

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

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

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