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 объектов). Стандартный способ получения всех пользователей - использование поисковых запросов.
Алгоритм такой:
- Вы строите запрос, который будет выбирать всех пользователей
- В этом запросе вы указываете определенный элемент управления (Paged Result Control), указывающий, что это поисковый поиск, с 500 пользователями на страницу
- Вы запускаете запрос, выбираете первую страницу и анализируете первые 500 записей на этой странице.
- Вы просите AD для следующей страницы, разбираете следующие 500 записей
- Повторяйте, пока не останется страниц