【问题标题】:How do I get DirectorySearcher to honor my specified SearchScope?如何让 DirectorySearcher 遵守我指定的 SearchScope?
【发布时间】:2010-03-11 16:39:12
【问题描述】:

我在一个项目中有以下 C# 代码:

    DirectoryEntry root = new DirectoryEntry(@"LDAP://ad.mydomain.com");
    DirectorySearcher ds = new DirectorySearcher(root);
    ds.DerefAlias = DereferenceAlias.Always;
    ds.SearchScope = SearchScope.Subtree;
    ds.Filter = "(|(name=John_Smith)(cn=John_Smith))";
    SearchResultCollection src = ds.FindAll();

我正在使用 MS Network Monitor 监控到 AD 服务器的 LDAP 流量,并在搜索发生时看到:

  Frame: Number = 1417, Captured Frame Length = 404, MediaType = ETHERNET 
+ Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[XXX],SourceAddress:[XXX]
+ Ipv4: Src = XXX, Dest = XXX, Next Protocol = TCP, Packet ID = 9696, Total IP Length = 390
+ Tcp: Flags=...AP..., SrcPort=1521, DstPort=LDAP(389), PayloadLen=350, Seq=3825204841 - 3825205191, Ack=1241404727, Win=16425 (scale factor 0x2) = 65700
- Ldap: Search Request, MessageID: 1, BaseObject: NULL, SearchScope: base Object, SearchAlias: neverDerefAliases
  - Parser: Search Request, MessageID: 1
   + ParserHeader: 
   + MessageID: 1
   + OperationHeader: Search Request, 3(0x3)
   - SearchRequest: BaseDN: NULL, SearchScope: base Object, SearchAlias: neverDerefAliases
    + BaseObject: NULL
    + Scope: base Object
    + Alias: neverDerefAliases
    + SizeLimit: No Limit
    + TimeLimit: 120 seconds
    + TypesOnly: False
    - Filter: (objectclass Present)
     + Operator: Present, 7(0x07)
     - Length: 11
        Length: 11 bytes, LengthOfLength = 0
     + PresentFilter: objectclass Present
    - Attributes: ( subschemaSubentry )( dsServiceName )( namingContexts )( defaultNamingContext )( schemaNamingContext )( configurationNamingContext )( rootDomainNamingContext )( supportedControl )( supportedLDAPVersion )( supportedLDAPPolicies )( supportedSASLMec
     + AttributeSelectionHeader: 
     + Attribute: subschemaSubentry
     + Attribute: dsServiceName
     + Attribute: namingContexts
     + Attribute: defaultNamingContext
     + Attribute: schemaNamingContext
     + Attribute: configurationNamingContext
     + Attribute: rootDomainNamingContext
     + Attribute: supportedControl
     + Attribute: supportedLDAPVersion
     + Attribute: supportedLDAPPolicies
     + Attribute: supportedSASLMechanisms
     + Attribute: dnsHostName
     + Attribute: ldapServiceName
     + Attribute: serverName
     + Attribute: supportedCapabilities

查询中似乎没有使用我请求的搜索范围或过滤器。我尝试使用 Softerra LDAP Administrator 对“John_Smith”执行根搜索,网络监视器显示似乎是一个非常好的 LDAP 查询,过滤器和搜索范围完好无损。

我错过了什么?

【问题讨论】:

  • 愚蠢的问题:您确定您正在查看正确的以太网框架吗?也许您拥有的框架是实际查询之前发生的初始化/协商序列的一部分?
  • 我很确定这是正确的框架。我只看到一个“LDAP:Search Request, MessageID: 1, BaseObject: NULL, SearchScope: base Object, SearchAlias: neverDerefAliases”和一个“LDAP:Search Result Entry, MessageID: 1”。搜索结果为 NULL。

标签: .net active-directory ldap directoryservices


【解决方案1】:

这就是我的做法:

searcher.Filter = "(&(objectClass=user)(|(cn=John_Smith)(sAMAccountName=John_Smith)))";

我使用的这个是一个包含所有广告的很棒的网站。

http://www.codeproject.com/KB/system/everythingInAD.aspx

【讨论】:

  • +1 我目前正在开发我们的框架块,使用这篇精确的文章与 AD 对话!它包含的信息真是太棒了!很好的参考!
  • 这对我不起作用。我没有得到任何结果,并且 LDAP 数据包似乎仍然没有过滤器和范围 = 基本对象。即使我复制粘贴 Softerra 工具使用的确切过滤器,我也没有得到任何结果,也没有明显的过滤器被传递到服务器。
  • 这听起来是个愚蠢的问题,但您确定 John_Smith 是“sAMAccountname”吗?
  • 另外,您确定不需要为您的目录条目设置用户名和密码属性吗?
  • 嗯,这是我正在搜索的另一个名称,但它绝对是 AD 中的有效帐户名称。我可以通过 WinNT 提供程序和 Softerra 工具找到它。
【解决方案2】:

所以正在发送的请求是对 ldap 服务器功能的查询(模式的位置、支持的 ldap 版本等)。 ldap/AD 服务器可以响应请求的信息或要求身份验证。您可以通过在绑定到根条目时提供凭据来处理该步骤(绑定)。在接收到功能查询的 SearchResultsDone 消息后,目录搜索器(实际上是底层 ldap 类)将发送一个搜索请求,询问您请求的信息。

【讨论】:

    最近更新 更多