- How to add holidays to the Exchange calendar with PowerShell - Wed, Apr 23 2014
- How to change the domain name in Exchange Server 2010 - Tue, Apr 8 2014
- How to enable Unsolicited Remote Assistance in Windows 7 / 8 - Tue, Oct 1 2013
If these are all populated and kept updated with information changes, we can easily automatically generate an 'always-current' phone directory with a little bit of scripting.
The first thing you'll want to decide upon, is exactly what data/attributes you'd like to list in the directory. In my example, I'll be listing givenName, sn, title, mail, telephonenumber, mobile and sAMAccountName. We can use any attributes from an Active Directory user object – You can view these by starting the 'Active Directory Users & Computers' MMC, ensuring 'Advanced Features' is enabled on the view menu, then opening the properties windows for a user, and moving to the attribute editor tab – You will then be able to see each attribute, and its value.
Active Directory user attributes
The next step is to find a web server on your network running IIS (It is possible to do it via Apache/PHP on Linux connecting via LDAP, but this example is using Classic ASP and VBScript.)
We will need to ensure that the role feature of 'ASP' is installed on your server – otherwise IIS will give us a MIME error instead of loading our page.
ASP role feature
Create a new file in your web server’s root folder (Usually C:\Inetpub\wwwroot), called directory.asp, with the following content:
<%@ Language=VBScript %> <% response.Buffer = True %> <html><head> <title>Company directory</title> </head> <body> <h1>Company Directory</h1> <% ' Define the AD OU that contains our users usersOU = "LDAP://OU=Users,DC=Domain,DC=local" ' Make AD connection and run query Set objCon = Server.CreateObject("ADODB.Connection") objCon.provider ="ADsDSOObject" objCon.Properties("User ID") = "DOMAIN\user" objCon.Properties("Password") = "Pa$5w0rD!" objCon.Properties("Encrypt Password") = TRUE objCon.open "Active Directory Provider" Set objCom = CreateObject("ADODB.Command") Set objCom.ActiveConnection = objCon objCom.CommandText ="select givenName,sn,title,mail,telephonenumber,mobile,sAMAccountName FROM '"+ usersOU +"' where sAMAccountname='*' ORDER by sAMAccountname" Set objRS = objCom.Execute ' Loop over returned recordset and output HTML Response.Write "<table>" + vbCrLf Do While Not objRS.EOF Or objRS.BOF Response.Write " <tr>" Response.Write "<td>" + objRS("givenName") + "</td>" Response.Write "<td>" + objRS("sn") + "</td>" Response.Write "<td>" + objRS("title") + "</td>" Response.Write "<td>" + objRS("mail") + "</td>" Response.Write "<td>" + objRS("telephonenumber") + "</td>" Response.Write "<td>" + objRS("mobile") + "</td>" Response.Write "<td>" + objRS("sAMAccountName") + "</td>" Response.Write "</tr>" + vbCrLf objRS.MoveNext Response.Flush Loop Response.Write "</table>" ' Clean up objRS.Close objCon.Close Set objRS = Nothing Set objCon = Nothing Set objCom = Nothing %> </body> </html>
There are a few parts in the above code that will need editing to suit your environment, these being the OU containing your users on line 10, then a username and password with read access to AD on lines 14 & 15.
You can also change the attributes I have decided to use – this will need doing in two places, firstly on the Active Directory query on line 25, then again in the HTML output section in lines 33-39.
The HTML I have used is very basic, but if you've got some artistic flare or have some web designers in your company, I'm sure you'll be able to create something that not only functions well, but looks great too!
I've used Classic ASP for my example, as we can do everything quickly in one file without worrying about Visual Studio. However, if you're comfortable with Visual Studio and ASP.NET, you can achieve the same result using the System.DirectoryServices classes.