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