Работа с объектами Active Directory - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, товарищи! Есть программа, выгружающая список пользователей из домена в виде txt-фала вида

Артёмов Артём Артёмович<табуляция>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();
        }        
    }
}
Проблема: В строке String.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName=*)(memberof=CN={0},OU=Domain Groups,DC=msk,DC=aeroflot,DC=ru))", ADGroupp) явно указан Organisation Unit, в котором должна находиться группа. Если группа находится во вложенном OU или в другом, то фильтр возвращается пустой. Есть варианты, как это исправить?

Решение задачи: «Работа с объектами 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");
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5
Похожие ответы