C# 使用Active Directory和c的董事或以上级别的所有员工

C# 使用Active Directory和c的董事或以上级别的所有员工,c#,asp.net,active-directory,C#,Asp.net,Active Directory,我正在尝试创建一个级联下拉列表,其中第一个填充一个董事级员工列表董事有多个经理,经理有多个员工,然后通过ajax填充第二个下拉列表。我试图将给定一个displayname将获取所有直接下属和直接下属的直接下属的逻辑放在一起。按照我的逻辑,它会打印我要找的每个人,但只会将报告返回给原主管。我正在努力把所有的东西都整理好。代码一点也不漂亮,如果有更简单的方法,我愿意接受建议 我尝试使用三种方法在directReports方法中使用所有员工填充directReports列表 public List&l

我正在尝试创建一个级联下拉列表,其中第一个填充一个董事级员工列表董事有多个经理,经理有多个员工,然后通过ajax填充第二个下拉列表。我试图将给定一个displayname将获取所有直接下属和直接下属的直接下属的逻辑放在一起。按照我的逻辑,它会打印我要找的每个人,但只会将报告返回给原主管。我正在努力把所有的东西都整理好。代码一点也不漂亮,如果有更简单的方法,我愿意接受建议

我尝试使用三种方法在directReports方法中使用所有员工填充directReports列表

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;
        }