Как получить косвенные группы пользователей AD? - C # - PullRequest
4 голосов
/ 20 декабря 2010

Я использую DirectorySearcher, чтобы получить группы пользователей AD, членами которых он является, с помощью свойства memberof.Но согласно этой странице MSDN свойство memberof возвращает только те прямые группы, в которых пользователь является участником.Как я могу получить косвенные группы пользователя тоже.

Например:

Group A -> User X, User Y, Group B
Group B -> User Z
Group C -> User Z

Я хочу получить результат как Группа A, Группа B, Группа C для пользователя Z, так какон является косвенным пользователем группы А.

Обновление

Okie.Я следовал этой статье codeproject, чтобы рекурсивно получить группы.Но встроенная группа «Пользователи домена» отсутствует в списке.Так значит ли это, что встроенные группы не будут появляться в поисковике каталогов?

Ответы [ 4 ]

1 голос
/ 18 июля 2012

Основная группа пользователя не будет отображаться в свойстве memberOf.Вместо этого его RID хранится в свойстве «primaryGroupID», и вы должны рассчитать SID группы по этому RID (который является SID домена + RID группы).

Вот почему вы не смогли найти пользователей доменагруппа (которая является основной группой пользователя)

1 голос
/ 27 января 2011

Мой ответ следует тем же строкам, что и Джоэл Этертон, но с кодом.Я реализовал это некоторое время назад в одном из моих приложений.Все, что вам нужно сделать, это интерпретировать VB.Net для C # :).Код ниже возьмет группу и вернет все дочерние группы.Так что вам просто нужно пройтись по каждой группе и поместить их в список.Я ссылаюсь на несколько методов, которые я не включил, но они должны быть самоочевидными.Я включил PrincipalGenericCollection, так как это может быть удобно.

Public Function GetSubGroups(ByVal groupname As String) As List(Of String)
    Dim result As New List(Of String)()

    GetSubGroups(groupname, result)

    Return result
End Function

Public Sub GetSubGroups(ByVal Group As String, ByRef l As List(Of String))
    Dim grp = GetGroup(Group)

    'sometimes group will be null if its a system built in group like "authenticated users"'
    If grp Is Nothing Then
        Exit Sub
    End If

    Dim sGroups = GetGroupMembership(Group, False).Where(Function(c) TypeOf c Is GroupPrincipal)

    For Each g In sGroups
        Dim n As String = FormatPrincipalName(g.Name)

        If Not l.Contains(n) Then
            l.Add(n)

            GetSubGroups(g.Name, l)
        End If
    Next
End Sub

Public Function GetGroupMembership(ByVal GroupName As String, Optional ByVal Recursive As Boolean = True) As PrincipalGenericCollection(Of Principal)
    Dim group As GroupPrincipal = GetGroup(GroupName)

    If group Is Nothing Then
        Return Nothing
    End If

    Dim prinCol As New PrincipalGenericCollection(Of Principal)(group.GetMembers(Recursive))

    prinCol.SortByName()

    Return prinCol
End Function


Public Class PrincipalGenericCollection(Of T As Principal)
    Inherits List(Of T)

    Public Sub New()
        MyBase.New()
    End Sub

    Public Sub New(ByVal collection As PrincipalCollection)
        For Each p As Principal In collection
            Me.Add(p)
        Next
    End Sub

    Public Sub New(ByVal collection As IEnumerable(Of T))
        MyBase.New(collection)
    End Sub

    Public Sub SortByName()
        Sort(New PrincipalSorter(Of T))
    End Sub
End Class
1 голос
/ 20 декабря 2010

Вы должны определить свой собственный метод итерации по прямым группам, пока не достигнете общего корня для всех. Вам нужно будет выполнить запрос LDAP для каждой группы и использовать один и тот же атрибут memberOf, чтобы определить, к какой группе принадлежит эта группа. Это может занять много времени, особенно если группы многочисленны и выложены в виде веб-страниц.

0 голосов
/ 20 декабря 2010

Звучит как простой рекурсивный подход. Найдите группы, членом которых является пользователь, и для каждой группы найдите группы, в которые входит группа. Повторяйте до тех пор, пока не будет найдено больше участников.

...