Попытка поиска в Active Directory с использованием неоднозначного разрешения имен, но она ничего не возвращает - PullRequest
1 голос
/ 23 октября 2019

Невозможно заставить его вернуть какие-либо результаты. Компилируется нормально и не выдает ошибки при запуске, но результаты всегда пусты.

Я получаю эту работу, если я ограничиваю ее чем-то вроде DisplayName или данным именем. Но хотелось бы, чтобы это работало независимо от того, будет ли пользователь первым вводить имя или фамилию и чтобы пользователь не ограничивался соблюдением формата 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 для извлечения деталей. Но я получаю только пустой объект

1 Ответ

0 голосов
/ 23 октября 2019

Я думаю, что это ваша проблема:

user.Anr = String.Format("*{0}*", searchterm)

В частности, вы ставите звездочки вокруг вашего поискового запроса. Согласно документации , поисковый запрос будет выглядеть как (anr=Smith) примерно так:

(|(displayName=smith*)(givenName=smith*)(legacyExchangeDN=smith)(physicalDeliveryOfficeName=smith*)(proxyAddresses=smith*)(Name=smith*)(sAMAccountName=smith*)(sn=smith*))

Обратите внимание, что он уже выполняет поиск типа «начинается с». Помещение ваших собственных символов подстановки приводит их в замешательство.

Точнее, это звездочка в начале. Я проверил это в нашей собственной среде AD. Если я ищу (anr=*Gabriel*) или (anr=*Gabriel), я не получаю результатов. Если я ищу (anr=Gabriel*), я получаю результаты, но это действительно не влияет на результаты (результаты такие же, как если бы я искал (anr=Gabriel)).

Решение состоит в том, чтобы изменить эту строкуна это:

user.Anr = searchterm

Это не совсем эквивалентно поиску «содержит», который, как вам кажется, нужен, но в любом случае размещение подстановочного знака в начале любого поиска действительно снижает производительность. Он больше не может использовать индексы для завершения поиска, поэтому вынужден просматривать каждую учетную запись пользователя в вашем домене.

...