Работа с объектами Active Directory - C#
Формулировка задачи:
Доброго времени суток, товарищи!
Есть программа, выгружающая список пользователей из домена в виде txt-фала вида
Проблема:
В строке
String.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName=*)(memberof=CN={0},OU=Domain Groups,DC=msk,DC=aeroflot,DC=ru))", ADGroupp)
явно указан Organisation Unit, в котором должна находиться группа. Если группа находится во вложенном OU или в другом, то фильтр возвращается пустой.
Есть варианты, как это исправить?
Артёмов Артём Артёмович<табуляция>artem.artemov Балашов Балаш Балашевич<табуляция>balash.balashev Вегитов Вегит Вегитович<табуляция>vegit.vegitov ...
Если же указана группа, то выгружаются пользователи конкретно из неё. Собственно, к теме приложен архив с проектом, но для желающих:using System.DirectoryServices; using System.IO; namespace _05_UsersAD_PsilonVersion { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Берем системное время string time1 = System.DateTimeOffset.Now.DateTime.ToString(); // Объявляем переменную, хранящую путь к файлу string file = "C:\\FIO-login.txt"; // Считываем имя группы в Active Directory string ADGroupp = !string.IsNullOrWhiteSpace(textBox2.Text) ? textBox2.Text : "*"; if (!string.IsNullOrWhiteSpace(textBox2.Text)) { ADGroupp = textBox2.Text; // Проверяем, существует ли группа if (!ADGrouppCheck(ADGroupp)) { MessageBox.Show("Такой группы не существует!\nБудет выгружен весь домен", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); ADGroupp = "*"; } else { MessageBox.Show(string.Format("Будут выгружены только члены группы\n\"{0}\"", ADGroupp), "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } else { MessageBox.Show("Имя группы не введено!\nБудет выгружен весь домен", "Info", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); ADGroupp = "*"; } // Считываем начальное имя папки и путь к ней string path1 = textBox1.Text; // Задаем переменную с информацией о папке DirectoryInfo DirTarget = new DirectoryInfo(path1); // Записываем путь try { // Если папка существует if (DirTarget.Exists) { file = "FIO-login.txt"; // Имя файла - по умолчанию file = String.Format("{0}\\{1}", path1, file); // Склеиваем путь с именем файла // Выводим информацию о том, куда будет записан файл // MessageBox.Show(string.Format("Путь: {0}\nИмя группы: {1}", file, ADGroupp), "Файл", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } else { // Сообщение о том, что папка не существует MessageBox.Show("Такой папки не существует", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception exc) { MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } // Вызываем функцию для выгрузки данных в файл ADInfo(file, ADGroupp); // Берем системное время второй раз string time2 = System.DateTimeOffset.Now.DateTime.ToString(); // Выводим инфу labelProgress.Text = String.Format("Готово! \nНачало: {0}\nКонец: {1}", time1, time2); } // Описываем функцию проверки существования группы private bool ADGrouppCheck(string ADGroupp) { bool CheckResult = false; // Изначально считаем, что группа не существует string deConnectionString = "LDAP://DC=msk,DC=aeroflot,DC=ru"; try { using (var entry = new DirectoryEntry(deConnectionString)) using (var search = new DirectorySearcher(entry)) { string query = string.Format("(&(Name={0})(objectClass=group))", ADGroupp); // Описываем фильтр search.Filter = query; search.PropertiesToLoad.Add("Name"); // Только имена групп // Ищем все группы с именем из переменной ADGroupp using (var mySearchResultColl = search.FindAll()) { search.SizeLimit = mySearchResultColl.Count; if (mySearchResultColl.Count > 0) // Если находим хотя бы одну CheckResult = true; } } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error"); } return CheckResult; } private void ADInfo(string file, string ADGroupp) { StringBuilder sb = new StringBuilder(); string deConnectionString = "LDAP://DC=msk,DC=aeroflot,DC=ru"; try { using (var entry = new DirectoryEntry(deConnectionString)) using (var search = new DirectorySearcher(entry)) { progressBar1.Value = 0; string query = String.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName=*)(memberof=CN={0},OU=Domain Groups,DC=msk,DC=aeroflot,DC=ru))", ADGroupp); search.Filter = query; search.PageSize = 1000; search.PropertiesToLoad.Add("displayName"); search.PropertiesToLoad.Add("sAMAccountName"); using (var mySearchResultColl = search.FindAll()) { search.SizeLimit = mySearchResultColl.Count; progressBar1.Maximum = mySearchResultColl.Count; foreach (SearchResult result in mySearchResultColl) { progressBar1.Value++; string displayName = result.Properties["displayName"].Count > 0 ? result.Properties["displayName"][0].ToString() : string.Empty; string sAMAccountName = result.Properties["sAMAccountName"].Count > 0 ? result.Properties["sAMAccountName"][0].ToString() : string.Empty; if (!string.IsNullOrWhiteSpace(displayName)) // Пустые имена не нужны sb.AppendFormat("{0}\t{1}", displayName, sAMAccountName).AppendLine(); } // Записываем StringBuilder в файл File.WriteAllText(file, sb.ToString()); sb.Clear(); // Очищаем } } } catch (Exception ex) { MessageBox.Show(ex.Message,"Error"); } } private void buttonFB_Click(object sender, EventArgs e) { // Открываем диалог выбора папки FBDialog1.ShowDialog(); // Записываем текстовое значение выбранного пути в окошко textBox1.Text = FBDialog1.SelectedPath.ToString(); } } }
Решение задачи: «Работа с объектами Active Directory»
textual
Листинг программы
// Выгрузка пользователей по списку групп private void ADInfo(string file, List<string> ADGroupp) { StringBuilder sb = new StringBuilder(); string deConnectionString = "LDAP://DC=msk,DC=aeroflot,DC=ru"; try { File.WriteAllText(file, "ФИО\tлогин\r\n"); // Готовим файл for (int i = 0; i < ADGroupp.Count; i++) { using (var entry = new DirectoryEntry(deConnectionString)) using (var search = new DirectorySearcher(entry)) { // File.AppendAllText(file, ADGroupp[i] + "\r\n"); // Дописываем имя группы в файл progressBar1.Value = 0; string query = String.Format("(&(objectClass=user){0})", ADGroupp[i]); search.Filter = query; search.PageSize = 1000; search.PropertiesToLoad.Add("displayName"); search.PropertiesToLoad.Add("sAMAccountName"); using (var mySearchResultColl = search.FindAll()) { search.SizeLimit = mySearchResultColl.Count; progressBar1.Maximum = mySearchResultColl.Count + 1; progressBar1.Value++; foreach (SearchResult result in mySearchResultColl) { progressBar1.Value++; string displayName = result.Properties["displayName"].Count > 0 ? result.Properties["displayName"][0].ToString() : string.Empty; string sAMAccountName = result.Properties["sAMAccountName"].Count > 0 ? result.Properties["sAMAccountName"][0].ToString() : string.Empty; if (!string.IsNullOrWhiteSpace(displayName)) // Пустые имена не нужны sb.AppendFormat("{0}\t{1}", displayName, sAMAccountName).AppendLine(); } // Записываем StringBuilder в файл File.AppendAllText(file, sb.ToString()); // Дописываем данные в файл } } } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error"); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д