使用 T-SQL 查询 Active Directory

Posted

技术标签:

【中文标题】使用 T-SQL 查询 Active Directory【英文标题】:Querying Active Directory with T-SQL 【发布时间】:2016-12-08 16:03:11 【问题描述】:

试过了:

EXEC master.dbo.sp_addlinkedserver
        @server = N'ADSI',
        @srvproduct=N'Active Directory Services',
        @provider=N'ADsDSOObject',
        @datasrc=N'server_name.your_domain.com'

EXEC master.dbo.sp_addlinkedsrvlogin 
        @rmtsrvname=N'ADSI',
        @useself=N'False',
        @locallogin=NULL,
        @rmtuser=N'your_domain\domain_user',
        @rmtpassword='********'

SELECT * 
FROM OPENQUERY (ADSI, 'SELECT *
                       FROM ''LDAP://DC=your_domain,DC=com''')

收到此错误:

消息 7321,第 16 级,状态 2,第 1 行 准备查询“SELECT * FROM 'LDAP://DC=your_domain,DC=com'”以针对链接服务器“ADSI”的 OLE DB 提供程序“ADsDSOObject”执行时出错。

我已经确认我的和 SQL Server 服务域帐户具有对 AD 的读取权限,并且选择了 ADsDSOObject 提供程序上的“允许进程内”。

任何想法将不胜感激。

【问题讨论】:

如果您导航到您的链接服务器是 SSMS,您可以右键单击并测试连接。这行得通吗? @Meghan Armes 是的! 我认为那是为了@destination-data :) 我认为问题是SELECT * 返回的数据与 SQL Server 不兼容。尝试将 OPENQUERY 中的 SELECT 子句限制为您正在使用的字段。有一些方便的提示here。 【参考方案1】:

我能找到的每个示例都有:LDAP://DC=your_domain,DC=com 作为语法。对于我们的服务器(可能还有其他服务器)来说,它是:LDAP://DC=your_domain,DC=internal

根据某人的建议,我使用 Softerra LDAP 浏览器(免费)并打开服务器,单击顶部节点,发现可分辨名称条目列为:DC=your_domain,DC=internal

一旦我进行了更改,我就可以看到 AD 数据。

【讨论】:

以上是关于使用 T-SQL 查询 Active Directory的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL:使用命名空间查询 xml

如何在这个特定的 T-SQL 查询中使用表变量?

T-SQL查询语句

T-SQL 高级查询

T-SQL查询2

T-SQL动态查询——动态SQL