我正在寻找最快,最简单的方法来检索所有 Active Directory帐户的第一个&姓氏。目的是拥有一个字符串列表,其中包含Active Directory中的所有名称,以便在用于解锁帐户的小型Visual Basic应用程序的文本框中自动完成。
在表单加载时,应用程序会从AD生成名称列表。由于AD上有4,500个账户,我预计这需要大约10-15秒。每个名称都添加到字符串列表中,以便与自动完成一起使用。
用户将姓名Garry键入textbox1
,自动完成通过使用字符串列表显示AD中的所有Garry。我知道如何轻松地做到这一点,我只是不知道如何有效地使用用户的名字填充列表。
在访问AD时有很多样本,但没有一个展示如何循环它。我认为这里的问题会对我自己和其他类似用例的用户有所帮助。
我到目前为止访问单个帐户的代码如下所示,但是我需要遍历所有 AD帐户并检索他们的First&姓氏。
'Domain is declared with the LDAP path
'UserName is declared with textbox1.text value
Dim ADEntry As New DirectoryServices.DirectoryEntry("LDAP://" & Domain)
Dim ADSearch As New System.DirectoryServices.DirectorySearcher(ADEntry)
ADSearch.Filter = ("(samAccountName=" & UserName & ")")
ADSearch.SearchScope = System.DirectoryServices.SearchScope.Subtree
Dim UserFound As System.DirectoryServices.SearchResult = ADSearch.FindOne()
If Not IsNothing(UserFound) Then
Log.AppendLine("Account found, loading checks...")
Dim Attrib As String = "msDS-User-Account-Control-Computed"
Dim User As System.DirectoryServices.DirectoryEntry
User = UserFound.GetDirectoryEntry()
User.RefreshCache(New String() {Attrib})
'Display user account details
txtLogin.Text = User.Properties("userPrincipalName").ToString
txtName.Text = User.Properties("givenName").ToString & " " & User.Properties("sn").ToString
else
'User not found
end if
即使在C#中,也会非常感谢任何帮助。
答案 0 :(得分:2)
您可以使用与上面相同的ADEntry变量并执行类似的操作。如果用户同时拥有名字和姓氏,则只会将用户添加到列表中。
Dim listNames As New AutoCompleteStringCollection
Using ADSearch As New DirectoryServices.DirectorySearcher(ADEntry, "(&(objectCategory=person)(objectClass=user))", {"givenName", "sn"}, DirectoryServices.SearchScope.Subtree)
For Each user As DirectoryServices.SearchResult In ADSearch.FindAll
Try
listNames.Add(user.GetDirectoryEntry.Properties("givenName").Value.ToString + " " + user.GetDirectoryEntry.Properties("sn").Value.ToString)
Catch ex As Exception
End Try
Next
End Using
With TextBox1
.AutoCompleteCustomSource = listNames
.AutoCompleteMode = AutoCompleteMode.SuggestAppend
.AutoCompleteSource = AutoCompleteSource.CustomSource
End With