.Net DirectorySearcher не получает все значения в пользовательском объекте

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

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

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

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

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

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

1 ответ

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

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 ошибка.

Другие вопросы по тегам