C# 使用Active Directory和c的董事或以上级别的所有员工
我正在尝试创建一个级联下拉列表,其中第一个填充一个董事级员工列表董事有多个经理,经理有多个员工,然后通过ajax填充第二个下拉列表。我试图将给定一个displayname将获取所有直接下属和直接下属的直接下属的逻辑放在一起。按照我的逻辑,它会打印我要找的每个人,但只会将报告返回给原主管。我正在努力把所有的东西都整理好。代码一点也不漂亮,如果有更简单的方法,我愿意接受建议 我尝试使用三种方法在directReports方法中使用所有员工填充directReports列表C# 使用Active Directory和c的董事或以上级别的所有员工,c#,asp.net,active-directory,C#,Asp.net,Active Directory,我正在尝试创建一个级联下拉列表,其中第一个填充一个董事级员工列表董事有多个经理,经理有多个员工,然后通过ajax填充第二个下拉列表。我试图将给定一个displayname将获取所有直接下属和直接下属的直接下属的逻辑放在一起。按照我的逻辑,它会打印我要找的每个人,但只会将报告返回给原主管。我正在努力把所有的东西都整理好。代码一点也不漂亮,如果有更简单的方法,我愿意接受建议 我尝试使用三种方法在directReports方法中使用所有员工填充directReports列表 public List&l
public List<string> DirectReports(string name)
{
List<string> directReports = new List<string>();
var domain = new PrincipalContext(ContextType.Domain, "somedomain");
UserPrincipal user = new UserPrincipal(domain);
user.DisplayName = name;
PrincipalSearcher ps = new PrincipalSearcher();
ps.QueryFilter = user;
DirectorySearcher ds = ps.GetUnderlyingSearcher() as DirectorySearcher;
ds.SearchScope = SearchScope.Subtree;
ds.Filter = "(&(objectClass=user)(objectCategory=person)(displayName=" + name + "))";
ds.PropertiesToLoad.Add("DirectReports");
SearchResultCollection results = ds.FindAll();
foreach(SearchResult result in results)
{
if (hasDirectReports(result))
{
//directReports.AddRange(GetReportsFinal(GetDirectReportsList(result)));
directReports.AddRange(GetDirectReportsList(result));
directReports.Add(result.Properties["displayname"][0].ToString() + " (" + result.Properties["samaccountname"][0].ToString()+")");
}
else
{
directReports.Add(result.Properties["displayname"][0].ToString() + " (" + result.Properties["samaccountname"][0].ToString() + ")");
}
}
foreach(var item in directReports)
{
Debug.WriteLine(item);
}
return directReports;
}
对不起,我不明白是什么问题。此代码工作正常吗?不,如果调用directreports方法并将director的Displayname传递给它,它将只返回directors直接报告,而不是他/她的报告和他/她的经理的报告。我认为当我递归调用directreports方法时,它会创建一个新列表,最终清除第一个列表,我不知道如何在每次迭代时保留这些值,所以为什么不为每个需要的人调用directreports一次呢?或者你想一次获得整个层次结构吗?我不是在跟踪你,我的想法是提供一个姓名,并以列表形式返回该人员下的所有员工(如果有)。然后该列表将用于填充选择列表。我也不是在跟踪你。你的第一条评论意味着你需要整个公司员工树,从董事开始,然后是他/她的报告,然后是他们的报告,等等,直到你找到那些没有人向他们报告的人。但你的第二个评论听起来像是你想说出一个名字,然后只得到他们的直接下属,就是这样。
public bool hasDirectReports(SearchResult result)
{
if(result.Properties["directreports"].Count >= 1)
{
return true;
}
else
{
return false;
}
}
public List<string> GetDirectReportsList(SearchResult result)
{
List<string> formattedDirectReportsList = new List<string>();
foreach (var thing in result.Properties["directreports"])
{
string employeeString = thing.ToString();
//employeeString = employeeString.Split(setp, StringSplitOptions.None)[0];
employeeString = employeeString.Replace("CN=", "");
employeeString = employeeString.TrimEnd(',');
employeeString = employeeString.Replace("\\, ", ", ");
//Debug.WriteLine(employeeString);
if (employeeString.Split(',')[2] == "OU=Users")
{
string fn = employeeString.Split(',')[1];
string ln = employeeString.Split(',')[0];
var domain = new PrincipalContext(ContextType.Domain, "somedomain");
UserPrincipal directreportname = new UserPrincipal(domain);
directreportname.Name = ln + "," + fn;
PrincipalSearcher prinsearcher = new PrincipalSearcher();
prinsearcher.QueryFilter = directreportname;
DirectorySearcher dirsearcher = prinsearcher.GetUnderlyingSearcher() as DirectorySearcher;
Principal reportResults = prinsearcher.FindOne();
formattedDirectReportsList.Add(reportResults.DisplayName + " (" + reportResults.SamAccountName + ")");
DirectReports(reportResults.DisplayName);
}
}
return formattedDirectReportsList;
}