2013-10-22 56 views
0

我有一些代碼用於獲取用戶的管理器 - 我最初編寫了SharePoint網站的代碼,但最近被要求使用VBA編寫代碼。返回LDAP管理器的displayName

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 

此代碼工作正常 - 運行速度有點慢,因爲我在家工作但它完成了工作。儘管我現在遇到了麻煩。經理字段返回經理上的用戶字符串,但是刺痛是使用專有名稱構建的 - 對於女士來說,這意味着他們的孃家姓。這些數據在報告中使用,並且由於數據在他們看來是不正確的,所以有些羽化。我想知道的是,是否有辦法將管理器的返回字符串修改爲該人員的顯示名稱,而不是將該名稱解析爲經理字段?或者是我唯一的解決方案來創建第二個返回顯示名稱的函數(這會使我的響應時間增加一倍,並且可能會超過5000條記錄)?

回答

1

簡單的(也是唯一的)答案是否定的。管理員字段(以及其他LDAP對象引用字段,例如group對象的多值member屬性)僅包含distinguishedName,因爲這是LDAP中標識對象的方式。但是,由於相同的原因,由distinguishedName進行的查找應該非常快速。

未經測試,我無法確定,但它可以幫助您的整個過程對所有查詢使用相同的命令和連接對象,而不是爲每個實例重新創建它們。在保持方法分離的同時,做到這一點的一種方法是將可選的連接和/或命令參數提供給方法。

最後,假設很多人會擁有相同的管理者,您可以使用Dictionary緩存每位經理的顯示名稱,因此您只需爲每位經理查詢一次顯示名稱。

+0

謝謝 - 這是一些很好的建議。我的代碼目前被編寫成用作Excel單元格中的等式,並且只有在運行報表的人願意更改時纔會更改。 – AxGryndr