Как мне заставить DirectorySearcher соблюдать мой указанный SearchScope? - PullRequest
1 голос
/ 11 марта 2010

У меня есть следующий код 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();

Я отслеживаю трафик LDAP на сервер AD с помощью MS Network Monitor и вижу это, когда происходит поиск:

  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-запрос с неповрежденными фильтром и областью поиска.

Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Вот как я это делаю:

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

Удивительный сайт для всего, что AD я использую.

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

0 голосов
/ 22 января 2013

Таким образом, отправляемый запрос является запросом о возможностях сервера ldap (местонахождение схемы, поддерживаемая версия ldap и т. Д.). Сервер ldap / AD может ответить запрошенной информацией или потребовать аутентификацию. Вы можете позаботиться об этом шаге (связать), предоставив учетные данные при привязке к корневой записи. После того, как сообщение SearchResultsDone получено для запроса возможностей, средство поиска каталогов (фактически базовый класс ldap) отправит запрос поиска с запросом запрашиваемой информации.

...