После всего чтения и исследования, которое я провел, это походит на самое логическое место для регистрации этого вопроса:
Почему я могу запросить Active Directory с помощью VBA, но не Связанного сервера в Studio управления SQL 2012?
Во-первых, я смог сделать это прежде, но много лун назад с SQL 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
Однако единственная вещь, я нашел это, могла бы приняться кроме всех других блогов об этой ошибке, когда я пытаюсь выполнить развертку к таблицам связанных серверов и представлению (Серверный объекты> Связанные серверы> ADSI> Каталоги> значение по умолчанию> Таблицы). После того как я нажимаю для расширения уровня Таблиц, я получаю следующую ошибку:
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
Это может произойти, если вы используете параметр «Сделать без использования контекста безопасности» на странице настроек безопасности связанного сервера. Это приводит к анонимному вызову LDAP. В наши дни (Server 2008 или новее) анонимные операции LDAP по умолчанию запрещены.
Мои тесты показывают, что опция «Сделать с использованием контекста безопасности входа в систему» вызывает LDAP-вызов под учетными данными, с которыми работает служба SQL-сервера.
Я могу предложить использовать либо «Сделано с использованием контекста безопасности входа», сопоставить локальный вход удаленному пользователю или просто ввести учетные данные по умолчанию (вариант 4 в диалоговом окне):
Во всех случаях я бы предложил использовать выделенный AD Учетная запись пользователя для связанного сервера.
Обратите внимание, что вы запрашиваете конфиденциальные атрибуты, такие как userAccountControl. По умолчанию обычные пользователи домена не могут прочитать этот атрибут, т.е. ваш запрос может не вернуть полный набор результатов. Вы можете преодолеть это, используя выделенную учетную запись AD и предоставив ей разрешение READ для атрибута userAccountControl, где это применимо.
Также я бы посоветовал не использовать бессерверную привязку. По крайней мере, укажите имя домена:
LDAP: //mydomain.local/dc=mydomain,dc=local
Это может помочь вам избежать медленных ответов LDAP и / или несогласованности данных.