Получение членства пользователя из Access VBA с помощью ADO для выполнения запроса LDAP - PullRequest
1 голос
/ 10 мая 2019

Я запрашиваю Active Directory, используя VBA из Microsoft Access.Как и многие примеры, размещенные в Интернете, я использую соединение ADO для выполнения запроса LDAP.Я могу успешно получить некоторые атрибуты, такие как sn, givenName, mail, proxyAddresses и некоторые другие свойства MS Exchange, например свойства msExchExtensionAttribute##.

Теперь я пытаюсь выполнить запросатрибут memberOf, и я не получаю возвращаемого значения для любого пользователя, кроме меня.Я легко могу увидеть членство в группах других пользователей в Outlook или узнать, кто является членом групп, выполнив поиск с помощью инструмента поиска Windows Active Directory.Звучит для меня как проблема с разрешениями, поэтому я копался в строке подключения.У меня было подозрение, что я делаю свой запрос анонимно, так как я не указал имя пользователя или пароль.

Я пытаюсь убедиться, что я использую проверку подлинности Windows, и это должен быть в состоянии выполнять средний пользователь (какЯ тоже нахожусь в этом домене), так что никакие полномочия администратора не будут доступны для этого.

Некоторые базовые размышления заставили меня поверить, что установка свойства Integrated Security свойств соединения на SSPI должна сделатьЭто.Это не работает, хотя.На данный момент я просто пытаюсь заставить его работать, поэтому функция возвращает строку только для отладки, но в конечном итоге я верну массив или объект.

Вот что у меня получилосьfar:

Function GetMembershipFromUsername(uname As String) As String
    'Get the domain root
    Dim root As IADs
    Set root = GetObject("LDAP://RootDSE")

    'Set the query parameters
    Dim base as String, fltr as String, attr as String, scope as String
    base = "<LDAP://" & root.Get("defaultNamingContext") & ">"
    fltr = "(&(objectCLass=user)(objectCategory=Person)(sAMAccountName=" & uname & "))"
    attr = "sAMAccountName,memberOf"
    scope = "subtree"

    'Connect to the LDAP server
    Dim conn As ADODB.Connection
    Set conn = CreateObject("ADODB.Connection")
    conn.Provider = "ADsDSOObject"
    conn.Properties.Item("Integrated Security").Value = "SSPI"
    conn.Open "Active Directory Provider"

    'Create LDAP command object
    Dim cmd As ADODB.Command
    Set cmd = CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = conn

    'Build command
    cmd.CommandText = base & ";" & fltr & ";" & attr & ";" & scope

    'Execute and return info
    Dim rs as ADODB.Recordset, vi as Variant, ml as String
    Set rs = cmd.Execute
    If rs.RecordCount > 0 Then
        For Each vi In rs.Fields(1).Value
            ml = ml & vi & Chr(10)
        Next vi
    End If
    rs.Close

    conn.Close

    GetMembershipFromUsername = ml
End Function

Я сталкиваюсь с проблемой разрешений, я все еще как-то делаю свой запрос анонимно, или я делаю какую-то другую ошибку, которая только позволила бы мне отказаться от членства в моей группе?

1 Ответ

0 голосов
/ 12 мая 2019

Интерфейс IADsOpenDSObject должен использоваться вместо IAD для привязки к объектам AD с использованием контекста безопасности, отличного от того, который пользователь запрашивает в данный момент.

Интерфейс IADsOpenDSObject предназначен для обеспечения безопасности. контекст для привязки к объекту в базовом хранилище каталогов. Это предоставляет средства для указания учетных данных клиента. Использовать этот интерфейс для привязки к объекту ADSI, когда вы должны предоставить набор учетные данные для аутентификации в любой службе каталогов.

Вам необходимо создать ссылку на IADsOpenDSObject, используя метод GetObject(), так же, как вы делаете это с интерфейсом IADs. Затем можно вызвать метод OpenDSObject(), который позволяет привязать объект ADSI с использованием произвольных учетных данных:

Dim ds As IADsOpenDSObject 
Set ds = GetObject("LDAP://RootDSE")

Dim root As IADs
Set root = ds.OpenDSObject(dn, username, password, ADS_SECURE_AUTHENTICATION)

Последний параметр - это флаг аутентификации (см. ADS_AUTHENTICATION_ENUM), который определяет, какой процесс аутентификации использовать.

...