.Net DirectorySearcher не получает все значения в пользовательском объекте - PullRequest
0 голосов
/ 21 января 2019

Как часть программы, которую я пишу, мне нужно извлечь все пользовательские данные из объекта AD текущего пользователя.

Вот код, который я использую ...

Try
    Dim RootEntry As New DirectoryEntry("LDAP://**USER OU**")
    RootEntry.AuthenticationType = AuthenticationTypes.Secure

    Dim ds As New DirectorySearcher(RootEntry)

    ds.SizeLimit = System.Int32.MaxValue
    ds.PageSize = System.Int32.MaxValue

    ds.PropertiesToLoad.Add("cn") ' Common Name

    ' Personal
    ds.PropertiesToLoad.Add("givenName") ' Given Name
    ds.PropertiesToLoad.Add("sn") ' Surname
    ds.PropertiesToLoad.Add("fullname") ' Full Name (GN + SN)

    ' Comms
    ds.PropertiesToLoad.Add("telephoneNumber") ' Tel # (from general)
    ds.PropertiesToLoad.Add("mail") ' Email (from general)
    ds.PropertiesToLoad.Add("mobile") ' Mobile Phone (from Telephone)

    ' Job Role
    ds.PropertiesToLoad.Add("title") ' Job Title (Organisation)
    ds.PropertiesToLoad.Add("company") ' Company (Organisation)
    ds.PropertiesToLoad.Add("department") ' Department (Organisation)

    ' Address
    ds.PropertiesToLoad.Add("streetAddress")
    ds.PropertiesToLoad.Add("l") ' City
    ds.PropertiesToLoad.Add("st") ' State
    ds.PropertiesToLoad.Add("postalCode") ' Post Code
    ds.PropertiesToLoad.Add("co") ' Country

    ds.ServerTimeLimit = New TimeSpan(0, 0, 60)
    ds.SearchScope = SearchScope.Subtree

    ds.Filter = "(&(anr=" & username(1) & ")(objectCategory=person))"

    Dim searchresults As SearchResultCollection
    searchresults = ds.FindAll()

    Debug.Print("Search Results - " & searchresults.Count())

    For Each result In searchresults
        If Not result.Properties("givenName")(0) Is Nothing Then
            strForename = result.Properties("givenName")(0)
                Label1.Text = "Hello " & strForename & "!"
        End If
        If Not result.Properties("sn")(0) Is Nothing Then
                strSurname = result.Properties("sn")(0)
        End If
        If Not strSurname Is Nothing And Not strForename Is Nothing Then
                strName = result.Properties("givenName")(0) & " " & result.Properties("sn")(0)
        End If
        If Not result.Properties("title")(0) Is Nothing Then
                strTitle = result.Properties("title")(0)
        End If
        If Not result.Properties("company")(0) Is Nothing Then
                strCompany = result.Properties("company")(0)
        End If
        If Not result.Properties("department")(0) Is Nothing Then
                strDepartment = result.Properties("department")(0)
        End If

        If Not result.Properties("telephoneNumber")(0) Is Nothing Then
                strPhone = result.Properties("telephoneNumber")(0)
        End If
        If Not result.Properties("mobile")(0) Is Nothing Then
                strMobile = result.Properties("mobile")(0)
        End If
        If Not result.Properties("mail")(0) Is Nothing Then
                strEmail = result.Properties("mail")(0)
        End If

        If Not result.Properties("streetAddress")(0) Is Nothing Then
                strStreet = result.Properties("streetAddress")(0)
        End If
        If Not result.Properties("l")(0) Is Nothing Then
                strLocation = result.Properties("l")(0)
        End If
        If Not result.Properties("st")(0) Is Nothing Then
                strCounty = result.Properties("st")(0)
        End If
        If Not result.Properties("postalCode")(0) Is Nothing Then
                strPostCode = result.Properties("postalCode")(0)
        End If
        If Not result.Properties("co")(0) Is Nothing Then
                strCountry = result.Properties("co")(0)
        End If
        strAddress = strStreet
    Next

Catch ex As System.Exception
    Debug.Print(ex.Message)
End Try

Если я запускаю программу, система возвращает все мои настройки AD, заполняя каждый в поле.

Program imports my AD detailsADUC Address entry.

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

Other User AD details missingOther user ADUC, showing Address

Поисковый сервер возвращает только 1 запись на пользователя (если он отправляет SAMAccountName), но я установил значения PageSize и SizeLimit, чтобы избежать проблемы с 1000 элементов.

Я также попробовал более простой фильтр samaccountname= & username(1), но безрезультатно.

Я столкнулся с какой-то недокументированной / незарегистрированной проблемой безопасности AD?Раньше моя учетная запись была администратором домена, но больше не следит за проверкой безопасности.

Проблема не связана с компьютерами, потому что, если я запускаю программу через олицетворение на его компьютере, мои данные возвращаютсяв полном объеме и наоборот (его нет).

1 Ответ

0 голосов
/ 22 января 2019

Хорошо, я проследил проблему до следующего ...

If Not result.Properties("mobile")(0) Is Nothing Then
    strMobile = result.Properties("mobile")(0)
    Inc_Mob.Checked = True
    Mob_TB.Text = strMobile
End If

У многих пользователей нет номеров мобильных телефонов, и DirectorySearcher не будет создавать нулевое значение, если попытается получить пустое значение, просто не сможет его создать.

Я не обрабатывал это должным образом в коде, и цикл Try явно не указывал, в чем проблема, в сообщении об ошибке, а просто возвращал ошибку ArgumentOutOfRangeException.

...