Ошибка при получении членов группы, которая содержит подгруппу - PullRequest
0 голосов
/ 09 ноября 2019

Я создал форму dot.net, которая использует код c # для извлечения членов группы Active Directory, которую пользователь выбирает из раскрывающегося списка, а затем отображает список участников (пользователи - все, что я хочу) на веб-странице.

Это прекрасно работает для групп, которые НЕ содержат подгрупп. Когда группа Active Directory содержит пользователей и подгруппы, я получаю сообщение об ошибке.

Я хочу, чтобы только пользователи группы выбирались из выпадающего списка. Я не хочу пользователей из каких-либо подгрупп.

Я много занимался поиском в Интернете и тестировал различные варианты кода.

public List<string> GetAllUsersFromGroup(string domain, 
  string group)
{
    List<string> retVal = new List<string>();
    DirectoryEntry entry = new DirectoryEntry(domain);
    DirectorySearcher searcher = new DirectorySearcher("
     (&(objectCategory=Group)(cn=" + group + "))");

    searcher.SearchRoot = entry;
    searcher.SearchScope = SearchScope.Subtree;
    SearchResult result = searcher.FindOne();

    var x = 0;
    var txtCN = ""; 
    var txtDispName = ""; 
    var firstItem = 0; // Display Name
    var secondItem = 1; // CN 
    var arraryResultsSize = result.Properties["member"].Count;
    string[] deResultsArray = new string[arraryResultsSize];

    foreach (string member in result.Properties["member"])
    {
        DirectoryEntry de = new DirectoryEntry(String.Concat(domain, 
        "/", member.ToString()));

        if (de.Properties["objectClass"].Contains("user") && 
        de.Properties["cn"].Count > 0)
        {
            deResultsArray[x] = de.Properties["displayName"]
            [0].ToString() + "~" + de.Properties["cn"]
            [0].ToString();
        }
        x = x + 1;
    }

    if (deResultsArray[0] != null) {
        string[] sortSeperatedItems = sortLDAPUsers(deResultsArray);

        for (var i = 0; i < sortSeperatedItems.Length/2; i++) {
            txtDispName = "<tr><td>" + sortSeperatedItems[firstItem] 
            + "</td>";
            txtCN = "<td>" + sortSeperatedItems[secondItem] + "</td>
            </tr>";
            retVal.Add(txtDispName);
            retVal.Add(txtCN);
            firstItem = firstItem + 2;
            secondItem = secondItem + 2;
        }
    } else {
        txtDispName = "<tr><td>Group has no members</td>";
        txtCN = "<td>&nbsp;</td></tr>";
        retVal.Add(txtDispName);
        retVal.Add(txtCN);
    }

    // retVal.Add("Array Size is: " + propCount);

    return retVal;
}

public string[] sortLDAPUsers(string[] strArray) {
    Array.Sort(strArray);
    var newArraySize = (strArray.Length * 2);
    string[] itemSeperated = new string[2];
    string[] allSepItems = new string[newArraySize];
    var arrayItemsString = "";
    var xDName = 0;
    var xCName = 1;

    for (var i = 0; i < strArray.Length; i++) {

       itemSeperated = strArray[i].Split('~');
       allSepItems[xDName] = itemSeperated[0];
       allSepItems[xCName] = itemSeperated[1];

       arrayItemsString = arrayItemsString + "Length of allSepItems 
       is: " + allSepItems.Length + " Text is: " + 
       allSepItems[xDName] + " NetId is: " + allSepItems[xCName] + 
       "<br><br>";

       xDName = xDName + 2;
       xCName = xCName + 2;
    }

    return allSepItems;

}

Когда пользователь выбирает группу Active Directory, которая содержит пользователей и подгруппы, я получаю следующую ошибку:

Сведения об исключении: System.NullReferenceException: ссылка на объект не установленак экземпляру объекта.

Ошибка источника:

Line 205:        for (var i = 0; i < strArray.Length; i++) {
Line 206:           
Line 207:           itemSeperated = strArray[i].Split('~');
Line 208:           allSepItems[xDName] = itemSeperated[0];
Line 209:           allSepItems[xCName] = itemSeperated[1];

Я думаю, что ошибка связана с тем, как я фильтрую или получаю результаты в GetAllUsersFromGroup (). Я не знаю, как просто получить пользователей из группы и не включать какие-либо подгруппы в результаты.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Вам не нужно работать так усердно, когда вы можете позволить Microsoft Active Directory выполнить эту работу.

Запрос поиска LDAP с фильтром LDAP для Разрешить всех участников (включая вложенные) Группы безопасности (требуется как минимум Windows 2003 SP2)

(&(objectClass=user)(memberof:1.2.840.113556.1.4.1941:=CN=GroupOne,OU=Security Groups,OU=Groups,DC=YOURDOMAIN,DC=NET) 

Это вернет все (objectClass = user), которые являются членами "GroupOne".

0 голосов
/ 10 ноября 2019

Проблема с этим фильтром (&(objectCategory=Group)(cn=<group>)) заключается в том, что вы запрашиваете у определенной группы итерации и получаете всех ее членов независимо от типа / objectClass, поэтому у вас остаетсяпользователи, группы и т. д.

Вместо этого вы можете запросить пользователей, которые являются членами этой группы напрямую, используя соответствующий фильтр:

new DirectorySearcher("(&(objectCategory=person)(memberOf=" + groupDN + "))");

Обратите внимание, что memberOf атрибут должен совпадать с DN, поэтому, учитывая переданную переменную group (если вызывающая сторона не может передать фактическую группу dn), вам, возможно, придется сначала захватить его, используя 1-й фильтр.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...