Получить всех пользователей и контакты из группы в Active Directory

Я искал решение для получения пользователей и контактов из группы в Active Directory, но не могу найти.

Я понимаю, что не могу получить контакты так же, как пользователи, потому что они не являются участниками безопасности?

Я использую этот код для получения всех пользователей в моей группе. Можно ли расширить его для получения имени и номера мобильного телефона из контактов? Или мне нужно написать что-то новое?

            var context = new PrincipalContext(ContextType.Domain, "MY_DOMAIN");
            using (var searcher = new PrincipalSearcher())
            {
                var groupName = "MY_GROUP";
                var sp = new GroupPrincipal(context, groupName);
                searcher.QueryFilter = sp;
                var group = searcher.FindOne() as GroupPrincipal;

                if (group == null)
                    Console.WriteLine("Invalid Group Name: {0}", groupName);

                foreach (var f in group.GetMembers())
                {
                    var principal = f as UserPrincipal;

                    if (principal == null || string.IsNullOrEmpty(principal.Name))
                        continue;

                    DirectoryEntry entry = (principal.GetUnderlyingObject() as DirectoryEntry);
                    DirectorySearcher entrySearch = new DirectorySearcher(entry);
                    entrySearch.PropertiesToLoad.Add("mobile");
                    entrySearch.PropertiesToLoad.Add("sAMAccountName");
                    entrySearch.PropertiesToLoad.Add("name");
                    SearchResultCollection results = entrySearch.FindAll();

                    ResultPropertyCollection rpc = results[0].Properties;
                    foreach (string rp in rpc.PropertyNames)
                    {
                        if (rp == "mobile")
                            Console.WriteLine(rpc["mobile"][0].ToString());

                        if(rp == "sAMAccountName")
                            Console.WriteLine(rpc["sAMAccountName"][0].ToString());
                    }

1 ответ

Решение

Вы не можете использовать System.DirectoryServices.AccountManagement пространство имен для запроса контактной информации из Active Directory, поскольку, как вы указали, они не являются принципами безопасности. Вам нужно будет прочитать и разобрать member собственность группы прямо из группы DirectoryEntry, Это будет список отличительных имен всех объектов, которые являются членами группы. Из этого нельзя узнать, что это за объект, так что вам нужно будет запросить AD для каждого, чтобы узнать.

У вас есть весь код, необходимый для достижения этой цели, в том, что вы опубликовали, просто добавьте member свойство в список загрузки, а затем зациклить, хотя он загружает новый DirectoryEntry объекты. objectClass собственность скажет вам, если это пользователь, группа или контакт.

Другие вопросы по тегам