ВСЕ сотрудники под руководством или выше, используя Active Directory и c # - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь создать каскадный выпадающий список, в котором первый заполняет список сотрудников уровня директора (директора имеют несколько менеджеров, а менеджеры имеют несколько сотрудников), который затем заполняет второй выпадающий список через ajax. Я пытаюсь собрать воедино логику, согласно которой отображаемое имя будет захватывать все прямые отчеты и прямые отчеты прямых отчетов. С логикой, которую я собрал, он напечатает всех, кого ищет, но вернет отчеты только оригинальному директору. Я изо всех сил пытаюсь собрать все воедино. Код совсем не симпатичен, и если есть более простой способ сделать это, я открыт для предложений.

Существует три метода, в которых я пытаюсь заполнить список 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;
        }

        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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...