2

私が行っていることは、特定の AD グループに 1500 人を超えるユーザーがいて、それらをプルダウンすると、取得するユーザーが制限されます。MSDN (http://msdn.microsoft.com/en-us/library/ms180907%28v=vs.80%29.aspx) でこの記事を見ましたが、これを実行するFindOne()と、アプリをプルするのに 10 分以上かかります。ユーザーをダウンさせます。ResultsCollection30 秒でアプリを開くことができます 。

処理に入る時

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

エラーが返されます:

インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。\r\nパラメータ名: index"}

これには結果が見つからないという問題があると考えましたが、ResultsCollection1000 エントリすべてが含まれています。どんな助けでも大歓迎です。ありがとう!

注: これらのユーザーの姓は空ではありません。問題はresultCollection1 つのプロパティのみを返すことです。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);
4

2 に答える 2

3

PropertiesToLoad を 1 つ追加すると、他のプロパティは読み込まれなくなります。そのため、私の場合、ロードするすべてのプロパティを指定する必要があります。

dSeacher.PropertiesToLoad.Clear();
                dSeacher.PropertiesToLoad.Add(attributeWithRange);
                dSeacher.PropertiesToLoad.Add("givenname");
                dSeacher.PropertiesToLoad.Add("sn");
                dSeacher.PropertiesToLoad.Add("samAccountName");
                dSeacher.PropertiesToLoad.Add("mail");
于 2012-09-04T19:36:32.117 に答える
1

私はこの道を下るつもりはありません。このような大規模なサブツリー検索を行うよりも、グループに対するベース検索を介してメンバーシップを読み取る方が簡単です (そしてエラーが発生しにくくなります)。

ご覧のとおり、大規模なグループで member 属性を読み取ろうとすると、読み取りごとに 1500 の値しか取得できません。グループのメンバー全員を追い出す方法は、通常「遠隔回収」と呼ばれる機能を使用することです。これに関する情報へのリンクをここに提供しました: PowerShell を使用して常に配布リストの 1500 メンバーを取得する

于 2012-09-04T19:19:02.467 に答える