【发布时间】:2017-04-15 20:24:39
【问题描述】:
我想列出域中的所有组。如果我使用 DirectorySearcher 或 LdapConnection 和 SearchRequest 对象,则返回列表中缺少某些组。但是如果我从目录的根目录开始遍历所有具有 DirectoryEntry 类的树,我可以得到这些组。
我使用 AD Explorer 工具检查了返回组和丢失组的属性,但我看不出它们之间有任何区别。我需要使用 LdapConnection + SearchRequest,因为如果我需要使用 LDAP+SSL,DirectoryEntry 不允许我管理证书问题。
有人遇到过同样的问题吗?可能有什么问题?
搜索操作示例代码;
LdapConnection _connection = new LdapConnection(new LdapDirectoryIdentifier("MTS", 389));
_connection.AuthType = AuthType.Basic;
_connection.Credential = new NetworkCredential("MTS\user1", "test123");
string _target = "dc=MTS,dc=com";
SearchRequest _request = new SearchRequest(_target, "(&(objectCategory=Group)(objectClass=group))", System.DirectoryServices.Protocols.SearchScope.Subtree, new string[] { "sAMAccountName" });
var _response = (SearchResponse)_connection.SendRequest(_request);
List<string> _namelist = new List<string>(16);
foreach (SearchResultEntry entry in _response.Entries)
{
if (entry.Attributes["sAMAccountName"].Count > 0)
_namelist.Add(entry.Attributes["sAMAccountName"][0].ToString());
}
编辑 1
如果我更改搜索过滤器并仅搜索丢失的组,它会找到该组。以下搜索过滤器起作用并获取组,
"(&(sAMAccountName=testGroup)(objectCategory=Group)(objectClass=group))"
可能存在限制,但我将 Sizelimit 和 TimeLimit 设置得如此之高,搜索永远不会返回有关任何限制的错误。
【问题讨论】:
-
缺失的组是否总是相同的类型(本地、全局、通用)?您是否检查过他们实际上有
(objectCategory=Group)(objectClass=group)? -
列出和缺失的组是同一类型,它们实际上是“(objectCategory=Group)(objectClass=group)”。奇怪的是,如果我使用 DirectoryEntry 类从上到下遍历目录结构,我可以检索它们。
-
返回条目的总数是多少?根据我的经验,目录控制器可能会限制搜索响应计数(取决于操作系统、域和林功能级别)。尝试在 SearchRequest 中使用 PageResultRequestControl。
-
是的,这就是我得到的结果少于预期的原因。即使我将 SizeLimit 设置得太高,服务器端也有一个我无法更改的 Max Result 限制。仅当域太大时才会出现此问题。由于我无法操纵客户端域控制器的大小限制,我通过使用分页搜索控件解决了它。你可以写一个关于这个解决方案的答案。谢谢,
标签: c# active-directory ldap