1

我正在尝试重新编写从 System.DirectoryServices 到 System.DirectoryServices.Protocol 的搜索

在 S.DS 中,我得到了所有请求的属性,但在 S.DS.P 中,我没有得到 GUID 或 HomePhone ......

它的其余部分适用于一个用户。

有任何想法吗?

public static List<AllAdStudentsCV> GetUsersDistinguishedName( string domain, string distinguishedName )
        {
            try
            {

                NetworkCredential credentials               = new NetworkCredential( ConfigurationManager.AppSettings[ "AD_User" ], ConfigurationManager.AppSettings[ "AD_Pass" ] ); 
                LdapDirectoryIdentifier directoryIdentifier = new LdapDirectoryIdentifier( domain+":389" ); 

                using ( LdapConnection connection           = new LdapConnection( directoryIdentifier, credentials ) )
                {

                    SearchRequest searchRequest = new SearchRequest( );
                    searchRequest.DistinguishedName = distinguishedName;
                    searchRequest.Filter = "(&(objectCategory=person)(objectClass=user)(sn=Afcan))";//"(&(objectClass=user))";
                    searchRequest.Scope = SearchScope.Subtree;
                    searchRequest.Attributes.Add("name");
                    searchRequest.Attributes.Add("sAMAccountName");
                    searchRequest.Attributes.Add("uid");
                    searchRequest.Attributes.Add("telexNumber"); // studId
                    searchRequest.Attributes.Add("HomePhone"); //ctrId
                    searchRequest.SizeLimit = Int32.MaxValue;
                    searchRequest.TimeLimit = new TimeSpan(0, 0, 45, 0);// 45 min - EWB

                    SearchResponse searchResponse = connection.SendRequest(searchRequest) as SearchResponse;

                    if (searchResponse == null) return null;

                    List<AllAdStudentsCV> users = new List<AllAdStudentsCV>();

                    foreach (SearchResultEntry entry in searchResponse.Entries)
                    {
                        AllAdStudentsCV user = new AllAdStudentsCV();

                        user.Active = "Y";
                        user.CenterName = "";
                        user.StudId = GetstringAttributeValue(entry.Attributes, "telexNumber");
                        user.CtrId = GetstringAttributeValue(entry.Attributes, "HomePhone");
                        user.Guid = GetstringAttributeValue(entry.Attributes, "uid");
                        user.Username = GetstringAttributeValue(entry.Attributes, "sAMAccountName");

                        users.Add(user);
                    }

                    return users;
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }

另外,如果我想获取 AD 中的每个用户,这样我就可以将数据与我的 SQL DB 同步,我该怎么做,我不断超出最大大小,错误。我将大小设置为 maxInt32... 是否有“忽略大小”选项?

谢谢,

埃里克-

4

1 回答 1

0

我认为标准方法是使用 System.DirectoryServices,而不是 System.DirectoryServices.Protocol。为什么要使用后者?

关于关于错误消息“超出最大尺寸”的第二个问题,可能是因为您尝试一次获取太多条目。
Active Directory 限制查询返回的对象数量,以免目录过载(限制类似于 1000 个对象)。获取所有用户的标准方法是使用分页搜索。

算法是这样的:

  1. 您构建将获取所有用户的查询
  2. 您在此查询中指定了一个特定控件(分页结果控件),表明这是一个分页搜索,每页有 500 个用户
  3. 您启动查询,获取第一页并解析该页面中的前 500 个条目
  4. 你向 AD 请求下一页,解析接下来的 500 个条目
  5. 重复直到没有剩余页面
于 2011-09-04T00:34:04.927 回答