Запрос AD и возврат результатов в DataTable с последующей передачей данных в dataGridView for Display - PullRequest
0 голосов
/ 03 октября 2018

Я использую Windows Forms.Я пытаюсь отобразить результаты запроса Active Directory для OU.Все пользователи и выбор набора свойств.Я просто использую свойство email в этом примере.В моей проблеме 3 части.Первая часть, на которую я действительно хотел бы ответить.

  1. Кажется, что моя DataTable загружается неправильно.Я пробежал через отладчик, и в цикле загрузки таблицы есть элемент.Это основной вопрос вопроса
  2. dataGridView ничего не отображает.Счет правильный.Я считаю, что реализация dataGridView верна.
  3. Когда я запускаю запрос, даже эквивалентный PowerShell, выполнение все равно занимает около 10 минут.Это большое OU-множество объектов.

Мой код ниже:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices;
using AD_WinForm.hrlper;
using System.Data.Common;

namespace AD_WinForm
{
 public partial class frmMain : Form
 {

    public frmMain()
    {   
        InitializeComponent();
    }


    private void btnGet_Click(object sender, EventArgs e)
    {
        try {
            string ou = THe distinguished name of OU;
            using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, 
                     Environment.UserDomainName, ou))
            {
                UserPrincipal user = new UserPrincipal(ctx);
                using (PrincipalSearcher ps = new PrincipalSearcher(user))
                {
                    //new code
                    DataTable results = new DataTable();
                    results.Columns.Add("mail");
                    // end new code
                    int count = 0;
                    foreach (Principal p in ps.FindAll())
                    {

                        UserPrincipal u = p as UserPrincipal;
                        if (u != null)
                        {

                            DirectoryEntry entry = 
                                 (DirectoryEntry)p.GetUnderlyingObject();
                            DirectorySearcher search = new DirectorySearcher(entry);
            //UAC -  (no disabled accounts or password never expires) and has a Email 
                       //Account
                            string query = "(&(objectCategory=person)(objectClass=user)(! 
                           (userAccountControl:1.2.840.113556.1.4.803:=2))(&(mail=*)))";


                            search.Filter = query;
                            search.PropertiesToLoad.Add("mail");

                            SearchResultCollection mySearchResultColl = search.FindAll();
                            //old code
                            //DataTable results = new DataTable();
                            //results.Columns.Add("mail");
                            //end old code

                            foreach (SearchResult sr in mySearchResultColl)
                            {
                                DataRow dr = results.NewRow();
                                DirectoryEntry de = sr.GetDirectoryEntry();
                                dr["mail"] = de.Properties["mail"].Value.ToString();
                                //dr["guid"] = de.Properties["guid"].Value;
                                results.Rows.Add(dr);
                                results.AcceptChanges();
                                count++;

                            }                             
                            DataView DV = new DataView(results);
                            dgvActiveDirectory.DataSource = DV;                                
                        }
                    }
                    lblCount.Text = count.ToString();
                }

            }
        }
        catch (NullReferenceException ex) {
            MessageBox.Show(ex.ToString());
        }
    }

  }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...