我正在为我的组织开发一个基于Web的员工电话簿,该目录使用C#/ AccountManagement查询Active Directory的数据。我正在尝试查询AD并根据返回的用户主体创建“员工”列表。我可以获取所有记录,但希望能够出于性能原因从服务器返回分页结果。我试图在我的FindAll()方法上使用LINQ(Take和Skip),但我遇到的问题是我进一步过滤我的结果以检查空的GivenName和Surname以摆脱测试帐户等。这最终返回例子16当我尝试时得到结果。采取(20)。这是我第一次尝试在应用程序中使用AD,并希望有人可以指出我正确的方向,会喜欢任何建议或批评。以下是数据访问方法:
public static List<Employee> GetAllEmployees()
{
List<Employee> employees = new List<Employee>();
try
{
PrincipalContext context = new PrincipalContext(ContextType.Domain, "My Domain");
GroupPrincipal gp = GroupPrincipal.FindByIdentity(context, "Domain Users");
UserPrincipal principal = new UserPrincipal(context);
principal.Enabled = true;
using (PrincipalSearcher searcher = new PrincipalSearcher(principal))
{
searcher.QueryFilter = principal;
var results = searcher.FindAll();
foreach (UserPrincipal p in results)
{
if (p.IsMemberOf(gp))
{
if (p.GivenName != null && p.Surname != null)
{
string division = string.Empty;
DirectoryEntry de = p.GetUnderlyingObject() as DirectoryEntry;
if (de.Properties.Contains("department"))
{
division = de.Properties["department"].Value.ToString();
}
var employee = new Employee(p.GivenName, p.Surname, p.DisplayName, p.EmailAddress, division);
employees.Add(employee);
};
}
}
}
}
catch (Exception)
{
throw;
}
return employees;
}
答案 0 :(得分:0)
事实证明,答案很简单,我忽略了。我将过滤移到了foreach循环之外。我摆脱了:
if (p.IsMemberOf(gp))
和
if (p.GivenName != null && p.Surname != null)
并替换为:
principal.GivenName = "*";
principal.IsMemberOf(gp);
在我的循环之前。我现在能够在.Take()
方法上执行searcher.Findall()
并获得我期待的快速结果。