我有一些代码用于获取用户的管理员 - 我最初为SharePoint网站编写代码但最近被要求使用VBA编写代码。
Const SearchField = "DisplayName"
Const ReturnField = "manager"
Public Function MLookup(ByVal SearchString As String) As String
Application.ScreenUpdating = False
Dim strDomain
strDomain = GetObject("LDAP://rootDSE").Get("defaultNamingContext")
Dim objConnection As ADODB.Connection
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"
Dim objCommand As ADODB.Command
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
"<LDAP://" & strDomain & ">;(&(objectCategory=User)" & _
"(" & SearchField & "=" & SearchString & "));" & SearchField & "," & ReturnField & ";subtree"
Dim objRecordSet As ADODB.Recordset
Set objRecordSet = objCommand.Execute
If objRecordSet.RecordCount = 0 Then
MLookup = "Not Found"
Else
objMngr = objRecordSet.Fields(ReturnField)
objMngr = Mid(objMngr, 4, InStr(1, objMngr, ",OU"))
objMngr = Replace(objMngr, "\,", ",")
objMngr = Left(objMngr, Len(objMngr) - 12)
MLookup = Trim(objMngr)
End If
objConnection.Close
Set objRecordSet = Nothing
Set objCommand = Nothing
Set objConnection = Nothing
Application.ScreenUpdating = True
End Function
这段代码运行正常 - 运行有点慢,因为我在家工作但是它完成了工作。我现在遇到了困难。 manager字段返回管理器上的用户字符串,但是sting是使用Distinguised Name构建的 - 对于女士来说,这意味着他们的婚前姓名。这些数据在报告中使用,并且已经惹恼了一些羽毛,因为数据看起来不正确。我想知道的是,是否有办法将管理器的返回字符串修改为该人的显示名称,而不是从管理器字段中解析出该名称?或者是我唯一的解决方案来创建一个返回显示名称的第二个函数(这会使我的响应时间加倍,并且可能会记录5000个可能过多的记录)?
答案 0 :(得分:1)
简单(唯一)的答案是否定的。 manager字段(以及其他LDAP对象引用字段,例如member
个对象的多值group
属性)仅包含distinguishedName,因为这是在LDAP中标识对象的方式。但是,出于同样的原因,distinguishedName的查找速度应该非常快。
没有测试我无法确定,但它可能有助于整个过程的速度为所有查询使用相同的命令和连接对象,而不是为每个实例重新创建它们。在保持方法分离的同时执行此操作的方法是对方法采用可选连接和/或命令参数。
最后,假设许多人拥有相同的经理,您可以使用Dictionary
缓存每位经理的显示名称,因此您只需为每位经理查找一次显示名称。