Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Windows > Неправильная выборка из Active Directory


Автор: eon 15.11.2010, 09:38
Здравствуйте. Себя к админам не отношу. Работаю кодером.
При попытке выборки информации о пользователях из AD возникли проблемы.
Вот код выборки:
Код

textBox1.Text = "";
            String FML = "";  // здесь будем хранить инициалы
            String OU = "";    // а здесь отдел
            /* Соединяемся с Active Directory */
            DirectoryEntry entry = new DirectoryEntry("LDAP://blablabla.ru", @"domain\login", "pass");
            /* Создаем обьект для поиска */
            DirectorySearcher mySearcher = new DirectorySearcher(entry);
            /* Сортировка по убыванию */
            mySearcher.Sort = new SortOption("displayName", SortDirection.Ascending);
            /* Проходимся по всех найденных обьектах */
            foreach (SearchResult resEnt in mySearcher.FindAll())
            {
                /* Получаем DirectoryEntry для каждого обьекта AD */
                DirectoryEntry de = resEnt.GetDirectoryEntry();
                /* Если пользователь имеет имя... */
                if (de.Properties["displayName"].Value != null)
                {
                    /* ...начинаем просмотр всех групп */
                    for (int i = 0; i < de.Properties["MemberOf"].Count; i++)
                    {
                            /* Извлекаем Фамилию и инициалы */
                            FML = de.Properties["displayName"].Value.ToString();
                            /* А теперь извлекаем OU(отдел) пользователя*/
                            OU = de.Parent.Path.ToString();
                            /* Выводим искомую информацию в форматированном виде. */
                            textBox1.Text += String.Format("{0}\t{1}", FML, OU) + "\r\n" + de.Properties["MemberOf"][i] + "\r\n ---------------------------------------- \r\n";
                        }
                    }
                }
            }

Предположим, нашли объект с непустым именем (допустим нашего сисадмина), далее /* ...начинаем просмотр всех групп */:
и на строке: for (int i = 0; i < de.Properties["MemberOf"].Count; i++)
свотрю в watch'ах de.Properties["MemberOf"].Count = 4.
Подхожу к нему, он мне показывает, что состоит в ПЯТИ группах. А у меня выборка выдает что в ЧЕТЫРЕХ группах.
Если смотреть мою учетку, то выводится правильно: две группы.
Одна из групп "Пользователи домена". Вот не показывается эта группа у многих учеток, а в ней состоят ВСЕ. Я показываюсь, кто-то не показывается. В чем может быть дело? Наш сисадмин не знает, все абсолютно одинаково входят в эту группу. 
PS: простите если не правильно как-то написал. Ну думаю, кто-нибудь меня поймет.

Автор: mihryak 15.11.2010, 19:55
Domain Users - "особая" группа, членство в ней через ldap-запросы высчитывается немного иначе
Для работы с юзерами-группами во фрейморке 3.0 появились удобные классы пространства имён System.DirectoryServices.AccountManagement из одноимённой сборки
Вот так можно перечислить всех юзеров домена текущего пользователя и все их группы:
Код

    using (PrincipalContext userContext = new PrincipalContext(ContextType.Domain, Environment.UserDomainName))
    using (UserPrincipal queryFilter = new UserPrincipal(userContext))
    using (PrincipalSearcher principalSearcher = new PrincipalSearcher(queryFilter))
    {
        foreach (var userPrincipal in principalSearcher.FindAll())
        {
            using (userPrincipal)
            {
                Console.WriteLine("User: {0}. Groups: {1}.", userPrincipal.Name,
                    string.Join(", ", userPrincipal.GetGroups().Select(group => group.Name).ToArray()));
            }
        }
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)