HCL Notes (formerly IBM Notes) provides access to ACL through a pretty useful dialog window under Notes Client. The authorized user can perform several actions like viewing existing database users, their access levels and assigned roles. They can add and remove users and grant rights and roles to them as per the requirements.
Viewing and taking actions through this window is quite handy and serves a lot of purposes but there are times when the management requires the report for all users with their access levels, rights and roles for one or more databases in a text file or preferably in a Microsoft Excel sheet.
Following simple but useful code provides the same feature in, somewhat comprehensive manner.
The function below is a generic function which, when provided with a Notes Database, extracts all users, their access rights and roles from that database and returns the information in the form of an array (namesList). Most of the code is self-explanatory for the regular lotus script users. Note that we are interested in the ACL entries that are of type ‘Person’, not a server or a group.
Here’s the function.
Function getUsersByDB(db As NotesDatabase) As Variant ''Gets all users from the ACL of the specified database with their access levels and roles. Dim session As New NotesSession Dim acl As NotesACL Dim aclEntryDb As NotesACLEntry Dim userType As Integer Dim namesList() As Variant Dim currUserNdx As Integer Dim aclLevel As Integer Dim aclLevelName As String Dim personNotesName As NotesName Dim roleNames As String Dim FirstTime As Boolean Set acl = db.acl Set aclEntryDb = acl.GetFirstEntry roleNames = "" currUserNdx = -1 While Not aclEntryDb Is Nothing roleName = "" Set personNotesName = session.createName( aclEntryDb.Name) userType = aclEntryDb.Usertype If userType=1 Then ''Person only aclLevel = aclEntryDb.Level Select Case Cstr(aclLevel) Case "0" : aclLevelName = "No Accees" Case "1" : aclLevelName = "Depositor" Case "2" : aclLevelName = "Reader" Case "3" : aclLevelName = "Author" Case "4" : aclLevelName = "Editor" Case "5" : aclLevelName = "Designer" Case "6" : aclLevelName = "Manager" End Select FirstTime = True Forall role In aclentryDb.Roles If FirstTime Then roleNames = role FirstTime = False Else roleNames = roleNames & ";" & role End If End Forall If Trim(roleNames) <> "" Then roleNames = "," & roleNames End If currUserNdx = currUserNdx + 1 Redim Preserve namesList(currUserNdx) As Variant namesList(currUserNdx) = personNotesName.Abbreviated & "," & aclLevelName & roleNames End If Set aclEntryDb = acl.GetNextEntry(aclEntryDb) Wend getUsersByDB = namesList End Function
And here’s the code which invokes the above function, receives the information (UsersList) and writes that information in the format of a comma-separated values (CSV) in a text file. This file can then be opened as MS Excel document to prepare in a more presentable form. Note that you have to tell Excel a couple of things to “understand” the data layout, like the data is tab-delimited.
Dim workspace As New NotesUIWorkspace Dim session As New NotesSession Dim uidoc As NotesUIDocument ''source document Dim ACLRole As String Dim UsersList As Variant Dim arr As Variant Dim db As NotesDatabase Set db = session.CurrentDatabase Set uidoc = workspace.CurrentDocument UsersList = getUsersByDB(db) 'Print Ubound(UsersList) FileNum% = Freefile() FileName = "D:\ACL.txt" Open FileName For Output As FileNum% For I = 0 To Ubound(UsersList) Print #FileNum%, UsersList(I) & Chr(10) Next Close FileNum%