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