目前,我正在尝试提出2 DropDownList
个,一个员工DropDownList
,另一个是经理DropDownList
。
首先,我不熟悉Active Directory的工作原理但是做了一些研究,我确实找到了类似下面的代码,据我所知,它代表了Manager的定义:
Dim deEmployee As New DirectoryEntry("LDAP://CN=John Employee,OU=Sales,DC=Corp,DC=com")
deEmployee.[Property]("manager") = "CN=Peter Manager,OU=Sales,DC=Corp,DC=com"
deEmployee.CommitChanges()
由于有多个管理员,我可以硬编码上面的名称= CN=Peter Manager
。
哪个组代表Active Directory中的管理员,而不是CN=Peter Manager
?
对我来说更大的问题是,如果我从第一个DropDownList
中选择员工,那么它如何与该员工的经理填充第二个DropDownList
?
从我的内容来看,部门是将员工与经理联系起来的属性,但我如何在代码中使用它?
在正常的级联下拉列表中,我可以在第一个下拉列表中选择员工并列出员工所属的部门,在第二个下拉列表中,我可以在第一个下拉列表中选择manager = theDepartmentListed中的manager。
那是在查询数据库,但就我而言,我们正在查询Active Directory。
有人可以根据部门说明如何链接第一个DropDownList
中的员工与第二个DropDownList
中的经理之间的关系吗?
答案 0 :(得分:1)
AD中没有管理员的内置组,只有您的组织添加了一个组,才能直接从组或OU中查询它们。
员工与经理之间没有自动链接,因此您必须查询部门并选择正确的用户作为经理。
您需要编写一个查询,以获取除所选用户之外的部门中的所有用户,这样的事情应该有效:
Imports System.DirectoryServices
...
Protected Sub EmployeeChanged(sender as object, e as EventArgs) Handles ddlEmployees.SelectedIndexChanged
Dim selectedUser as new DirectoryEntry(ddlEmployees.SelectedValue) 'assuming your Value on the empoyees dropdown is the LDAP object path
Dim domainRoot as new DirectoryEntry("LDAP://DC=corp,DC=com")
Dim searcher as new DirectorySearcher()
searcher.SearchRoot = domainRoot
searcher.Filter = "(&(objectClass=user)(department=" & selectedUser.Properties("department").Value & "))"
Dim results as SearchResultCollection = searcher.FindAll()
For Each result as SearchResult in results
Dim de as DirectoryEntry = result.GetDirectoryEntry()
If de IsNot Nothing Then
If Not de.Properties("samaccountname").Value.ToString().ToLower() = selectedUser.Properties("samaccountname").Value.ToString().ToLower() Then
ddlManagers.Items.Add(de.Properties("displayName").Value.ToString(), de.Properties("distinguishedName").Value.ToString())
End If
End If
Next
End Sub
有关编写LDAP查询的更多信息:http://technet.microsoft.com/en-us/library/aa996205(v=exchg.65).aspx