EPIDEMIASH
@EPIDEMIASH
Человек швейцарский нож

Как получить список memberOf группы AD?

Всем привет. Пытаюсь получить список memberOf определенной группы.

К примеру есть группа, мне нужно вытащить этот список:

60afb3e273059614871801.jpeg

Я без проблем ищу группы и их атрибуты (например имя, описание). Когда дело доходит вытащить memberOf в список, ничего не происходит.

Сейчас пытаюсь вытащить через данный метод.

public ArrayList AttributeValuesMultiString(string attributeName,
     string objectDn, ArrayList valuesCollection, bool recursive)
{
    DirectoryEntry ent = new DirectoryEntry(objectDn);
    PropertyValueCollection ValueCollection = ent.Properties[attributeName];
    IEnumerator en = ValueCollection.GetEnumerator();

    while (en.MoveNext())
    {
        if (en.Current != null)
        {
            if (!valuesCollection.Contains(en.Current.ToString()))
            {
                valuesCollection.Add(en.Current.ToString());
                if (recursive)
                {
                    AttributeValuesMultiString(attributeName, "LDAP://" +
                    en.Current.ToString(), valuesCollection, true);
                }
            }
        }
    }
    ent.Close();
    ent.Dispose();
    return valuesCollection;
}


На выходе ArrayList перевожу в ListView, хотя бы 1 элемент пока:

foreach(string str in glist) 
{
var items = new ListViewItem();
items.Text = str;
MyListView.Items.Add(items);
}


Но ничего не получаю, ошибок нет.

P.S пробовал так, вообще не завелось

Источник
// Описываем функцию формирования подгрупп
        private List<string> ADGrouppList(string ADGroupp)
        {
            // Объявляем список для хранения полных имен групп
            List<string> ADGrouppM = new List<string>();
            // Указываем домен для поиска
            string deConnectionString = "LDAP://DC=msk,DC=aeroflot,DC=ru";
            // Защита от ошибок
            try
            {
                using (var entry = new DirectoryEntry(deConnectionString))
                using (var search = new DirectorySearcher(entry))
                {
                    string query = string.Format("(&(objectClass=group){0})", ADGroupp); // Описываем фильтр
                    search.Filter = query;
                    search.PropertiesToLoad.Add("Name"); // Имена групп
                    search.PropertiesToLoad.Add("adspath"); // LDAP-путь к группе
                    search.PropertiesToLoad.Add("memberof"); // Членство в группе
                    // Ищем все группы с именем из переменной ADGroupp
                    using (var mySearchResultColl = search.FindAll())
                        if (mySearchResultColl.Count > 0) // Если находим хотя бы одну
                        {
                            string SAD = ""; 
                            foreach (SearchResult ADResult in mySearchResultColl)
                            {
                                foreach (object property in ADResult.Properties["adspath"])
                                    SAD = property.ToString();
                                if (SAD == "LDAP://CN=Domain Admins,CN=Users,DC=msk,DC=aeroflot,DC=ru")
                                    MessageBox.Show("Domain admins","Exception");
                                ADGrouppM.Add("(memberof=CN=" + SAD.Substring(10,
                                    SAD.Length - 10) + ")"); // Обрезаем первые 10 символов                                
                                ADGrouppM.AddRange(ADGrouppList("(memberof=CN=" + SAD.Substring(10,
                                    SAD.Length - 10) + ")")); // Добавляем подгруппы подгруппы подгруппы ...
                                
                            }
                        }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error");
            }
            return ADGrouppM;
        }

  • Вопрос задан
  • 610 просмотров
Решения вопроса 1
EPIDEMIASH
@EPIDEMIASH Автор вопроса
Человек швейцарский нож
В общем сам отвечаю на свой вопрос:

Получаем информацию о группе в AD

var ctd = new PrincipalContext(ContextType.Domain); // Получаем текущий домен
string Group = data; // Задаем имя группы для поиска (у меня тянет data из другой формы)
var getGR = GroupPrincipal.FindByIdentity(ctd, Group); // Ищем нашу группу и атрибуты

// Выводим имя и описание
lg_name.Text = getGR.SamAccountName;
lg_desc.Text = getGR.Description;


Далее в моем случаи нужно получить вкладку "Член групп"

int sumGroups = 0;

PrincipalSearchResult<Principal> g = getGR.GetGroups();
foreach (var usr in g)
{
this.listGroup.Items.Add(usr.SamAccountName); // Вывожу перебором все найденные подгруппы в список
sumGroups++;
}


Если нужны пользователи "Члены групп", то соответственно:

PrincipalSearchResult<Principal> g = getGR.GetMembers()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@NortheR73
системный инженер
Утверждают, что такой способ работает...

P.S. Сам не проверял, ибо для таких целей использую больше PowerShell
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы