powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как быстро получить список пользователей из домена?
11 сообщений из 11, страница 1 из 1
Как быстро получить список пользователей из домена?
    #38846239
Raziel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
using (var context = new PrincipalContext(ContextType.Domain))
using (var queryFilter = new UserPrincipal(context))
using (var searcher = new PrincipalSearcher(queryFilter))
{
............
}


Работает 5-6 минут. Пользователей реально много и, видимо, сервер домена сильно загружается. Есть какой-нибудь альтернативный способ?
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846305
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Razielреально много
Это сколько все же?
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846327
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raziel,

используй DirectoryServices
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846358
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesиспользуй DirectoryServices
Мегаприроста не получится - DirectoryServices.AccountManagement является просто чуть более удобной оберткой над обычным DirectoryServices. Это если действительно нужны вообще все пользователи. Если их как-то можно отфильтровать - использовать LDAP filters, тогда да, с DirectoryServices будет быстрее.
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846379
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

около 2000 пользователей должны грузится секунд 5-10 максимум при благоприятных условиях. Возможно проблема в самом домене, а точнее в доменах, авторизации и объёме загружаемых полей, ведь на сколько я помню в DirectoryServices можно загружать их не все разом (во время поиска). А остальные свойства уже подгружать по необходимости. Так же влияет сама загруженность домена, возможно он выполняет и другие роли, типа почты, веба, файл сервера, разрешение ip адреса контроллера домена на dns сервере.

сколько примерно пользователей в домене?
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846398
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesведь на сколько я помню в DirectoryServices можно загружать их не все разом (во время поиска).
Параметр PageSize - определяет размер подгружаемой страницы с данными. И по умолчанию он равен нулю - т.е. FindAll() начинает тянуть вообще всё, что есть на контроллере по запросу. PrincipalSearcher для LDAP-запросов устанавливает PageSize по умолчанию у underlying DirectorySearcher вроде как в 256, хотя многое рекомендуют выставлять его в 1000. Еще можно попробовать поэкспериментировать со списком загружаемых свойств - у DirectorySearcher он находится в свойстве PropertiesToLoad, а вот в PrincipalSearcher (точнее, у StoreCtx) он жестко вшит в код. Уменьшить этот список до нужного минимума, и проверить время отработки.
Я бы в любом случае думал в сторону загруженности домена - у меня есть сервис, который тянет списки пользователей с трех доменов, в каждом домене ~1500 пользователей - работает около минуты.
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846420
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

я сталкивался с этими граблями, PageSize просто ограничивает количество получаемых записей, конечно это влияет на скорость. Позволяет загрузить к примеру 100 записей и не более, а потом делать 2 запрос, если это вообще требуется.
помню при уменьшении загружаемых свойств скорость сильно возрастала. Обычно надо 2-3 поля и не более.
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846572
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raziel
Код: c#
1.
2.
3.
4.
5.
6.
using (var context = new PrincipalContext(ContextType.Domain))
using (var queryFilter = new UserPrincipal(context))
using (var searcher = new PrincipalSearcher(queryFilter))
{
............
}


Работает 5-6 минут. Пользователей реально много и, видимо, сервер домена сильно загружается. Есть какой-нибудь альтернативный способ?

Что в queryFilter?
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846671
Raziel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как можно вытащить только Sid и SamAccountName?

МСУЧто в queryFilter?
Ничего. Он чуть выше создаётся.
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846680
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай тут и выбери себе оптимальный вариант, тема баян. Там и регистрация расширенных фильтров и всё остальное.[/quot]
...
Рейтинг: 0 / 0
Как быстро получить список пользователей из домена?
    #38846706
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raziel,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
private static ICollection<string> GetDomains()
        {
            ICollection<string> domains = new List<string>();
            foreach (Domain d in Forest.GetCurrentForest().Domains)
                domains.Add(d.Name);

            return domains;
        }

public static UserDomain GetUserDomain(string login)
        {
            foreach (string domainName in GetDomains())
            {
                DirectoryContext context = new DirectoryContext(DirectoryContextType.Domain, domainName,
                RegistrySettings.LDAPUserName, RegistrySettings.LDAPPassword);
                Domain domain = Domain.GetDomain(context);
                using (DirectoryEntry domainEntry = domain.GetDirectoryEntry())
                {
                    using (DirectorySearcher searcher = new DirectorySearcher())
                    {
                        searcher.SearchRoot = domainEntry;
                        searcher.SearchScope = SearchScope.Subtree;
                        searcher.PropertiesToLoad.Add("samAccountName");
                        searcher.PropertiesToLoad.Add("displayName");
                        if (String.IsNullOrEmpty(login))
                            throw new ArgumentNullException("login","Не задано имя пользователя");
                        string[] loginParts = login.Split('\\');
                        searcher.Filter = string.Format(CultureInfo.InvariantCulture, 
                            "(&(objectClass=user)(samAccountName={0}))", loginParts[loginParts.Count() - 1]);
                        try
                        {
                            SearchResultCollection results = searcher.FindAll();
                            if (results == null || results.Count == 0)
                                continue;
                            UserDomain user = new UserDomain();
                            user.DisplayName = results[0].Properties["displayName"][0].ToString();
                            user.sAMAccountName = results[0].Properties["samAccountName"][0].ToString();
                            return user;
                        }
                        finally
                        {
                            domain.Dispose();
                        }
                    }
                }
            }
            return null;
        }


850 пользователей. Поиск меньше секунды
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как быстро получить список пользователей из домена?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]