在我做了这么多的阅读和研究之后,这似乎是发表这个问题的最合乎逻辑的地方:
首先,我以前已经能够做到这一点,但是很多年前我使用了Server 2005。
下面是我正在尝试的查询:
SELECT * FROM OpenQuery(
ADSI,
'SELECT displayName, title, department, employeeID, userAccountControl
FROM ''LDAP://dc=testdomain''
WHERE objectCategory = ''Person'' AND
objectClass = ''user'' AND
userAccountControl=512')
下面是我遇到的错误:
Msg 7321, Level 16, State 2, Line 1
An error occured while preparing the query "SELECT displayName, title, department, employeeID, userAccountControl
FROM 'LDAP://dc=testdomain'
WHERE objectCategory = 'Person' AND
objectClass = 'user' AND
userAccountControl=512" for execution against OLE DB provider "ADsDSOObject" for linked server "ADSI".
这个错误信息的问题是,它非常通用,似乎没有产生任何有用的东西。我所读到的一切似乎都是权限问题或查询的语法问题,我假设它在上下文中意味着我的SQL实例登录以及如何在链接服务器中设置安全性。下面的VBA代码可以工作,并且使用的查询非常相似,甚至连最简单的查询都无法在链接服务器中工作。我还可以访问我试图链接到的Active Directory,我在底部的VBA代码片段(仅供参考)证实了这一点。问题是,我相信我有足够的特权让这一切发挥作用。
但是,在不同的站点上提出的许多建议都涉及对SQL实例进行修改,这些修改对于长期的影响还不是很清楚,因为这个服务器还在构建中。我有临时提升的特权来建立它。
下面是我设置链接服务器的详细信息和参数:
SQL Server 11.0.5058
Linked Server: ADSI
Provider: OLE DB Provider for Microsoft Directory Services
Product name: Active Directory Services 2.5
Data source: adsdatasource
Provider string: ADsDSOObject
Be made using the login's current security context
Ole DB Provider Options:
Allow in process
但是,我发现唯一可能与所有其他博客不同的是,当我试图深入到链接服务器表并查看(Server Objects > linked > ADSI > this > default > Tables)时。一旦我单击来展开表级别,就会得到以下错误:
Failed to retreive data for this request. (Microsoft.SqlServer.Management.Sdk.Sfc)
Additional information:
An exception occured while executing a Transact-SQL statement or batch.
(Microsoft.SqlServer.ConnectionInfo)
Cannot obtain the required interface ("IID_IDBSchemaRowset") from OLE DB provider "ADsDSOObject"
for linked server "ADSI". (Microsoft SQL Server, Error: 7301)
这个IID_IDBSchemaRowset
似乎是我唯一的线索,但它看起来像是一个深而黑暗的兔子洞,我不知道这是不是我需要去的地方。帮助!
'References: Microsoft ActiveX Data Objects 2.8 Library
Public Sub testADSI()
On Error Resume Next
Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs as ADODB.Recordset
Dim MySql as String
Dim n as Integer
Set cn = New ADODB.Connection
Set cmd = New ADODB.Command
Set rs = New ADODB.Recordset
cn.Provider = "ADsDSOObject"
cn.Open "Active Directory Provider"
Set cmd.ActiveConnection = cn
cmd.Properties("Page Size")= 1000
MySql = "SELECT displayName, title, department, employeedID, userAccountControl " & _
"FROM 'LDAP://dc=testdomain' " _ &
"WHERE objectCategory = 'Person' AND " & _
"objectClass = 'user' AND " & _
"userAccountControl=512"
rs.Open MySql, cn, 1
If rs.RecordCount > 0 Then
MsgBox "Sucess! " & rs.RecordCount & " records found!"
Else
MsgBox "No records"
End IF
End Sub
发布于 2015-09-15 18:59:34
您应该能够在不需要链接服务器的情况下查询。根据我的经验,使LDAP://
字符串准确正确是关键。
我能够成功地从SQL Server 2012中对我们的Active基础设施运行您的查询:
SELECT * FROM OPENROWSET
(
'ADSDSOObject'
, 'adsdatasource'
, 'SELECT displayName, title, department, employeeID, userAccountControl
FROM ''LDAP://DC=some,DC=name,DC=here''
WHERE objectCategory = ''Person''
AND objectClass = ''user''
AND userAccountControl=512'
);
DC=some,DC=name,DC=here
显然需要修改以适应实际使用中的域名。
例如,如果您的域名是microsoft.com,您可以使用:
DC=microsoft,DC=com
注意,在这种情况下,只有两个组件。如果您的域名只是“取消”,您将使用:
DC=cancorso
希望这能帮上忙。
https://dba.stackexchange.com/questions/94389
复制相似问题