web-dev-qa-db-fra.com

Appartenance à un groupe imbriqué LDAP

Est-il possible de créer une requête LDAP qui retournera (ou vérifiera) les utilisateurs dans un groupe imbriqué? par exemple. UserA est membre de GroupA et GroupA est membre de GroupB. Je souhaite qu'une requête sur GroupB renvoie que UserA est membre. LDAP uniquement. Le serveur est Active Directory.

43
askvictor

Oui, en utilisant la règle de correspondance LDAP_MATCHING_RULE_IN_CHAIN ​​(OID 1.2.840.113556.1.4.1941). Par exemple:

(memberOf:1.2.840.113556.1.4.1941:=cn=group,cn=users,DC=x)

voir http://msdn.Microsoft.com/en-us/library/aa746475%28VS.85%29.aspx

71
Andrew Strong

Vous devez utiliser le nom unique complet de votre groupe lorsque vous utilisez memberOf:1.2.840.113556.1.4.1941:= dans mon cas CN=MyGroup,OU=User,OU=Groups,OU=Security,DC=domain,DC=com était le nom distinctif entier

(&(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=MyGroup,OU=User,OU=Groups,OU=Security,DC=domain,DC=com))

vous pouvez obtenir le nom unique de votre groupe en exécutant le code suivant et en mettant ce filtre (& (objectClass = group) (name = MyGroup))

Imports System.DirectoryServices

Module Module1

Sub Main()
    Dim run As Boolean = True
    Dim Filter As String
    While run
        Console.WriteLine("Enter Filter:")
        Filter = Console.ReadLine()
        If Filter = "exit" Then
            run = False
        Else
            checkFilter(Filter)
        End If
    End While
End Sub

Function checkFilter(Filter As String) As Boolean
    Dim search As New DirectorySearcher("LDAP://dc=Domain,dc=com")
    Try
        search.Filter = Filter
        search.PropertiesToLoad.Add("name")
        search.PropertiesToLoad.Add("distinguishedName")
        search.SearchScope = SearchScope.Subtree
        Dim results As SearchResultCollection = search.FindAll()
        If results Is Nothing Then
            Console.WriteLine("Nothing")
            Return False
        Else
            If results.Count() = 0 Then
                Console.WriteLine("non found")
            End If
            Dim result As SearchResult
            For Each result In results
                Console.WriteLine(result.Properties("name")(0).ToString())
                Console.WriteLine(result.Properties("distinguishedName")(0).ToString())
                'For Each prop In result.Properties("members")
                '    Console.WriteLine(prop.ToString())
                'Next
            Next
            Console.WriteLine(String.Format("{0} Users Found", results.Count()))
        End If
    Catch ex As Exception
        Console.WriteLine(ex.Message)
    End Try
    Return True
End Function

End Module
7
Mothware

Comme votre question, la requête doit être

(&(memberOf:1.2.840.113556.1.4.1941:={0})(objectCategory=person)(objectClass=user)(sAMAccountName={1}))

{0} est le groupe imbriqué, il doit s'agir d'un nom unique

{1} est l'utilisateur sAMAccountName que vous voulez (vous pouvez utiliser une autre propriété utilisateur que sAMAccountName dans (sAMAccountName={1}))

Ensuite, vous obtiendrez les détails de l'utilisateur pour la réponse si l'utilisateur est le membre du groupe imbriqué

1
John_J