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.
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
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
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é