【问题标题】:Querying LDAP from SQL Server issue从 SQL Server 问题查询 LDAP
【发布时间】:2011-12-06 18:18:15
【问题描述】:

我在配置 SQL 语句以从 SQL Server 对 LDAP 执行开放查询时遇到了一些问题。我按照此处列出的说明进行操作:Querying Active Directory from SQL Server 2005 但我在将最后的部分放在一起时遇到了一些麻烦。

首先,我不知道我的 LDAP 服务器在哪里。于是我做了一个nslookup,发现默认服务器为:

abc.domain.popo.local

我将OPENQUERY 配置为

SELECT * FROM OPENQUERY( ADSI, 'SELECT * FROM ''LDAP://DC=abc,DC=domain,DC=popo,DC=local'' WHERE
objectCategory = ''User''')   

但是,我收到一个错误提示

准备查询“SELECT * FROM 'LDAP://DC=abc,DC=domain,DC=popo,DC=local' WHERE objectCategory = 'User'”以针对 OLE DB 提供程序“ADSDSOObject”执行时出错" 用于链接服务器“ADSI”。

这里可能的问题是什么?我是否错误地设置了DC(因为我什至不知道 DC 是什么意思)?还是更有可能我只是为 LDAP 设置了错误的服务器?

【问题讨论】:

    标签: sql sql-server active-directory ldap


    【解决方案1】:

    在我看来,您正在尝试查询 Windows Active Directory(在功能上显示为 LDAP)。默认情况下,AD 不允许匿名查询 - 您必须使用受信任的用户名和密码进行身份验证。此外,您需要与系统管理员核实以确保您具有正确的基本值(“DC=abc,DC=domain,DC=popo,DC=local”)。

    【讨论】:

    • 即使我使用 Windows 身份验证运行查询,我是否需要指定用户名/密码?
    • 我不确定,但如果您的凭据一直通过,我会感到惊讶。至少可以尝试明确设置凭据。
    • 这可能是它。我认为链接服务器的安全性从未设置过。我必须让管理员检查链接服务器上的属性
    • 如果他在使用 Windows 身份验证的 SQL SSMS 中,除非域管理员已锁定 AD,否则无需执行任何其他操作。 AD 中的基本用户默认具有读取相当多属性和属性的权限。匿名 - 当然 - 默认情况下它们被阻止(即使您可以设置 dsheuristics 等来打开它)
    • 原来是凭证问题。链接服务器未正确设置
    【解决方案2】:

    请参阅 Richard Mueller 的 ADO / SQL search tips - 他们有帮助吗? (Richard 的网站是 LDAP 和 Active Directory 参考资料和技巧的真正宝库 - 强烈推荐!)

    根据我在本网站上看到的情况,您可能使用了错误的 objectCategory - 尝试使用 Person 而不是 User(我相信是 objectClass):

    SELECT * FROM OPENQUERY(ADSI, 
                'SELECT * FROM ''LDAP://DC=abc,DC=domain,DC=popo,DC=local'' 
                 WHERE objectCategory = ''Person''')   
    

    【讨论】:

    • 感谢您的链接。它有一些很好的信息,但不能解决我当前的问题。它也失败了 objectClass 而不是 objectCategory
    • @Rondel:你想选择什么?也许您需要从不同的起点进行选择,例如'SELECT * FROM ''LDAP://CN=Users,DC=domain,DC=popo,DC=local'' WHERE objectCategory = ''User''' 或类似的东西......
    • 现在我正在尝试从 AD 为用户获取任何我能提供的信息,但最终我只想要 displayNames 和用户名。
    【解决方案3】:

    确保“abc”不是该域中域控制器的实际名称;因此在这种情况下,您的 OPENQUERY 应该省略它并且是:

    SELECT * FROM OPENQUERY( ADSI, 'SELECT * FROM ''LDAP://DC=domain,DC=popo,DC=local'' WHERE objectCategory = ''Person'' AND objectClass = ''user''')

    【讨论】:

    • 很高兴知道。因此,如果我有一堆服务器 abc.domain.popo.local、def.domain.popo.local 等,我应该只使用 DC=domain,DC=popo,DC=local跨度>
    • @Rondel - 是的,您应该使用“无服务器绑定”作为最佳实践;否则,您将针对特定的域控制器 - 如果该服务器出现故障,您的查询将失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多