LDAP:使用sAMAccountName查询整个域中的用户

LDAP:使用sAMAccountName查询整个域中的用户,ldap,Ldap,我正在使用PythonLDAP模块在Windows2003R2服务器上处理AD 当我搜索ObjectClass=Person时,我看到一些服务也在查询结果中返回。 我想知道如何更改我的查询,以便只返回用户条目,您还可以告诉我任何关于此的文档 以下是我的ipython命令行的一个片段: ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) l=ldap.initialize(server) l.simp

我正在使用PythonLDAP模块在Windows2003R2服务器上处理AD

当我搜索ObjectClass=Person时,我看到一些服务也在查询结果中返回。 我想知道如何更改我的查询,以便只返回用户条目,您还可以告诉我任何关于此的文档

以下是我的ipython命令行的一个片段:

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) l=ldap.initialize(server) l.simple_bind_s(user, password) user_filter = '(&(objectClass=person)(sAMAccountName=ouuser1))' base_dn='DC=id-ad, DC=idea, DC=com' qres=l.search_ext_s(base_dn, ldap.SCOPE_SUBTREE, user_filter) print qres
最近,当我们的广告团队启用了广告的内置DNS功能DNS应用程序分区时,我突然遇到了这个问题。我有很多现有的代码可以迭代LDAP结果,如下所示:

for record in records:
    for key, value in record[1].items():
        # Do stuff with the returned keys/values here
更改导致我的代码中断,因为突然出现了与您相同的结果:

(None,
      ['ldaps://ForestDnsZones.ourdomain.com/DC=ForestDnsZones,DC=ourdomain,DC=com']),
解决方法相对简单:

for record in records:
    if record[0]: # Add this conditional
        for key, value in record[1].items():
如果AD/LDAP返回的元组中的第一项为None,则表示它是LDAP引用。这些可以被安全地忽略,因为我们不遵循推荐,因为它们天生就是坏的;它们不会告诉您连接到引用的目标所需的凭据


更多信息:只有在您针对整个域进行查询时才会出现这种情况,例如,您的基本dn为“dc=where,dc=yourcompany,dc=com”,没有“ou=something”。这是因为AD将其DNS记录服务视为全局域的对等方。因此,当您仅使用全局域作为基本域来查询任何内容时,它会将这些奇怪的额外记录附加到每个成功查询的末尾:如果所有域控制器的配置都相同,那么它们可能不是

请尝试objectClass=organizationalPerson或objectClass=user。是否可以发布完整条目ldaps://ForestDnsZones.id-ad.idea.com/DC=ForestDnsZones,DC=id-ad,DC=idea,DC=com?@Ingmar。我确实尝试过这两个对象类,但没有成功。@Terry:对不起,我没有理解你
(None,
      ['ldaps://ForestDnsZones.ourdomain.com/DC=ForestDnsZones,DC=ourdomain,DC=com']),
for record in records:
    if record[0]: # Add this conditional
        for key, value in record[1].items():