membres des groupes imbriqués du 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 du groupe B. Je veux une requête sur GroupB pour retourner que UserA est un membre. LDAP seulement. Le serveur est Active Directory.
3 réponses
Yes, using the LDAP_MATCHING_RULE_IN_CHAIN matching rule (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
vous devez utiliser le nom distinctif 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
a l'ensemble de la distinguished name
(&(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 distingué de votre groupe en exécutant le code suivant et en mettant dans ce filtre (&(objectClass=group)(nom=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
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 devrait être un nom distinctif
{1}
est l'utilisateur sAMAccountName vous voulez (vous pouvez utiliser n'importe quel autre utilisateur de la propriété que sAMAccountName dans les (sAMAccountName={1})
)
Ensuite, vous aurez l'utilisateur de détail pour la réponse si l'utilisateur est membre du groupe imbriqué