2011-06-01 32 views
30

¿Es posible crear una consulta LDAP que devolverá (o comprobará) usuarios en un grupo anidado? p.ej. UserA es miembro de GroupA y GroupA es miembro de GroupB. Quiero una consulta en GroupB para devolver que UserA es un miembro. Solo LDAP. El servidor es Active Directory.membresía de grupo anidado ldap

Respuesta

54

Sí, utilizando la regla de coincidencia LDAP_MATCHING_RULE_IN_CHAIN ​​(OID 1.2.840.113556.1.4.1941). Por ejemplo:

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

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

+0

Gracias; aunque es miembro de en este caso (el miembro me dirá los grupos de los que un usuario es miembro) – askvictor

+5

¿Puede explicar eso un poco para aquellos de nosotros que no somos muy buenos en LDAPese? –

+1

¿Es esta regla una extensión de Microsoft? –

2

debe utilizar el nombre completo de su grupo cuando se utiliza memberOf:1.2.840.113556.1.4.1941:= en mi caso CN=MyGroup,OU=User,OU=Groups,OU=Security,DC=domain,DC=com era todo el nombre distinguido

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

puede obtener el distinguido nombre de su grupo ejecutando el siguiente código y poniendo en este filtro (& (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 
0

Como su pregunta, la consulta debe ser

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

{0} es el grupo anidado, debe ser un nombre distinguido

{1} es el usuario sAMAccountName desea (puede usar cualquier otra propiedad de usuario que sAMAccountName dentro de (sAMAccountName={1}))

A continuación, obtendrá los detalles del usuario para la respuesta si el usuario es miembro del grupo anidado

Cuestiones relacionadas