Связанный сервер ADSI: Почему я могу запросить AD в VBA, но не как Связанный сервер?

После всего чтения и исследования, которое я провел, это походит на самое логическое место для регистрации этого вопроса:

Почему я могу запросить 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
1
задан 6 March 2015 в 02:34
1 ответ

Это может произойти, если вы используете параметр «Сделать без использования контекста безопасности» на странице настроек безопасности связанного сервера. Это приводит к анонимному вызову LDAP. В наши дни (Server 2008 или новее) анонимные операции LDAP по умолчанию запрещены.

Мои тесты показывают, что опция «Сделать с использованием контекста безопасности входа в систему» ​​вызывает LDAP-вызов под учетными данными, с которыми работает служба SQL-сервера.

Я могу предложить использовать либо «Сделано с использованием контекста безопасности входа», сопоставить локальный вход удаленному пользователю или просто ввести учетные данные по умолчанию (вариант 4 в диалоговом окне):

enter image description here

Во всех случаях я бы предложил использовать выделенный AD Учетная запись пользователя для связанного сервера.

Обратите внимание, что вы запрашиваете конфиденциальные атрибуты, такие как userAccountControl. По умолчанию обычные пользователи домена не могут прочитать этот атрибут, т.е. ваш запрос может не вернуть полный набор результатов. Вы можете преодолеть это, используя выделенную учетную запись AD и предоставив ей разрешение READ для атрибута userAccountControl, где это применимо.

Также я бы посоветовал не использовать бессерверную привязку. По крайней мере, укажите имя домена:

LDAP: //mydomain.local/dc=mydomain,dc=local

Это может помочь вам избежать медленных ответов LDAP и / или несогласованности данных.

3
ответ дан 3 December 2019 в 18:40

Теги

Похожие вопросы