Моя первоначальная цель с LDAP состояла в том, чтобы вернуть всех активных членов указанной группы, которая в настоящее время является активным сотрудником.LDAP - Active Directory - может/должен использовать класс?
Я пришел к этому решению:
Public Const ADConString = "Provider=ADsDSOObject;
Encrypt Password=False;
Integrated Security=SSPI;
Data Source=
LDAP://Domain:Numbers/DC=ROOT,
DC=Someplace,OU=SomePlace;
Mode=Read
Bind Flags=0;ADSI Flag=-2147483648"
Public Function getActiveDirectoryGroup(groupName As String)
Dim cmd As ADODB.Command
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim test As Variant
Set cmd = CreateObject("ADODB.Command")
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open ADConString
cmd.CommandText =
"SELECT sn,adspath,cn,givenname,userAccountControl
FROM 'LDAP://RootPlace _
"WHERE MemberOf='cn=" & groupName &
",CN=SomePlace,DC=KMC,DC=SomePlace' " & _
"AND userAccountControl<>514
AND sn <>'name1' AND sn <>'name2'
AND sn <>'name3' " & _
"ORDER BY givenname"
Debug.Print cmd.CommandText
cmd.ActiveConnection = cn
Set rs = cmd.execute
groupPath = rs.Fields("adspath").Value
Do While Not rs.EOF
'Debug.Print rs.Fields("adspath").Value
Debug.Print rs.Fields("givenname").Value & " "
& rs.Fields("sn").Value & " "
& rs.Fields("userAccountControl")
'Debug.Print rs.Fields("cn").Value
rs.MoveNext
Loop
End Function
Теперь это решение работает, если вы передаете его группу, но я хотел бы расширить это так кто-то может захватить только активные член или избавиться от sn <>'name1' AND sn <>'name2' AND sn<>'name3'
условных ,
До сих пор я построил этот класс
Option Compare Database
Option Explicit
Private pADConnectionString As String
Private pRootLocation As String
Private pGroupName As String
Private Sub class_Initialize()
pADConnectionString = "Provider=ADsDSOObject;
Encrypt Password=False;
Integrated Security=SSPI;
Data Source=
LDAP://Domain:Numbers/DC=ROOT,
DC=Someplace,OU=SomePlace;
Mode=Read
Bind Flags=0;ADSI Flag=-2147483648"
pRootLocation = getNC()
End Sub
Sub retreiveUsers()
End Sub
Public Property Get ADConnectionString() As Double
ADConnectionString = pADConnectionString
End Property
Public Property Let ADConnectionString(connectionString As Double)
pADConnectionString = connectionString
End Property
Function getNC()
Set objRoot = GetObject("LDAP://RootDSE")
getNC = objRoot.Get("defaultNamingContext")
End Function
Public Property Get groupName() As String
groupName = pGroupName
End Property
Public Property Let groupName(group As String)
pGroupName = group
End Property
Я немного ржавый на классы, и я не совсем уверен, как ввести динамический WHERE
заявление в этот класс. Итак, следует ли продолжить этот путь, и если да, то какие решения я мог бы рассмотреть для обработки предложения WHERE
?
Я думал о том, чтобы использовать что-то неаккуратное, например, сеттер, который добавляет то, что пользователь отправляет к тому, что уже применяется к новой переменной whereStatement
, таким образом, что он может продолжать добавлять в предложение WHERE
. Мое беспокойство заключается в том, что, если не считать полной ясности, я не смогу удалить отдельные условные заявления, такие как sn<>'Name1'
Моя цель состояла в том, чтобы динамически изменять то, что получили пользователи. Иногда я хотел бы, чтобы группа возвращалась с неактивными пользователями, у которых есть слова abc там, но в других случаях я хотел бы сделать что-то совершенно другое. Моя цель в классе заключалась в том, чтобы позволить пользователю динамически создавать то, что они хотели с легкостью. Проблема с этим решением заключается в том, что в конечном итоге это приведет к очень вложенному дереву операторов if и большому количеству дополнительных значений. – Elias
Vba не поддерживает наследование, поэтому вы не можете сделать один базовый класс унаследованным от него количеством настраиваемых классов.Единственный способ, по которому я вижу возможность создания повторно используемого класса без настройки, - передать всю строку запроса методу класса и составить строку запроса в функциях callibg. И/или, как вы упомянули, передайте предложение where в качестве параметра. – Trace
Таким образом, вы все равно можете использовать предоставленный мной код. Метод класса может стандартно предоставить вам весь набор результатов, причем предложение where является необязательным параметром. Таким образом, у вас не будет много условий. – Trace