c# через Получить список пользователей из Active Directory в данной группе AD




c# авторизация через active directory (4)

Глядя на ваш поиск, у меня есть пара очков для вас. Во-первых, поиск использует objectClass (неиндексированный) вместо objectCategory (индексированный). Огромная производительность с этим запросом. Вы всегда хотели бы объединить их в зависимости от того, что вы пытаетесь извлечь:

(&(objectCategory=person)(objectClass=user)) = All users (no contacts)
(&(objectCategory=person)(objectClass=contact)) = All contacts (no users)
(&(objectCategory=person)) = All users and contacts

Что касается поиска пользователей в группе, вы можете перечислить список объектов-членов определенной группы. В атрибуте member объекта group находится имя differName каждого пользователя.

В этой статье описываются перечисления членов группы ...

Не забывайте, что вам, возможно, придется обрабатывать вложенные группы родительской группы, так как нет способа по умолчанию обрабатывать запросы LDAP. Для этого вам может потребоваться оценить, является ли объект-член группой, а затем получить атрибут member для этой дочерней группы.

Наконец, вы должны привыкнуть указывать префикс DNS для вашего запроса.

Без префикса DNS:

LDAP://ou=ouname,dc=domain,dc=com

С DNS-префиксом (все три работы):

LDAP://servername/ou=ouname,dc=domain,dc=com
LDAP://servername.domain.com/ou=ouname,dc=domain,dc=com
LDAP://domain.com/ou=ouname,dc=domain,dc=com

Один домен не вызовет много проблем, но когда вы попытаетесь запустить поиск в среде с несколькими доменами, вы будете укушены без этого добавления. Надеюсь, это поможет вам приблизиться к вашей цели.

У меня есть код, который ищет всех пользователей в отделе:

string Department = "Billing";
DirectorySearcher LdapSearcher = new DirectorySearcher();
LdapSearcher.PropertiesToLoad.Add("displayName");
LdapSearcher.PropertiesToLoad.Add("cn");
LdapSearcher.PropertiesToLoad.Add("department");
LdapSearcher.PropertiesToLoad.Add("title");
LdapSearcher.PropertiesToLoad.Add("memberOf");
LdapSearcher.Filter = string.Format("(&(objectClass=user)(department={0}))", Department);
SearchResultCollection src = LdapSearcher.FindAll();

Что бы фильтр должен был выглядеть, если бы я хотел только всех в группе AD Manager?

Неужели я все это делаю неправильно?



Если вы знаете путь AD к группе, то, вероятно, было бы легче открыть DirectoryEntry, а затем сделать DirectorySearcher оттуда.

using (DirectoryEntry de = new DirectoryEntry("LDAP://somedomain/CN=FooBar"))
{
   DirectorySearcher search = new DirectorySearcher(de, ("(objectClass=user)"));
}

В Searcher есть также флаг для того, чтобы развернуть до субконтейнеров, я забыл название с руки.


    //Search for Group and list group members

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.DirectoryServices.AccountManagement;

namespace ExportActiveDirectoryGroupsUsers
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args == null)
            {
                Console.WriteLine("args is null, useage: ExportActiveDirectoryGroupsUsers OutputPath"); // Check for null array
            }
            else
            {
                Console.Write("args length is ");
                Console.WriteLine(args.Length); // Write array length
                for (int i = 0; i < args.Length; i++) // Loop through array
                {
                    string argument = args[i];
                    Console.Write("args index ");
                    Console.Write(i); // Write index
                    Console.Write(" is [");
                    Console.Write(argument); // Write string
                    Console.WriteLine("]");
                }
                try
                {
                    using (var ServerContext = new PrincipalContext(ContextType.Domain, ServerAddress, Username, Password))
                    {
                        /// define a "query-by-example" principal - here, we search for a GroupPrincipal 
                        GroupPrincipal qbeGroup = new GroupPrincipal(ServerContext, args[0]);

                        // create your principal searcher passing in the QBE principal    
                        PrincipalSearcher srch = new PrincipalSearcher(qbeGroup);

                        // find all matches
                        foreach (var found in srch.FindAll())
                        {
                            GroupPrincipal foundGroup = found as GroupPrincipal;

                            if (foundGroup != null)
                            {
                                // iterate over members
                                foreach (Principal p in foundGroup.GetMembers())
                                {
                                    Console.WriteLine("{0}|{1}", foundGroup.Name, p.DisplayName);
                                    // do whatever you need to do to those members
                                }
                            }

                        }
                    }
                    //Console.WriteLine("end");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Something wrong happened in the AD Query module: " + ex.ToString());
                }
                Console.ReadLine();
            }
        }
    }
}




active-directory