尝试使用不明确的名称解析来搜索 Active Directory,但它从来没有 returns 任何东西
Trying to search Active Directory using Ambiguous Name Resolution but it never returns anything
无法得到 return 任何结果。编译正常,当它是 运行 时不会出错,但结果总是空的。
如果我将其限制为 DisplayName 或给定名称之类的内容,我就可以正常工作。但无论用户是先输入名字还是姓氏,并且用户不限于遵守 "Surname, Forename"
的 DisplayName 格式,都希望它能正常工作
Dim searchterm As String = RouteData.Values("Search")
Dim domain As New PrincipalContext(ContextType.Domain, "Domain")
Dim user As New CustomUserPrincipal(domain)
Dim search As New PrincipalSearcher()
Dim results As PrincipalSearchResult(Of Principal)
jss.MaxJsonLength = Integer.MaxValue
user.Anr = String.Format("*{0}*", searchterm)
search.QueryFilter = user
CType(search.GetUnderlyingSearcher, DirectoryServices.DirectorySearcher).SizeLimit = 25
results = search.FindAll()
<DirectoryObjectClass("user")>
<DirectoryRdnPrefix("CN")>
Public Class CustomUserPrincipal
Inherits UserPrincipal
Public Sub New(context As PrincipalContext)
MyBase.New(context)
End Sub
<DirectoryProperty("anr")>
Public Property Anr As String
Get
Return CStr(ExtensionGet("anr")(0))
End Get
Set(value As String)
ExtensionSet("anr", value)
End Set
End Property
End Class
我期待一个对象,我可以通过它来枚举并提取单个 UserPrincipals 以提取详细信息。但是我只得到一个空对象
我认为这是你的问题:
user.Anr = String.Format("*{0}*", searchterm)
具体来说,您要在搜索字词周围加上星号。根据 documentation,它将像 (anr=Smith)
这样的搜索词扩展为这样的内容:
(|(displayName=smith*)(givenName=smith*)(legacyExchangeDN=smith)(physicalDeliveryOfficeName=smith*)(proxyAddresses=smith*)(Name=smith*)(sAMAccountName=smith*)(sn=smith*))
请注意,它已经进行了 "starts with" 类型的搜索。把你自己的通配符放在那里搞砸了。
更具体地说,它是开头的星号。我在我们自己的 AD 环境中对此进行了测试。如果我搜索 (anr=*Gabriel*)
或 (anr=*Gabriel)
,我不会得到任何结果。如果我搜索 (anr=Gabriel*)
我会得到结果,但它实际上对结果没有影响(结果与我搜索 (anr=Gabriel)
时的结果相同)。
解决方案是将该行更改为:
user.Anr = searchterm
它并不完全等同于您似乎想要的 "contains" 搜索,但是在任何搜索的开头放置通配符确实会降低性能。它无法再使用任何索引来完成搜索,因此它被迫查看您域中的每个 用户帐户。
无法得到 return 任何结果。编译正常,当它是 运行 时不会出错,但结果总是空的。
如果我将其限制为 DisplayName 或给定名称之类的内容,我就可以正常工作。但无论用户是先输入名字还是姓氏,并且用户不限于遵守 "Surname, Forename"
的 DisplayName 格式,都希望它能正常工作Dim searchterm As String = RouteData.Values("Search")
Dim domain As New PrincipalContext(ContextType.Domain, "Domain")
Dim user As New CustomUserPrincipal(domain)
Dim search As New PrincipalSearcher()
Dim results As PrincipalSearchResult(Of Principal)
jss.MaxJsonLength = Integer.MaxValue
user.Anr = String.Format("*{0}*", searchterm)
search.QueryFilter = user
CType(search.GetUnderlyingSearcher, DirectoryServices.DirectorySearcher).SizeLimit = 25
results = search.FindAll()
<DirectoryObjectClass("user")>
<DirectoryRdnPrefix("CN")>
Public Class CustomUserPrincipal
Inherits UserPrincipal
Public Sub New(context As PrincipalContext)
MyBase.New(context)
End Sub
<DirectoryProperty("anr")>
Public Property Anr As String
Get
Return CStr(ExtensionGet("anr")(0))
End Get
Set(value As String)
ExtensionSet("anr", value)
End Set
End Property
End Class
我期待一个对象,我可以通过它来枚举并提取单个 UserPrincipals 以提取详细信息。但是我只得到一个空对象
我认为这是你的问题:
user.Anr = String.Format("*{0}*", searchterm)
具体来说,您要在搜索字词周围加上星号。根据 documentation,它将像 (anr=Smith)
这样的搜索词扩展为这样的内容:
(|(displayName=smith*)(givenName=smith*)(legacyExchangeDN=smith)(physicalDeliveryOfficeName=smith*)(proxyAddresses=smith*)(Name=smith*)(sAMAccountName=smith*)(sn=smith*))
请注意,它已经进行了 "starts with" 类型的搜索。把你自己的通配符放在那里搞砸了。
更具体地说,它是开头的星号。我在我们自己的 AD 环境中对此进行了测试。如果我搜索 (anr=*Gabriel*)
或 (anr=*Gabriel)
,我不会得到任何结果。如果我搜索 (anr=Gabriel*)
我会得到结果,但它实际上对结果没有影响(结果与我搜索 (anr=Gabriel)
时的结果相同)。
解决方案是将该行更改为:
user.Anr = searchterm
它并不完全等同于您似乎想要的 "contains" 搜索,但是在任何搜索的开头放置通配符确实会降低性能。它无法再使用任何索引来完成搜索,因此它被迫查看您域中的每个 用户帐户。