0

私はメンバーとしてstackoverflowを初めて使用しますが、これをよくフォローしています:) Active Directoryに接続して機能グループのメンバーを取得するコードでは、実際にリストにある1680個の奇数メンバーのうち1490個の奇数メンバーしか得られません。Stackoverflowとインターネットで多くのことを検索しましたが、コードが不完全なリストになる理由に対する答えが見つかりませんでした。できますか、誰かが私にこれに関するポインタを教えてください。ありがとう :)

データを取得するためにActiveDirectoryに接続するコードは次のとおりです。

    public static DataTable GetAdUsers(string configSection)
    {

        DataRow dr; 
        Hashtable ADGroups = (Hashtable)ConfigurationManager.GetSection(configSection);
        string adGroup;
        string adGroupDesc;
        string sApplication;
        string sLast_Login;
        string sAccount_owner;
        string sPath;

        DataTable dt = new DataTable();

        sApplication = "Application";
        dt.Columns.Add(sApplication);

        dt.Columns.Add("Profile", Type.GetType("System.String"));
        dt.Columns.Add("Account Name", Type.GetType("System.String"));

        sLast_Login = "Last Login";
        dt.Columns.Add(sLast_Login);

        sAccount_owner = "Account Owner";
        dt.Columns.Add(sAccount_owner);

        sPath = "Path";
        dt.Columns.Add(sPath);

        string domainName = "myDomain";

        PrincipalContext pcRoot = new PrincipalContext(ContextType.Domain, domainName);
        IDictionaryEnumerator adGroupEnumerator = ADGroups.GetEnumerator();

        while (adGroupEnumerator.MoveNext())
        {
            adGroup = adGroupEnumerator.Key.ToString();
            adGroupDesc = adGroupEnumerator.Value.ToString();

            GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcRoot, IdentityType.SamAccountName, adGroup); 
            System.DirectoryServices.DirectoryEntry de = (System.DirectoryServices.DirectoryEntry)grp.GetUnderlyingObject();
            foreach (string sDN in de.Properties["member"])
            {
                System.DirectoryServices.DirectoryEntry deMember = new System.DirectoryServices.DirectoryEntry("LDAP://" + sDN.ToString());
                try
                {
                    dr = dt.NewRow();

                    string output1;
                    string subStringE1 = "DC=";
                    int length1 = de.Path.ToString().Length;
                    int length0 = de.Path.ToString().IndexOf(subStringE1);
                    string str1 = de.Path.ToString().Substring(length0, length1 - length0);
                    string subStringE2 = ",DC";
                    int length2 = str1.ToString().IndexOf(subStringE2);
                    output1 = str1.ToString().Substring(3, length2 - 3);

                    dr["Application"] = "Application";
                    dr["Profile"] = adGroupDesc;

                    string AccountName = deMember.Properties["samAccountName"].Value.ToString();

                    dr["Account Name"] = deMember.Properties["samAccountName"].Value.ToString();
                    dr["Last Login"] = "";
                    dr["Account Owner"] = deMember.Properties["givenName"].Value.ToString() + @"-" + deMember.Properties["sn"].Value.ToString();

                    string Path = output1 + @"\" + adGroup + @"\" + deMember.Properties["samAccountName"].Value.ToString();

                    Console.WriteLine(Path);
                    dr["Path"] = output1 + @"\" + adGroup + @"\" + deMember.Properties["samAccountName"].Value.ToString();

                    dt.Rows.Add(dr);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error occured for user name" + sDN + "\n" + ex.Message);
                }
            }
        }
        return dt;
    }
}
4

3 に答える 3

0

調べて運を試して答えを見つけました。ディレクトリエントリの使用が問題であり、同じことを試しましたが、ページ検索を使用する必要はありませんでした。

動作するコードは次のとおりです。

GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcRoot, adGroup); //fglbcmdolpctx
                if (grp != null)
                {
                    foreach (Principal p in grp.GetMembers(true))
                    {
                        try
                        {
                            dr = dt.NewRow();
                            dr["Application"] = "Commodities OpenLink";
                            dr["Profile"] = adGroupDesc;
                            string AccountName = p.SamAccountName.ToString().ToLower();
                            dr["Account Name"] = AccountName;
                            dr["Last Login"] = "";
                            string sLastName, sFirstName;
                            int iLastNameIndex0, iLastNameIndex1, iFirstNameIndex0, iFirstNameIndex1;
                            int lengthofString = p.Name.ToString().Length;
                            iLastNameIndex1 = p.Name.ToString().IndexOf(",");


                            if (iLastNameIndex1 == -1)
                            {
                                sLastName = "";
                            }
                            else
                            {
                                sLastName = p.Name.ToString().Substring(0, iLastNameIndex1);
                            }

                            iFirstNameIndex0 = p.Name.ToString().IndexOf(",");
                            iFirstNameIndex1 = p.Name.ToString().IndexOf(":");
                            if (iFirstNameIndex0 == -1 || iFirstNameIndex1 == -1)
                            {
                                sFirstName = p.Name.ToString();
                                sLastName = "";
                            }
                            else
                            {
                                sFirstName = p.Name.ToString().Substring(iFirstNameIndex0 + 1, iFirstNameIndex1 - iFirstNameIndex0 - 1);
                            }

                            sAccount_owner = sLastName + @"-" + sFirstName;
                            dr["Account Owner"] = sAccount_owner;

                            string sPath_Domain_Part;
                            string sFirstIndexofExtraction = "DC=";
                            int ilength_String = p.DistinguishedName.ToString().Length;
                            int iLenght_ExtractionPoint1 = p.DistinguishedName.ToString().IndexOf(sFirstIndexofExtraction);
                            string str1 = p.DistinguishedName.ToString().Substring(iLenght_ExtractionPoint1, ilength_String - iLenght_ExtractionPoint1);

                            string subStringE2 = ",DC";
                            int iLenght_ExtractionPoint2 = str1.IndexOf(subStringE2);
                            sPath_Domain_Part = str1.Substring(3, iLenght_ExtractionPoint2 - 3);
                            string sPath1 = sPath_Domain_Part + @"\" + adGroup + @"\" + p.SamAccountName.ToString();
                            dr["Path"] = sPath_Domain_Part + @"\" + adGroup + @"\" + p.SamAccountName.ToString();
                            dt.Rows.Add(dr);
                        }

                        catch (Exception ex)
                        {
                            Global.logfile.WriteLine("Error occured for user name" + adGroup + p.SamAccountName + "\n" + ex.Message);
                        }
                    }
                }
于 2012-08-23T10:00:51.587 に答える
0

SizeLimit の既定の制限により、おそらく 1,490 個程度のオブジェクトしか取得できません。これを修正するには、結果を「ページング」する必要があります。

Enumrating members in a Large Group で参照されているコードを使用してください。

于 2012-06-17T08:00:35.863 に答える
0

返される結果セットに 1000 を超えるアイテムが含まれる可能性がある場合は、ページ検索を使用する必要があります。ページングなしで実行される Active Directory の検索は、最初の 1000 レコードの最大値を返すことに制限されています。ページ検索では、結果セットは個々のページとして表示され、各ページには所定の数の結果エントリが含まれます。このタイプの検索では、結果セットの最後に到達するまで、結果エントリの新しいページが返されます。

デフォルトでは、クエリ要求に応答するサーバーは、データを返す前に結果セットを完全に計算します。大きな結果セットでは、結果セットを取得するときにサーバー メモリが必要になり、大きな結果が返されるときにネットワーク帯域幅が必要になります。ページ サイズを設定すると、サーバーはページの作成中にデータをページ単位で送信できます。次に、クライアントはこのデータをキャッシュし、カーソルをアプリケーション レベルのコードに提供します。

ページングは​​、データがネットワーク経由でクライアントに返される前にサーバーが計算する行数を定義することによって設定されます。

于 2012-06-17T08:02:01.200 に答える