As a follow-up to my previous tool that let you analyze the ACL of a database, I built another tool for my admin. For different reasons, we need to keep the mailbox of terminated users, sometimes for a shorter time but sometimes for long periods of time. As far as I understand it, if a traditional approach was used to remove a user from the system, the mail file would also be deleted. So the admin put the terminated user in the Deny Access group and change the ACL of the mailfile to include a manager, supervisor or replacement.
But because of this process, AdminP will not remove the terminated user from all the groups he/she is listed in. When you have hundreds of groups, many of them nested, this could be a real headache. So I was asked to build something simple that allows us to remove one or more specified users from all groups in the Domino Directory. Below is the result. Enjoy!
Update: I tweaked the code slightly, to avoid three separate calls to GetItemValue() and to make a line shorter. The modified code is in the end, where I update the deletelog list.
First I created a form with 3 fields:
‘SaveOptions’ has a default value of “0” (to prevent the form from being saved).
‘Users’ is a Names field, getting it’s values using the addresses dialog. The field is multi-value and using New Line as separator.
‘LogResult’ is a multi-value text field, again with New Line as separator.
Finally I added a button to the action bar to remove the user(s). The Lotusscript code is listed below. It is using my class for mail notifications that I blogged about in November, to send a confirmation to the user running the agent. This is useful for example when you need to log all data changes done to a system.
Use "Class.MailNotification" Sub Click(Source As Button) Dim ws As New NotesUIWorkspace Dim uidoc As NotesUIDocument Dim session As New NotesSession Dim nab As NotesDatabase Dim view As NotesView Dim doc As NotesDocument Dim members As Variant Dim newmembers List As String Dim delmembers List As String Dim users As Variant Dim userlist List As String Dim user As NotesName Dim nmcnt As Integer Dim newarray() As String Dim ret As Integer Dim removelog List As String Dim userarr As Variant Dim mail As NotesMail Dim mailtext As String Dim listname as String Dim updated As Boolean ' *** Make sure the operator is sure ret = Msgbox("Are you sure?",4+32+256,"WARNING") If ret = 7 Then Exit Sub End If ' *** Get a list of users in field 'Users' Set uidoc = ws.CurrentDocument users = Split(uidoc.FieldGetText("Users"),Chr$(13)) Forall u In users Set user = New NotesName(u) userlist(Fulltrim(user.Common)) = Fulltrim(user.Common) End Forall ' *** Get all groups in NAB and process them one by one Set nab = New NotesDatabase(session.CurrentDatabase.Server,"names.nsf") Set view = nab.GetView("Groups") Set doc = view.GetFirstDocument Do While Not doc Is Nothing Print "Processing " & doc.GetItemValue("Listname")(0) Erase newmembers Erase delmembers updated = False ' *** Get members in the group and create a list of the ones to keep members = doc.GetItemValue("Members") nmcnt = 0 Forall m In members Set user = New NotesName(m) If Iselement(userlist(Fulltrim(user.Common))) = False Then ' User is not among the ones to delete newmembers(Fulltrim(user.Common)) = Fulltrim(m) nmcnt = nmcnt + 1 Else delmembers(Fulltrim(user.Common)) = Fulltrim(m) updated = True End If End Forall ' *** Build array of members to keep Redim newarray(nmcnt) As String nmcnt = 0 Forall nm In newmembers newarray(nmcnt) = nm nmcnt = nmcnt + 1 End Forall ' *** Write array of new members back to document and save it If updated = True Then Call doc.ReplaceItemValue("Members", Fulltrim(newarray)) Call doc.Save(True,False) listname = doc.GetItemValue("Listname")(0) Print "Updating " & listname End If Forall dm In delmembers removelog(listname) = removelog(listname) & dm & ";" End Forall Set doc = view.GetNextDocument(doc) Loop ' *** We are all done mailtext = "" Forall rl In removelog Call uidoc.FieldAppendText("LogResult", "Group '" & Listtag(rl) & "':" & Chr$(10)) mailtext = mailtext & "Group '" & Listtag(rl) & "':" & Chr$(10) userarr = Split(Cstr(rl),";") Forall u In userarr Set user = New NotesName(u) Call uidoc.FieldAppendText("LogResult", user.Common & Chr$(10)) mailtext = mailtext & user.Common & Chr$(10) End Forall ' Call uidoc.FieldAppendText("LogResult", Chr$(10)) End Forall Set mail = New NotesMail() mail.MailTo = session.CommonUserName mail.Subject = "[Notification] - Users removed from NAB" Call mail.AppendText(mailtext) mail.Principal = "IT Programs" Call mail.Send() Msgbox "Done removing specified user(s) from Domino Directory.",64,"Finished" End Sub