Excel Add-on for querying Active Directory
Below are some utility VBA functions that query user information from active directory. These can be added to an .xla
file, and loaded as an Excel add-on. This will provide excel functions like ADUserProperty
, managerOf
, emailOf
etc. The only down side is that each function call is a blocking network operation, so flash-filling them for large number of rows might cause excel to freeze for some time.
Option Explicit Public Function getADDomain() As String Dim objLdap As Object Dim strLdapDomain As String On Error Resume Next Set objLdap = GetObject("LDAP://rootDSE") On Error GoTo 0 If (objLdap Is Nothing) Then Exit Function End If strLdapDomain = objLdap.Get("defaultNamingContext") If (Trim(strLdapDomain) = "") Then Exit Function Else getADDomain = strLdapDomain End If End Function Public Function ADUserProperty(ByVal strUserId As String, ByVal adField As String, Optional ByVal domainStr As String = "DEFAULT_DOMAIN") As String Dim objLdapConnection As Object Dim objLdapCommand As Object Dim objLdapRecordSet As Object Dim objField As Variant ' Connect to ActiveDirectory using ADODB Set objLdapConnection = CreateObject("ADODB.Connection") Call objLdapConnection.Open("Provider=ADsDSOObject;") ' Create command to queryActiveDirectory using LDAP Set objLdapCommand = CreateObject("ADODB.Command") ' Set the query properties With objLdapCommand ' Set the connection .ActiveConnection = objLdapConnection ' Search the AD recursively, starting at the root of the domain .CommandText = "<LDAP://" & Trim(domainStr) & ">;" & _ "(&(objectCategory=User)" & _ "(|(sAMAccountName=" & Trim(strUserId) & ")" & _ "(distinguishedName=" & Trim(strUserId) & ")" & _ "(displayName=" & Trim(strUserId) & ")" & _ "(cn=" & Trim(strUserId) & ")" & _ "(mail=" & Trim(strUserId) & ")));" & _ Trim(adField) & ";subtree" End With ' Execute LDAP query Set objLdapRecordSet = objLdapCommand.Execute If (objLdapRecordSet.BOF Or objLdapRecordSet.EOF) Then ADUserProperty = "0" Exit Function Else ' Walk through all users Do While (Not objLdapRecordSet.EOF) objField = objLdapRecordSet.Fields(Trim(adField)) If (Trim(adField) = "description") Then ADUserProperty = Join(VariantArrayToStringArray(objField)) ElseIf (objField <> vbNull) Then ADUserProperty = objField End If ' Next record Call objLdapRecordSet.MoveNext Loop If (Not objLdapRecordSet Is Nothing) Then Call objLdapRecordSet.Close Set objLdapRecordSet = Nothing End If End If Set objLdapCommand = Nothing End Function Public Function managerOf(ByVal strUserId As String, Optional ByVal domainStr As String = "DEFAULT_DOMAIN") As String Dim managerDN As String managerDN = ADUserProperty(strUserId, "manager", domainStr) If (managerDN = "0") Then managerOf = "0" Else managerOf = ADUserProperty(managerDN, "cn", domainStr) End If End Function Public Function managerEmailOf(ByVal strUserId As String, Optional ByVal domainStr As String = "DEFAULT_DOMAIN") As String Dim managerDN As String managerDN = ADUserProperty(strUserId, "manager", domainStr) If (managerDN = "0") Then managerEmailOf = "0" Else managerEmailOf = ADUserProperty(managerDN, "mail", domainStr) End If End Function Public Function emailOf(ByVal strUserId As String, Optional ByVal domainStr As String = "DEFAULT_DOMAIN") As String emailOf = ADUserProperty(strUserId, "mail", domainStr) End Function Public Function descriptionOf(ByVal strUserId As String, Optional ByVal domainStr As String = "DEFAULT_DOMAIN") As String descriptionOf = ADUserProperty(strUserId, "description", domainStr) End Function ' Array Variant to String Public Function VariantArrayToStringArray(ByVal arrVariants As Variant) As String() Dim arrStrings() As String ' Get the string array Call ParamArrayToStringArray(arrVariants, arrStrings) ' Get the string array VariantArrayToStringArray = arrStrings End Function ' Array Variant to String Public Sub ParamArrayToStringArray(ByVal arrVariants As Variant, ByRef arrStrings() As String) Dim intLength As Integer ' Handle the array Call ParamArrayToStringArrayInternal(arrVariants, arrStrings, intLength) End Sub '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Array Variant to String Private Sub ParamArrayToStringArrayInternal(ByVal arrVariants As Variant, ByRef arrStrings() As String, ByRef intLength As Integer) ' Parameter is array? If (IsArray(arrVariants)) Then Dim i As Integer Dim objValue As Variant ' Walk through the specified partner objects For i = LBound(arrVariants) To UBound(arrVariants) Step 1 ' Get the value objValue = arrVariants(i) ' Array to string Call ParamArrayToStringArrayInternal(objValue, arrStrings, intLength) Next Else ' Next item intLength = intLength + 1 ' Expand array ReDim Preserve arrStrings(1 To intLength) ' Set the value arrStrings(intLength) = CStr(arrVariants) End If End Sub ' String Array ' Convert ParamArray to String array Public Function StringArray(ParamArray arrValues() As Variant) As String() ' Get the string array StringArray = VariantArrayToStringArray(arrValues) End Function