If you manage people in your organization, either as a leader or a project manager, the Microsoft Active Directory (AD) is a gold mine of valuable information open to anyone inside the corporate network.
Active Directory (AD) is a directory service for Windows domain networks. It was original designed to keep track of computers and printers in the corporate office network, but it is also used for storing and managing users of the network. It is the user administration functionality that we will explore in this article.
Active Directory structures are arrangements of information about objects. The objects fall into two broad categories: resources (e.g. printers) and security principals (user or computer accounts and groups). Each object represents a single entity – whether a user, a computer, a printer, or a group – and its attributes.

You can extract the full name, employee number, picture, e-mail, phone number(s), office address, title, and much more for an employee in your organization. After I realized that this information is easily available, I have saved a lot of time creating stakeholder overviews, resource plans, and project plans. Extracting information from the AD is a great way of building your own dynamic contacts list in Excel instead of being dependent on Outlook. So when any of your team members changes their office address or phone number, you can just refresh all information with a single click.
Sounds great, right?
In Excel we can create our own queries to extract employee information based on the employee number or the e-mail address. However, if you build your searches based on the e-mail address, I’ve seen that the e-mail address is a scarce resource and they are often re-used if someone quit the company. In some cases, I’ve notices that the AD query might return both the expired (former employees) and the new information (current employee) – so it is a good idea to check the employee ID to ensure that you read the most recent data. When an employee has left the company, the employee number is cleared.
Query
To query data from Active Directory we will use the Lightweight Directory Access Protocol (LDAP). LDAP is an open protocol for accessing directory information over a computer network. In the below example we will read the following fields:
- Employee ID (LDAP: employeeid)
- Name (LDAP: name)
- Title (LDAP: title)
- Department (LDAP: department)
- Office Location (LDAP: physicaldeliveryofficename)
Other fields that might be usefull when creating a Contact list:
- Display Name (LDAP: displayname)
- Mobile Phone number (LDAP: mobile)
- E-mail address (LDAP: mail)
- Account Name (LDAP: samaccountname)
- First name (LDAP: givenName)
- Surname (LDAP: sn)
- Company: (LDAP: company)
- User Group (LDAP: usergroup)
For a more complete list of LDAP attributes you can read from AD, please have a look at
Code
In the below example we are not going to show you all the code needed to create your own contacts list in Excel VBA, but I hope it is enough to get you started.
Option Explicit
' Update Employee Information
Public Sub UpdateEmployeeInformation(ByVal strUserId As String)
Dim objLdap As Object
Dim strLdapDomain As String
Dim objLdapConnection As Object
Dim objLdapCommand As Object
Dim objLdapRecordSet As Object
Dim objEmployeeName As Variant
Dim objEmployeeNumber As Variant
Dim objTitle As Variant
Dim objDepartment As Variant
Dim objWorkspace As Variant
' Connect to ActiveDirectory (AD) using LDAP.
On Error Resume Next
Set objLdap = GetObject("LDAP://rootDSE")
On Error GoTo 0
' Was able to connect to Active Directory?
If (objLdap Is Nothing) Then
' Error
Err.Raise 345, Description:="Unable to connect to Active Directory (AD) using LDAP!"
Exit Sub
End If
' Get the domain string from LDAP
strLdapDomain = objLdap.Get("defaultNamingContext")
' Valid domain?
If (Trim(strLdapDomain) = "") Then
' Error
Err.Raise 345, Description:="Unable to get the current domain using LDAP!"
Exit Sub
End If
' Free LDAP.
' The above statements were used to get the LDAP Domain name
' which will be used below.
Set objLdap = Nothing
' 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(strLdapDomain) & ">;" & _
"(&(objectCategory=User)" & _
"(mailNickName=" & Trim(strUserId) & "));" & _
"name,employeeid,title,department,physicaldeliveryofficename;" & _
"subtree"
End With
' Execute LDAP query
Set objLdapRecordSet = objLdapCommand.Execute
' Found the user?
If (objLdapRecordSet.BOF Or objLdapRecordSet.EOF) Then
' Information
Call MsgBox("The user with id '" & strUserId & "' does not exist!", vbExclamation, "Missing User")
Else
' Multiple users might have the same short name.
' This is because the username is re-used when a consultant
' leaves the company.
' Old users won't have an employee number.
' Walk through all users
Do While (Not objLdapRecordSet.EOF)
' Get the employee number
objEmployeeNumber = objLdapRecordSet.Fields("employeeid")
' Valid employee number?
If (objEmployeeNumber <> vbNull) Then
' Is number?
If (IsNumeric(objEmployeeNumber)) Then
' Set the value
' [Your Code] = CLng(objEmployeeNumber)
Else
' Error
' [Your Code] = ""
End If
' Get the employee name
objEmployeeName = objLdapRecordSet.Fields("name")
' Valid employee name
If (objEmployeeName <> vbNull) Then
' Set the value
' [Your Code] = Trim(CStr(objEmployeeName))
Else
' Error
' [Your Code] = ""
End If
' Title
objTitle = objLdapRecordSet.Fields("title")
' Valid title?
If (objTitle <> vbNull) Then
' Set the title
' [Your Code] = Trim(CStr(objTitle))
Else
' Clear the title
' [Your Code] = ""
End If
' Department
objDepartment = objLdapRecordSet.Fields("department")
' Valid department?
If (objDepartment <> vbNull) Then
' Set the department
' [Your Code] = Trim(CStr(objDepartment))
Else
' Clear the department
' [Your Code] = ""
End If
' Workspace
objWorkspace = objLdapRecordSet.Fields("physicaldeliveryofficename")
' Valid workspace?
If (objWorkspace <> vbNull) Then
' Set the workspace
' [Your Code] = Trim(CStr(objWorkspace))
Else
' Clear the workspace
' [Your Code] = ""
End If
' We found the latest item we were looking for,
' so Exit loop
Exit Do
End If
' Next record
Call objLdapRecordSet.MoveNext
Loop
' Valid recordset?
If (Not objLdapRecordSet Is Nothing) Then
' Close
Call objLdapRecordSet.Close
' Free memory
Set objLdapRecordSet = Nothing
End If
End If
' Free memory
Set objLdapCommand = Nothing
End Sub
In the above example we’re assuming that your computer is connected to the corporate network either by LAN or WiFi, or over VPN. If you’re not connected to an AD, an error will be raised.
In the example the user id (strUserId) is the user’s short name, i.e. the username specified in the e-mail address. If for example the user John Smith has the username “js” and the e-mail address js@somecompany.com, then “js” should be specified as the input parameter. You can also use other conditions to find one or several users in the Active Directory.
