如何使用C#获取Active Directory中没有内存泄漏的用户列表

时间:2015-02-12 07:54:38

标签: c# memory-leaks active-directory

我在Active Directory中有超过8,00,000条记录。我必须从AD中获取所有用户。但我面临内存泄漏问题。

无论如何我跑进了服务器。它达到了大约10 GB的RAM大小,可以成功完成任务。

我不是一次获取所有8,00,000条记录,而是计划将这些记录分组。所有用户按部门分组。因此,我想使用此部门字段来明智地获取记录组。任何人都可以建议我如何在没有任何内存泄漏问题的情况下实现这一目标吗?

以下是我按部门提取所有用户的查询。但我无法找到从AD获取Unique部门的最佳方法。这将花费更少的时间来执行。

    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;
            }
        }

1 个答案:

答案 0 :(得分:0)

也许您可以尝试加载所需的属性:

dsearch.PropertiesToLoad.Add("displayname");