C# Создание именованного объекта для каждого объекта в LDAP DirectorySearch для вставки в базу данных SQL

Я создал поисковик каталогов, чтобы получить несколько свойств от каждого пользователя.

objSearchADAM = new DirectorySearcher(objADAM);
objSearchADAM.PropertiesToLoad.Add("givenname");
objSearchADAM.PropertiesToLoad.Add("lastlogontimestamp");
ect...
objSearchResults = objSearchADAM.FindAll();

Затем я перечисляю их, преобразую временную метку interger8 в стандартную дату / время и сохраняю в файл csv с

 List<string> timeProps = new List<string>() { "lastlogontimestamp", "accountexpires", "pwdlastset", "lastlogoff", "lockouttime", "maxstorage", "usnchanged", "usncreated", "usndsalastobjremoved", "usnlastobjrem", "usnsource" };

            foreach (SearchResult objResult in objSearchResults)
            {
                objEntry = objResult.GetDirectoryEntry();


                ResultPropertyCollection myResultProp = objResult.Properties;
                foreach (string myKey in myResultProp.PropertyNames)
                {


                    foreach (Object myCollection in myResultProp[myKey])
                    {

                        Object sample = myCollection;


                        if (timeProps.Contains(myKey))
                        {
                            String times = sample.ToString();
                            long ft = Int64.Parse(times);
                            DateTime date;
                            try
                            {

                                date = DateTime.FromFileTime(ft);
                            }
                            catch (ArgumentOutOfRangeException ex)
                            {
                                date = DateTime.MinValue;
                                Console.WriteLine("Out of range: " + ft);
                                Console.WriteLine(ex.ToString());
                            }
                            sample = date;
                            Console.WriteLine("{0}{1}", myKey.PadRight(25), sample);
                            objWriter.WriteLine("{0}{1}", myKey.PadRight(25), sample);
                        }
                        else
                        {
                            Console.WriteLine("{0}{1}", myKey.PadRight(25), sample);
                            objWriter.WriteLine("{0}{1}", myKey.PadRight(25), sample);
                        }
                    }

Теперь мне нужно создать объект для каждого пользователя со строками из каждого результата, которые я могу поместить в команду SQL, которую я только что построил. где запрос LDAP к SQL будет иметь имя = FirstName и lastlogontimestamp = LastLogon и так далее.

StringBuilder sb = new StringBuilder();
sb.Append("INSERT INTO activedirectory.dimUserST (FirstName, LastName) VALUES (@FirstName, @LastName)");
loadStagingCommand.Parameters.AddWithValue("@FirstName", FirstName).DbType =    DbType.AnsiString;
ect...
loadStagingCommand.CommandText = sb.ToString();
loadStagingCommand.ExecuteNonQuery();

я попытался использовать IDictionary в своем первом foreach (аналогично коду, найденному здесь http://ideone.com/vChWD), но не смог заставить его работать. Я читал о IList и рефлексии, но я не уверен, как я мог бы включить их.

ОБНОВЛЕНИЕ Я исследовал и нашел ExpandoObjects и попытался написать в коде, основанном на том, что я видел здесь. Создание динамических объектов, однако я запускаю этот новый код, я возвращаю "employeeenumber System.Collections.Generic.List`1[System.Dynamic.ExpandoObject]"

if(employeeNumber.Contains(myKey))
                        {


                        string[] columnNames = { "EmployeeNumber" };
                        List<string[]> listOfUsers = new List<string[]>();
                        for (int i = 0; i < 10; i++)
                        {
                            listOfUsers.Add(new[] { myKey});
                        }

                        var testData = new List<ExpandoObject>();

                        foreach (string[] columnValue in listOfUsers)
                        {
                            dynamic data = new ExpandoObject();
                            for (int j = 0; j < columnNames.Count(); j++)
                            {
                                ((IDictionary<String, Object>)data).Add(columnNames[j], listOfUsers[j]);
                            }
                            testData.Add(data);
                          Console.WriteLine("{0}{1}", myKey.PadRight(25), testData);
                        objWriter.WriteLine("{0}{1}", myKey.PadRight(25), testData);
                        }

                        }

Я явно что-то здесь упускаю и, похоже, не могу понять, в чем проблема. Я мог бы даже пойти по этому поводу неправильно. В основном все, что мне нужно сделать, это вытащить пользователей и их свойства из Active Directory и поместить их в таблицы базы данных SQL. И я разработал, как сделать оба по отдельности, но я не могу понять, как все это собрать вместе.

1 ответ

Решение

Если CSV просто используется для кэширования результатов, вы можете использовать словарь для хранения содержимого результатов поиска. Разделение вашего кода на функции может быть полезным:

private static object GetFirstValue(ResultPropertyCollection properties, 
                                       string propertyName)
{
    var propertyValues = properties[propertyName];
    var result = propertyValues.Count == 0 ? null : propertyValues[0];
    return result;
}

Затем вы можете использовать словарь для хранения значений свойств или создать тип:

var results = new List<Dictionary<string, object>>();

foreach(SearchResult objResult in objSearchResults)
{
    var properties = objResult.Properties;

    var propertyDictionary = new Dictionary<string, object> { 
       {"FirstName", GetFirstValue(properties, "givenname")},
       {"LastName", GetFirstValue(properties, "sn")},
       {"UserName", GetFirstValue(properties, "samaccountname")},
    };

    results.Add(propertyDictionary);
}

Теперь у вас есть список имущественных сумок.

Это также может быть простой оператор LINQ:

var results = objSearchResults.OfType<SearchResult>()
    .Select(s => s.Properties)
    .Select(p => new {
       FirstName = (string)GetFirstValue(properties, "givenname"),
       LastName = (string)GetFirstValue(properties, "sn"),
       UserName = (string)GetValue(properties, "samaccountname"),
       AccountExpires = GetDateTimeValue(properties, "accountexpires")
    });

Используйте словари, как это:

foreach(var item in results)
{
    var command = new SqlCommand();
    ...
    command.Parameters.AddWithValue("firstName", item["FirstName"]);
    ...
}
Другие вопросы по тегам