2015-02-12 1 views
0

У меня есть более 8 000 000 записей в Active Directory. Я должен забрать всех пользователей из AD. Но я столкнулся с проблемой утечки памяти.Как получить список пользователей в Active Directory без утечки памяти с помощью C#

Как бы то ни было, я побежал на сервере. Он достиг около 10 ГБ оперативной памяти, чтобы успешно выполнить задачу.

Вместо того, чтобы собирать все 8 000 000 записей за раз, я планирую получать записи в группах. Все пользователи сгруппированы по департаменту. Следовательно, я хочу использовать это поле отдела для извлечения группы записей. Может ли кто-нибудь предложить мне, как это может быть достигнуто без какой-либо проблемы с утечкой памяти?

Вот мой запрос, чтобы получить всех пользователей по мудрым отделам. Но я не мог найти лучший способ получить уникальный отдел из AD. для чего потребуется меньше времени для выполнения.

public void GetUserFromGroup(String Department) 
    { 
     try 
     { 
      DirectoryEntry entry = new DirectoryEntry("LDAP://" + domainName, userName, passwd, AuthenticationTypes.Secure); 
      DirectorySearcher dSearch = new DirectorySearcher(entry); 
      dSearch.PageSize = 1000; 
      dSearch.Filter = "(&(objectClass=*)(displayname=*)(Department=" + Department + "))"; 
      dSearch.SearchScope = SearchScope.Subtree; 
      SearchResultCollection src = dSearch.FindAll(); 

      DataTable dt = new DataTable(); 
      dt.Columns.Add("displayname"); 

      foreach (SearchResult sResultSet in src) 
      { 
       DataRow dr = dt.NewRow(); 

       if (GetProperty(sResultSet, "displayname") != "") 
       { 
        dr["displayname"] = GetProperty(sResultSet, "displayname").ToString(); 
       } 
       else 
       { 
        dr["displayname"] = null; 
       } 

       dt.Rows.Add(dr); 
      } 
      src.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

     public static string GetProperty(SearchResult searchResult, string PropertyName) 
     { 
      try 
      { 
       if (searchResult.Properties.Contains(PropertyName)) 
       { 
         return searchResult.Properties[PropertyName][0].ToString(); 
       } 
       else 
       { 
         return string.Empty; 
       } 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 
+0

Это займет время войти, чтобы сделать эту задачу .... вместо того, чтобы PLS проверить, если есть текстовый файл с именем, как «Associate.txt», где доступны все активные пользователи каталогов. если да, тогда создайте хранимую процедуру для извлечения данных из этого текстового файла и храните их в таблице. Затем из ваших ур-приложений вы можете подключиться к вновь созданной таблице. –

+0

Спасибо за ваши комментарии. Но где я могу найти файл «Associate.txt»? –

+0

проконсультируйтесь с руководителем/менеджером вашей команды. для всех компаний, где они обращаются к активному каталогу, используемому для его хранения. –

ответ

0

Может быть, вы могли бы попытаться просто загрузить необходимые свойства:

dsearch.PropertiesToLoad.Add("displayname"); 
Смежные вопросы