Найдите LDAP и создайте файл CSV - PullRequest
0 голосов
/ 04 октября 2011

Я написал следующую программу, которая подключается к двум хранилищам LDAP, сравнивает атрибуты и, основываясь на результатах, создает новый CSV-файл.Я столкнулся с проблемой, хотя.

Вот код:

        //Define LDAP Connection
        string username = "****";
        string password = "*****";
        string domain = "LDAP://****";

        //Define LDAP Connection 
        string ABSAusername = "****";
        string ABSApassword = "****";
        string ABSAdomain = "LDAP://****";

        //Create Directory Searcher
        DirectoryEntry ldapConnection = new DirectoryEntry(domain,username,password);
        ldapConnection.AuthenticationType = AuthenticationTypes.Anonymous;
        DirectorySearcher ds = new DirectorySearcher(ldapConnection);
        ds.Filter = "((EmploymentStatus=0))";
        ds.SearchScope = System.DirectoryServices.SearchScope.Subtree;

        //Create Directory Searcher
        DirectoryEntry ABSAldapConnection = new DirectoryEntry(ABSAdomain, ABSAusername, ABSApassword);
        ABSAldapConnection.AuthenticationType = AuthenticationTypes.Anonymous;
        DirectorySearcher ABSAds = new DirectorySearcher(ABSAldapConnection);
        ABSAds.Filter = "((&(EmploymentStatus=3)(EmploymentStatusDescription=Active))";
        ABSAds.SearchScope = System.DirectoryServices.SearchScope.Subtree;

        ds.PropertiesToLoad.Add("cn");
        ds.PropertiesToLoad.Add ("uid");
        ds.PropertiesToLoad.Add("sn");
        ds.PropertiesToLoad.Add("PersonnelAreaDesc");
        ds.PropertiesToLoad.Add("JobcodeID");
        ds.PropertiesToLoad.Add("CostCentreID");
        ds.PropertiesToLoad.Add("CostCentreDescription");
        ds.PropertiesToLoad.Add ("givenName");
        ds.PropertiesToLoad.Add ("EmploymentStatus");
        ds.PropertiesToLoad.Add("EmploymentStatusDescription");

        ABSAds.PropertiesToLoad.Add("uid");
        ABSAds.PropertiesToLoad.Add("EmploymentStatus");

        ABSAds.Sort = new SortOption("uid", SortDirection.Ascending);
        ds.Sort = new SortOption("cn", SortDirection.Ascending);

        SearchResultCollection absaUsers = ds.FindAll();
        SearchResultCollection srcUsers = ds.FindAll();

        sw.WriteLine("Action" + "," + "uid" + "," + "Business Area" + "," + "employeeNumber" + "," + "First Name" + "," + "Last Name" + "," + "JobCodeID" + "," + "costCentreID" + "," + "costCentreDescription" + "," + "FullName" + "," + "EmploymentStatus" + "," + "EmploymentStatusDescription" );
        sw.WriteLine("");

        foreach (SearchResult users in srcUsers)
        {


            string cn = users.Properties["cn"][0].ToString();
            string sn = users.Properties["sn"][0].ToString();
            string userID = users.Properties["uid"][0].ToString();
            string description = users.Properties["PersonnelAreaDesc"][0].ToString();
            // string jobCodeID = users.Properties["JobcodeID"][1].ToString();
            string CostCentreID = users.Properties["costCentreID"][0].ToString();
            string CostCentreDescription = users.Properties["CostCentreDescription"][0].ToString();
            string givenName = users.Properties["givenName"][0].ToString();
            string employmentStatus = users.Properties["EmploymentStatus"][0].ToString();
            string EmploymentStatusDescription = users.Properties["EmploymentStatusDescription"][0].ToString();

            foreach (SearchResult absaUser in absaUsers)
            {
                string absaUID = absaUser.Properties["uid"][0].ToString();
                string absaEmploymentStatus = absaUser.Properties["EmploymentStatus"][0].ToString();

                if (cn == absaUID)
                {
                    if (absaEmploymentStatus == "3")
                    {

                        sw.WriteLine(cn);
                    }
                }
            }
        }


        sw.Flush();
        sw.Close();
        sw.Dispose();
    }
}

Я создал два цикла foreach, в первом цикле я назначил переменные для строк, а во втором цикле foreach я сравниваю оператор IF,Я хочу сделать следующее: если uid в одном LDAP равен uid в другом ldap, и если статус пользователя в первом ldap = 0, но статус пользователя во втором ldap = 3: тогдаЯ хочу распечатать пользователей, которые соответствуют этим критериям из 1-го ldap.

Если вы посмотрите мой код, я что-то не так делаю?Выходные данные программы в настоящее время составляют около 10 пользователей, которые дублируются не менее 100 раз каждый.

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 04 октября 2011

Есть несколько вещей, которые явно не так с этим кодом ....

1) Прежде всего, вы создаете один и тот же результат поиска дважды:

   SearchResultCollection absaUsers = ds.FindAll();
   SearchResultCollection srcUsers = ds.FindAll();

Так что, если этот поисковик найдет 10 пользователей, у вас есть две коллекции из тех же 10 пользователей.

2) Затем вы использовали вложенные циклы foreach, так что вы в основном просматриваете все результаты из первой коллекции, одну за другой, и для каждой из этих записей вы перечисляете всю вторую коллекцию - в основном делая декартово произведение между двумя коллекции. Вот почему в итоге вы получите 10 х 10 = 100 пользователей .....

3) вы, кажется, упускаете какое-то ограничение / условие для выбора только тех элементов из вашего второго / внутреннего набора результатов, которые каким-либо образом соответствуют внешнему / первому набору результатов. Пока у вас нет такого условия, вы всегда будете получать все результаты из второго набора результатов для каждого элемента первого набора результатов = классического декартового произведения. Каким-то образом вы хотите выбрать только определенные элементы из второго набора, основываясь на чем-то из первого набора результатов ......

2 голосов
/ 04 октября 2011

Вы пропустили перерыв в следующем месте:

if (cn == absaUID && absaEmploymentStatus == "3")
{
    sw.WriteLine(cn);
    break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...