我使用以下代码从特定部门获取有关员工的大量信息,并从AD返回列表...
虽然它有效但看起来很慢,是否有更有效的方式从AD获取各种用户详细信息?
public static List<Employee> GetEmployeeListForDepartment(string departpment)
{
using (HostingEnvironment.Impersonate())
{
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain);
GroupPrincipal gp = GroupPrincipal.FindByIdentity(ctx, departpment);
PrincipalSearchResult<Principal> members = gp.GetMembers();
List<Employee> employees = new List<Employee>();
foreach (var member in members)
{
var emp = CreateEmployee(member);
employees.Add(emp);
}
return employees.OrderBy(x => x.FirstName).ToList();
}
}
private static Employee CreateEmployee(Principal member)
{
if (member != null)
{
DirectoryEntry de = (member.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
string mobile = de.Properties.Contains("mobile") ? de.Properties["mobile"][0].ToString() : "";
string title = de.Properties.Contains("description") ? de.Properties["description"][0].ToString() : "";
//ETC ETC...
return new Employee { etc.. };
}
}
return new Employee();
}
答案 0 :(得分:10)
你的问题是你正在使用System.DirectoryServices.AccountManagement ......虽然我不喜欢说它,但遗憾的是真相。 AccountManagement的工作方式是它运行单独的LDAP查询以单独检索每个项目。因此,当您遍历成员时,它会通过LDAP为每个成员单独回调。您要做的是使用System.DirectoryServices.DirectorySearcher运行LDAP查询。
我的假设是部门是一个团队,基于你如何使用它。我就是这样做的。 (我的代码在VB.Net ...对不起)。确保为您的组获取完全限定的DN,或提前查找并将其插入查询。
Dim results = LDAPQuery("(memberOf=CN=Fully,OU=Qualified,DC=Group,DC=Distinguished,DC=Name)", New String() {"mobile", "description"})
Dim emps = (from c as System.DirectoryServices.SearchResult in results _
Select New Employee() {.Name = c.Properties("description"), .Mobile = c.Properties("mobile")}).ToList()
Public Function LDAPQuery(ByVal query As String, ByVal attributes As String()) As SearchResultCollection
'create directory searcher from CurrentADContext (no special security available)
Dim ds As New DirectorySearcher(System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain().GetDirectoryEntry())
ds.PageSize = 1000
'set filter string
ds.Filter = query
'specify properties to retrieve
ds.PropertiesToLoad.AddRange(attributes)
'get results
Dim results As SearchResultCollection = ds.FindAll()
Return results
End Function
答案 1 :(得分:0)
您应该可以直接使用Active Directory API。
大部分内容都在'System.DirectoryServices'
下提供我没有任何代码可以完全按照您的需要进行操作,但是大约一年前我的博客上有一篇文章,其中显示了如何在AD中创建本地用户帐户,所有这些都使用了获取用户信息所需的相同程序集。
http://shawtyds.wordpress.com/2010/12/08/a-little-bit-of-ldap-here-there/
注意:然而AD的性质很慢,所以如果你有一个大目录,你很可能无法获得更快的速度。