Lotus provides the method QueryAccessRoles of the NotesDatabase class to get the roles of a user and there are no methods to get users belonging to a role, but you can get them by combining IsRoleEnabled of the NotesACLEntry class with the function getUsersByGroup that I wrote in a previous article.
Option Public
Option Declare
Sub Initialize
Dim role As String
Dim users As Variant
role = "[role]"
users = getUsersByRole(role)
ForAll v In users
Print CStr(v)
End ForAll
End Sub
Function getUsersByGroup(groupName As String, usersTempList() As String) As Variant
Static incrementIndex As Integer
Static maxNestedGroup As Integer
Static s As NotesSession
Static db As NotesDatabase
Static dbNames As NotesDatabase
Static vwGroup As NotesView
Static vwPerson As NotesView
Static counter As Integer
Static nestedCounter As Integer
Dim doc As NotesDocument
Dim members As Variant
Dim user As NotesName
Dim userName As String
If (s Is Nothing) Then
Set s = New NotesSession
Set db = s.Currentdatabase
Set dbNames = s.Getdatabase(db.server, "names.nsf")
Set vwGroup = dbNames.Getview("($VIMGroups)")
vwGroup.Autoupdate = False
Set vwPerson = dbNames.Getview("($VIMPeople)")
vwPerson.Autoupdate = False
counter = 0
nestedCounter = 0
incrementIndex = 10
maxNestedGroup = 100
End If
nestedCounter = nestedCounter + 1
Set doc = vwPerson.Getdocumentbykey(groupName, True)
If Not(doc Is Nothing) Then
If (counter>UBound(usersTempList)) Then
ReDim Preserve usersTempList(UBound(usersTempList)+incrementIndex)
End If
Set user = New NotesName(doc.FullName(0))
userName = user.Abbreviated
usersTempList(counter) = userName
counter = counter + 1
Else
Set doc = vwGroup.Getdocumentbykey(groupName, True)
If Not(doc Is Nothing And nestedCounter<maxNestedGroup) Then
members = doc.Getitemvalue("Members")
ForAll v In members
Set user = New NotesName(CStr(v))
userName = user.Abbreviated
Call getUsersByGroup(userName, usersTempList)
End ForAll
End If
End If
If (nestedCounter=1 And UBound(usersTempList)>1) Then
getUsersByGroup = FullTrim(ArrayUnique(usersTempList))
End If
nestedCounter= nestedCounter - 1
End Function
Function getUsersByRole(role As String) As Variant
dim s As NotesSession
dim db As NotesDatabase
dim acl As NotesACL
Dim aclEntry As NotesACLEntry
ReDim usersTempList(10) As String
Dim users As Variant
Set s = New NotesSession
Set db = s.Currentdatabase
Set acl = db.Acl
Set aclEntry = acl.Getfirstentry()
While Not(aclEntry Is Nothing)
If (aclEntry.Isroleenabled(role)) Then
users = getUsersByGroup(aclEntry.Name, usersTempList)
End If
Set aclEntry = acl.Getnextentry(aclEntry)
Wend
getUsersByRole = users
End Function

Leave a Reply