This function will give you a list of all roles a user is in, even if the user is in nested groups which are listed in the ACL.
' Roles(UserName$) : ' It checks for roles of UserName$ (could be both abbreviate or hierarchical) in current database ' If no exact ACL found it checks all group recursively ' If UserName$ is member of two or more groups it returns the roles of all of them ' If nothing found, it returns "-Default-" roles ' It doesn't check duplicate roles (but this is not a problem) ' Return value: array of roles (strings) ' ' IsaMemberOf(UserName$, GroupName$) : ' Check if UserName$ is a member of GroupName$ ' It searchs group recursively ' It searchs first public address book ' Return value: boolean ' ' NameSimple$(Name$) : ' Just acts like formula @Name( [Abbreviate] ; Name ) ' Return value: string ' ' Marco Beri ' marcob@equalis.it Function Roles(UserName$) As Variant Dim AllRoles As Variant Dim session As New NotesSession Dim db As NotesDatabase Dim acl As NotesACL Dim entry As NotesACLEntry Dim FirstGroupFound% Set db = session.CurrentDatabase Set acl = db.ACL Set entry = acl.GetEntry( UserName$ ) If entry Is Nothing Then Set entry = acl.GetEntry( NameSimple$(UserName$) ) End If If Not entry Is Nothing Then AllRoles = entry.Roles Else Set entry = acl.GetFirstEntry Do While Not entry Is Nothing 'Default roles (survives only if no other found) If Trim$(Ucase$(entry.name)) = Ucase$("-Default-") Then AllRoles = entry.roles Else If IsaMemberOf(UserName$, entry.name) Then If FirstGroupFound% Then Redim Preserve AllRoles(Ubound(AllRoles)+Ubound(entry.roles)+1) For Cont%=0 To Ubound(entry.roles) AllRoles(Ubound(AllRoles)-Cont%) = entry.roles(Cont%) Next Else FirstGroupFound% =True AllRoles=entry.roles End If End If End If Set entry = acl.GetNextEntry( entry ) Loop End If Roles = AllRoles End Function Function IsaMemberOf(UserName$, GroupName$) On Error Goto IsaMemberOfError Dim doc As NotesDocument Static ViewGroup As NotesView If (ViewGroup Is Nothing) Then Dim PublicBook As Variant Dim session As New NotesSession Set PublicBook=Nothing Forall Book In session.AddressBooks If (Book.IsPublicAddressBook) Then Set PublicBook=Book Exit Forall End If End Forall If PublicBook Is Nothing Then Forall Book In session.AddressBooks Set PublicBook=Book Exit Forall End Forall End If If Not (PublicBook Is Nothing) Then Call PublicBook.Open("", "") Set ViewGroup=PublicBook.GetView("Groups") If ViewGroup Is Nothing Then Messagebox "No group view found" End If Else Messagebox "No address book found" Exit Function End If End If Set doc=ViewGroup.GetDocumentByKey(GroupName$) If doc Is Nothing Then IsaMemberOf = False Else If Not (doc Is Nothing) Then Forall Member In doc.Members If Trim$(Ucase$(Member)) = Trim$(Ucase$(UserName$)) Or Trim$(Ucase$(Member)) = Trim$(Ucase$(NameSimple(UserName$))) Then IsaMemberOf = True Exit Forall Else If IsaMemberOf(UserName$, Cstr(Member)) Then IsaMemberOf = True Exit Forall End If End If End Forall End If End If Exit Function IsaMemberOfError: Messagebox "IsaMemberOf"+Str$(Err)+": "+Error$ Exit Function End Function Function NameSimple$(Byval NameToConvert$) Dim InstrUguale%,Cont%,NameResto$ Do InstrUguale%=Instr(NameToConvert$,"=") If InstrUguale%=0 Then Exit Do End If NameResto$=Mid$(NameToConvert$,InstrUguale%+1) For Cont%=InstrUguale%-1 To 0 Step -1 If Cont%=0 Then NameToConvert$="" Elseif Mid$(NameToConvert$,Cont%,1)="/" Then NameToConvert$=Left$(NameToConvert$,Cont%) Exit For End If Next NameToConvert$=NameToConvert$+NameResto$ Loop NameSimple$=NameToConvert$ End Function
An alternative way of doing this is to use the Evaluate of doing this (providing you aren't using early versions of Notes 4.x which leaked memory each time Evaluate was called):
Dim UserRoles As Variant UserRoles = Evaluate("@UserRoles")