Работа с объектами 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");
}
}