Возможно ли создать запрос LDAP, который будет возвращать (или проверять) пользователей во вложенной группе? например UserA является членом GroupA, а GroupA является членом GroupB. Я хочу, чтобы запрос GroupB возвращал член UserA. Только LDAP. Сервер - это Active Directory.
Вложенное членство в группе ldap
Ответ 1
Да, используя правило сопоставления LDAP_MATCHING_RULE_IN_CHAIN (OID 1.2.840.113556.1.4.1941). Например:
(memberOf:1.2.840.113556.1.4.1941:=cn=group,cn=users,DC=x)
см. http://msdn.microsoft.com/en-us/library/aa746475%28VS.85%29.aspx
Ответ 2
Вы должны использовать полное различающееся имя вашей группы при использовании memberOf:1.2.840.113556.1.4.1941:=
в моем случае CN=MyGroup,OU=User,OU=Groups,OU=Security,DC=domain,DC=com
было все выделенное имя
(&(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=MyGroup,OU=User,OU=Groups,OU=Security,DC=domain,DC=com))
вы можете получить различающееся имя вашей группы, выполнив следующий код и вставив этот фильтр (& (объектный = группа) (название = 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
Ответ 3
Как ваш вопрос, запрос должен быть
(&(memberOf:1.2.840.113556.1.4.1941:={0})(objectCategory=person)(objectClass=user)(sAMAccountName={1}))
{0}
- это вложенная группа, она должна быть Различающееся имя
{1}
- это пользовательское sAMAccountName (вы можете использовать любое другое пользовательское свойство, чем sAMAccountName внутри (sAMAccountName={1})
)
Затем вы получите информацию о пользователе для ответа, если пользователь является членом вложенной группы