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