C#中使用SearchResultCollection枚举大群AD用户 [英] C# Using SearchResultCollection to enumerate large group of AD users

查看:1003
本文介绍了C#中使用SearchResultCollection枚举大群AD用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,我刚才怎么回事是我有超过1500个用户在一个特定的AD组,而当我拉下来,我只能按我是谁得到的。我看到这篇文章的MSDN(http://msdn.microsoft.com/en-us/library/ms180907%28v=vs.80%29.aspx)。但是它执行 FindOne(),这样做需要的应用程序超过10分钟,拉下用户。随着 ResultsCollection 我能够在30秒内打开的应用程序。

当它去处理。

 字符串姓氏= userResults.Properties [SN] [0]的ToString();
 

它回来与错误:

  

索引超出范围。必须是非负并小于大小   收集\ r \ n参数名:索引}

我想这有没有找到结果但是, ResultsCollection 包含了所有1000个条目的问题。任何帮助是AP preciated。谢谢!

作为一个说明:姓氏不为空为这些用户,这个问题是 resultCollection 仅返回一间酒店,这就是 adpath

 的DirectoryEntry dEntryhighlevel =新的DirectoryEntry(LDAP:// OU =客户,OU = X,DC = H,DC = NT);

DirectorySearcher从dSeacher =新DirectorySearcher从(dEntryhighlevel);
dSeacher.Filter =(及(对象类=用户)(的memberOf = CN =用户​​,, OU =客户,OU = X,DC = H,DC = NT));

UINT rangeStep = 1000;
UINT rangeLow = 1;
UINT rangeHigh = rangeLow +(rangeStep -1);
布尔lastQuery = FALSE;
布尔quitLoop = FALSE;

做
{
    串attributeWithRange;

    如果(!lastQuery)
    {
        attributeWithRange =的String.Format(成员;范围= {0}  -  {1},rangeLow,rangeHigh);
    }
    其他
    {
        attributeWithRange =的String.Format(成员;范围= {0}  -  *,rangeLow);
    }

    dSeacher.PropertiesToLoad.C​​lear();
    dSeacher.PropertiesToLoad.Add(attributeWithRange);

    SearchResultCollection resultCollection = dSeacher.FindAll();

    的foreach(在resultCollection信息搜索结果userResults)
    {
        字符串姓氏= userResults.Properties [SN] [0]的ToString();
        将First_Name串= userResults.Properties [给定名称] [0]的ToString();
        字符串username = userResults.Properties [的samAccountName] [0]的ToString();
        字符串EMAIL_ADDRESS = userResults.Properties [电子邮件] [0]的ToString();
        OriginalList.Add(姓氏+|将First_Name + +|+的userName +|+ EMAIL_ADDRESS);

        如果(userResults.Properties.Contains(attributeWithRange))
        {
            的foreach(在userResults.Properties obj对象[attributeWithRange])
            {
                Console.WriteLine(obj.GetType());

                如果(obj.GetType()。等于(typeof运算(System.String)))
                {
                }
                否则,如果(obj.GetType()。等于(typeof运算(System.Int32的)))
                {
                }

                Console.WriteLine(obj.ToString());
            }

            如果(lastQuery)
            {
                quitLoop = TRUE;
            }
        }
        其他
        {
           lastQuery = TRUE;
        }

        如果(!lastQuery)
        {
            rangeLow = rangeHigh + 1;
            rangeHigh = rangeLow +(rangeStep  -  1);
        }
   }
}
而(quitLoop!);
 

解决方案

看来,如果你添加一个PropertiesToLoad,它将不再加载任何其他属性。因此,你必须指定要加载的所有属性,在我的情况。

  dSeacher.PropertiesToLoad.C​​lear();
                dSeacher.PropertiesToLoad.Add(attributeWithRange);
                dSeacher.PropertiesToLoad.Add(给定名称);
                dSeacher.PropertiesToLoad.Add(SN);
                dSeacher.PropertiesToLoad.Add(的samAccountName);
                dSeacher.PropertiesToLoad.Add(邮件);
 

So what I have going on is I have over 1500 users in a specific AD group, and when I pull them down I'm limited to as who I get. I saw this article on MSDN (http://msdn.microsoft.com/en-us/library/ms180907%28v=vs.80%29.aspx) however it performs a FindOne(), doing this takes the app over 10 minutes to pull down the users. With ResultsCollection I'm able to open the app in 30 seconds.

When it goes to process

string Last_Name = userResults.Properties["sn"][0].ToString();

it comes back with the error:

Index was out of range. Must be non-negative and less than the size of the collection.\r\nParameter name: index"}

I figured this had the problem of not finding the results however, the ResultsCollection contains all 1000 entries. Any help is appreciated. Thanks!

As a note: The surname is not empty for these users, the issue is resultCollection is only returning 1 property and that's adpath

DirectoryEntry dEntryhighlevel = new DirectoryEntry("LDAP://OU=Clients,OU=x,DC=h,DC=nt");

DirectorySearcher dSeacher = new DirectorySearcher(dEntryhighlevel);
dSeacher.Filter = "(&(objectClass=user)(memberof=CN=Users,,OU=Clients,OU=x,DC=h,DC=nt))";

uint rangeStep = 1000;
uint rangeLow = 1;
uint rangeHigh = rangeLow + (rangeStep -1);
bool lastQuery = false;
bool quitLoop = false;

do
{
    string attributeWithRange;

    if (!lastQuery)
    {
        attributeWithRange = String.Format("member;range={0}-{1}", rangeLow, rangeHigh);
    }
    else
    {
        attributeWithRange = String.Format("member;range={0}-*", rangeLow);
    }

    dSeacher.PropertiesToLoad.Clear();
    dSeacher.PropertiesToLoad.Add(attributeWithRange);

    SearchResultCollection resultCollection = dSeacher.FindAll();

    foreach (SearchResult userResults in resultCollection)
    {
        string Last_Name = userResults.Properties["sn"][0].ToString();
        string First_Name = userResults.Properties["givenname"][0].ToString();
        string userName = userResults.Properties["samAccountName"][0].ToString();
        string Email_Address = userResults.Properties["mail"][0].ToString();
        OriginalList.Add(Last_Name + "|" + First_Name + "|" + userName + "|" + Email_Address);

        if (userResults.Properties.Contains(attributeWithRange))
        {
            foreach (object obj in userResults.Properties[attributeWithRange])
            {
                Console.WriteLine(obj.GetType());

                if (obj.GetType().Equals(typeof(System.String)))
                {
                }
                else if (obj.GetType().Equals(typeof(System.Int32)))
                {
                }

                Console.WriteLine(obj.ToString());
            }

            if (lastQuery)
            {
                quitLoop = true;
            }
        }
        else
        {
           lastQuery = true;
        }

        if (!lastQuery)
        {
            rangeLow = rangeHigh + 1;
            rangeHigh = rangeLow + (rangeStep - 1);
        }
   }
}
while (!quitLoop);

解决方案

It appears that if you add one PropertiesToLoad that it will no longer load any other properties. As such you have to specify all properties you want to load, in my case.

dSeacher.PropertiesToLoad.Clear();
                dSeacher.PropertiesToLoad.Add(attributeWithRange);
                dSeacher.PropertiesToLoad.Add("givenname");
                dSeacher.PropertiesToLoad.Add("sn");
                dSeacher.PropertiesToLoad.Add("samAccountName");
                dSeacher.PropertiesToLoad.Add("mail");

这篇关于C#中使用SearchResultCollection枚举大群AD用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆