Active Directory queries from C/AL

I wanted to get a list of all NAV users with displayname and roles per user in a report. The data base is table “Windows Access Control”. One field should show the displayname of each user. The displayname can be read from hidden table “Windows Object”, field Name. To embed that value in the report i tried to import the field with different methods: by code and by a second, linked dataitem in the report. The result was the same in both cases: the read call (internally an AD query) of the displayname (field Name) is really very, very slow! Although AD queries are quite slow in general (the technique behind is slow), this simple report lasted over 20 minutes and longer. That is not slow, that is really a hoax. Maybe that’s a bug in Nav 2009, maybe the implementation is not very good. So i searched for an alternative solution.

In the end i developed a little automation dll to get the displayname of each user with a given domain account (field “Login ID”). With that automation the report rendering speed was quite acceptable.

This automation, i called it ActiveDirectoryLib, delivers 2 methods:
* GetDisplayName(string userName) : string
* GetUserName(string loginSID) : string

// the displayed report fields
Login SID | Username | Role ID | Role Name

// global variables
Username | Text | 100
adLib | Automation | 'ActiveDirectoryLib'.AccountInfo

// the code
Windows Access Control - OnPreDataItem()

Windows Access Control - OnAfterGetRecord()
CALCFIELDS("Login ID","Role Name");
Username := adLib.GetDisplayName("Login ID");
IF Username = '' THEN
  Username := "Login ID";

Windows Access Control - OnPostDataItem()

You can download the file here.