尝试使用不明确的名称解析来搜索 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" 搜索,但是在任何搜索的开头放置通配符确实会降低性能。它无法再使用任何索引来完成搜索,因此它被迫查看您域中的每个 用户帐户。