0

作为成员,我是 stackoverflow 的新手,尽管我经常遵循这一点:) 我的代码连接到活动目录以获取功能组的成员,实际上在列表中的 1680 个奇数成员中只给了我 1490 个奇数成员。我在 Stackoverflow 和 Internet 上进行了很多搜索,但我没有找到为什么代码会导致列表不完整的答案。可以,任何人请给我任何指示。谢谢 :)

这是连接到 Active Directory 以检索数据的代码:

    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

由于 SizeLimit 的默认限制,您可能只能获得大约 1,490 个对象左右。要解决这个问题,您需要“翻页”结果。

只需使用Enumating Members in a Large Group 中引用的代码即可。

于 2012-06-17T08:00:35.863 回答
0

当返回的结果集可能包含超过 1000 个项目时,您必须使用分页搜索。在不分页的情况下执行的 Active Directory 搜索仅限于返回最多前 1000 条记录。对于分页搜索,结果集以单独的页面呈现,每个页面包含预定数量的结果条目。使用这种类型的搜索,将返回结果条目的新页面,直到到达结果集的末尾。

默认情况下,响应查询请求的服务器在返回数据之前会完整计算一个结果集。在大型结果集中,这需要在获取结果集时使用服务器内存,并在返回大型结果时需要网络带宽。设置页面大小允许服务器在构建页面时以页面的形式发送数据。然后客户端缓存这些数据并向应用程序级代码提供一个游标。

分页是通过定义在数据通过网络返回到客户端之前服务器计算的行数来设置的。

于 2012-06-17T08:02:01.200 回答
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 回答