Winapi 用于搜索的通用LDAP库?

Winapi 用于搜索的通用LDAP库?,winapi,active-directory,ldap,ldap-query,Winapi,Active Directory,Ldap,Ldap Query,我正在编写一些C++/Win32代码来搜索LDAP目录中的用户(实际上我需要验证用户名/密码是否正确,然后验证组成员身份)。我有用户名,所以我希望类似于以下内容的东西能起作用: (&(objectCategory=person)(objectClass=user)(uid={username})) 当我用这个搜索/过滤器调用ldap\u search时,我必须提供一个开始基(节点/OU/任何东西)来搜索。但我不知道从哪里开始搜索——我只有用户名。是否仍然需要指定用于OpenLDAP、A

我正在编写一些C++/Win32代码来搜索LDAP目录中的用户(实际上我需要验证用户名/密码是否正确,然后验证组成员身份)。我有用户名,所以我希望类似于以下内容的东西能起作用:

(&(objectCategory=person)(objectClass=user)(uid={username}))
当我用这个搜索/过滤器调用
ldap\u search
时,我必须提供一个开始基(节点/OU/任何东西)来搜索。但我不知道从哪里开始搜索——我只有用户名。是否仍然需要指定用于OpenLDAP、Active Directory、Netscape LDAP等的树的根


另外,任何能够回答这个问题的人都可能会对此有所帮助:uid属性是否得到普遍支持,或者我是否需要根据我正在使用的LDAP服务器的品牌搜索不同的属性?(我看到过一些人需要搜索
uid
CN
,甚至
SAMAccountName
)。

您需要定义开始搜索的容器。这大概是

"LDAP://" + _ADSPath + ":" + _ADSPort + "/" + _ADSRootContainer
其中_ADSPath是服务器主机名/ip_ADSPort是端口号(默认情况下通常为389);而_ADSRootContainer是容器路径的其余部分(比如ou=Users)。
路径将取决于您正在搜索的实现。您可以启动到比容纳用户的容器更高的位置,并在搜索对象上设置参数以使用多级搜索。但速度会慢得多。

关于一般检索搜索库的第一个问题:

每个LDAP目录服务器(我认为符合LDAP协议)都会在名为RootDSE的节点下公开一些操作内容。通过RootDSE可以检索的内容之一是namingContexts,它基本上可以告诉您此服务器上托管了哪些不同的树

因此,您可以检索用于用户名搜索的顶级搜索库。请注意:某些LDAP(例如OpenLDAP)服务器可以承载多个树,因此在找到多个命名上下文时,您必须提出解决方案

RootDSE可以通过查询服务器上的DN“”(空字符串)并指定要获取所有操作属性来检索。以下是OpenLDAP服务器的示例:

ldapsearch -H ldap://ldap.mydomain.com -x -s base -b "" +
# note the + returns operational attributes
这将返回类似于下面所示的内容(来自OpenLDAP 2.4.8)-括号中的值是添加的解释,服务器不会返回:

dn:
structuralObjectClass: OpenLDAProotDSE
configContext: cn=config
namingContexts: dc=example,dc=com
namingContexts: dc=example,dc=net
monitorContext: cn=Monitor
supportedControl: 1.3.6.1.4.1.4203.1.9.1.1 (Contentsync RFC 4530)
[...]
supportedExtension: 1.3.6.1.4.1.4203.1.11.1 (ModifyPassword RFC3088)
[...]
supportedFeatures: 1.3.6.1.1.14 (Modify-Increment RFC4525)
[...]
supportedLDAPVersion: 3
supportedSASLMechanisms: NTLM
[...]
entryDN:
subschemaSubentry: cn=Subschema
(来自)


关于
uid
属性可用性的第二个问题:


我不认为您应该依赖这个,因为它强烈地依赖于用于存储用户数据的模式(尽管我认为大多数用户模式类将具有
uid
属性)。但这取决于您希望在程序中使用的灵活性。也许最好的方法是让最终用户可以配置用户筛选器字符串(您甚至可以使用搜索库进行配置,这将具有一些性能优势)(当用户仅位于一个小的子树中时,无需搜索整个树,也无需查询RootDSE))。

我不相信uid是LDAP中用户条目的正确搜索属性。许多公司只会保证employeeID在LDAP DIT中是唯一的