Delete Group Members Using The Administration Process

Recently, our company is evaluating a 3rd party mail archiving solution. This solution stores mails together with a snapshot of the ACL. (non-Notes) This is a clever solution, because you have Notes security on these archived documents ( client and web ). I do not want to dig too deep into this product, but we found out during evaluation that the â??ACL snapshotâ? feature will get you into trouble when you delegate your mail file.

Imagine a scenario, where User A delegates his mail file to user B. User B has author access (this necessarily includes reader access. ï? ) When the mail archive process starts, it will save the ACL together with the document. If user B retrieves a document from the archive, thereâ??ll be no problem at all.

Now user B quits the company and he /she is replaced by user C. User A modifies the delegation profile according to the new situation.

But what happens, when user C wants to access documents that have been archived, before he / she had access to the mail file?

To make a long story short, this will not work â?¦

To solve the issue, we decided to put a group into each mail file ACL which has the following format: #ARC-FirstNameLastName-READER.
As the name implies, the access level for this group is READER.

When we now send a mail document to the archive, this group is archived as well. (ACL)

Now we can put user C into this group and immediately this user has access to all archived mails of user A.
Keep in mind that regardless of which access level is given to a user by delegation, he needs at least reader access to access documents from within the archive.
Manually adding members to a group or deleting them is not a good idea, because YOU would have to do the work �.

One of the proposals from the vendor of the mail archiving system was to modify the delegation process in Lotus Notes. Not a good idea at all, because you would have to write a completely new CalendarProfile to achive the goal.

The smallest solution is to have the above mentioned group in the ACL (and names.nsf ) and add code to the CalendarProfile to add / remove members to / from the group. This would keep the code provided by IBM intact. In addition to that you can update to a higher version of Notes and Domino and easily add your modifications to the new template.

The basic algorithm is to add all mail delegates to the group and remove a name from this group when the mail file owner revokes access to his database.

HINT: This article is not ment to be a solution which can be copied and pasted. You will not find any source code here. I will only post a few code snippets.

AdminP is a server task for automating administrative tasks in the background on a schedule. The Domino administration process (AdminP) is a server-side mechanism for automating administrative tasks in the background on a specified schedule. Domino’s AdminP supports everything from user renames to file replications.

Starting with version 6 of Lotus Notes and Domino, you can use the NotesAdministrationProcess class to create AdminP request programmatically with Lotus Script.

One of the methods of the NotesAdministrationProcess class is â??AddGroupMembersâ?.
This method adds members (passed as a parameter in the method call) to an existing group or creates the group first when it does not exist and adds the members to the newly created group.

This is a great feature if you want to enable some users in your organization to maintain groups in the names.nsf without giving them any author or editor rights. Exactly what we need.

But, when doing so, how can they delete users from existing groups using AdminP ? You do not find any method like â??RemoveGroupMembersâ? in the NotesAdministrationProcess class.
Since IBM does not provide us with such a function, I had to create it on my own.

Admin4.nsf - view

Bob Balfe of IBM published an article back in 2003 on developerworks ( LINK )

This is a great starting point to write your own AdminP request handlers using the Notes C API.
As described in the article, I created a new form in the admin4.nsf to contain all the fields needed for the new Administration Request.

adminplus request

I saved the compiled nadminplus.exe to the Domino executable directory and started it typing load nadminplus at the server console.

server console with adminplus

You can now create new RemoveGroupMembers request directly in the admin4.nsf or use the following code to create the requests programmatically with Lotus Script.

'/* Put the following code into the declaration section of an action */
'/* or create a new script library to contain the code */
Const DB_ADMIN4 = "admin4.nsf"
Const FLD_FORM = "CustomRequest"
Const FLD_PROXYACTION = "5005" ' RemoveGroupMembers | 5001

Class NotesAdministrationProcessPlus

	Private szServer As String

	Public Sub new (szServerName As String)
		Dim s As New NotesSession
		Dim nn As NotesName
		Set nn = s.CreateName (szServerName)
		szServer = nn.Canonical
	End Sub

	Public Function  RemoveGroupMembers (ListName As String, Members As Variant) As String
		RemoveGroupMembers = ""
		If  (Ubound (members) = 1 And members(0) ="") Or Trim(ListName) = ""  Then
			Exit Function
			Dim s As New NotesSession
			Dim db As New NotesDatabase( szServer, DB_ADMIN4 )
			Dim doc As NotesDocument

			If db.IsOpen Then
				Set doc = db.CreateDocument
				doc.Form = FLD_FORM
				doc.ProxyAction = FLD_PROXYACTION
				doc.ProxyServer = szServer
				doc.ListName = ListName
				doc.Members = Members
				Call doc.ComputeWithForm(False, False)
				Call doc.Sign
				Call doc.Save(False, True)
				RemoveGroupMembers = doc.NoteID

			End If
		End If

	End Function
End Class

To create the request documents, use the following code:

Sub Click(Source As Button)
	Dim noteid As Variant
	Dim members(1) As String
	members(0) = "Hein Bloed/Maus/de"
	' ...

	Dim AdminPP As New NotesAdministrationProcessPlus ("yourserver")
	noteid = AdminPP.RemoveGroupMembers ("yourgroup", members)
	' ...

End Sub

See the code in action:

If you find this function useful and like to try it by yourself, send me an email or leave a comment. I have also posted an idea on Perhaps you can promote the idea if you like it.

The Blogger Awards

“The Blogger Awards recognize the importance of blogging in the Lotus world and celebrates the contribution of bloggers to the Lotus community.
Although we recognize that all bloggers provide a valuable contribution and an important service to the community, this award will go to the blogger who, over time, has provided exceptional information, education and community support through his or her blog in an entertaining (or engrossing) format and style.”

Nominations will be open from November 19 â?? December 17, 2007

Adventskalender 2007

SchneemannDas Jahresende rückt unweigerlich näher. Doch bevor wieder die Sektkorken knallen, steht uns noch die Adventszeit und das Weihnachtsfest bevor.

Damit es an den Tagen vor Weihnachten nicht zu langweilig wird, möchte ich an dieser Stelle auf eine Aktion der Fa. SoftVision hinweisen:

SoftVision-Adventskalender 2007 – Mitmachen und jeden Tag einen anderen Preis gewinnen…

SoftVision versüÃ?t mit super Gewinnen statt mit Schokolade die Vorweihnachtszeit!

Am 1. Dezember geht der virtuelle Adventskalender der SoftVision Development GmbH auf “online”.

Hinter den 24 Türchen verbergen sich Quiz-Fragen zu den Produkten NotesToPaper, n2pdf oder StarOffice PDF Converter und die Möglichkeit, mit der richtigen Antwort den attraktiven Tagespreis zu gewinnen.

…und wer jeden Tag mitmacht erhöht sogar die Chance auf den tollen Hauptgewinn, den das Unternehmen am 24. Dezember verlost.

IBM is contributing composite applications tools to OpenNTF

Please welcome IBM’s Mark Jourdain, Jo Grant and Craig Wolpert to the community.
They have recently posted their first OpenNTF project: The Composite Application Component Library

This NSF contains 22 ready-to-use utility components that you can use in your composite applications in Lotus Notes 8. …

The NSF is based on the Eclipse Update Site (8) template that is supplied with Lotus Notes 8 and can be copied to the local data folder of the Lotus Notes 8 client or on a Lotus Domino 8 server.

[via Ed Brill]

Mail Archivierung – Ein Praxisproblem

Eigentümer einer Maildatei können Zugriffe auf Mails und Kalender über “Werkzeuge – Vorgaben – Zugriff und Delegierung” selbstständig steuern.
Bei der geplanten Archivierung von Mails ergeben sich daraus aber Probleme beim Zugriff auf archivierte Dokumente.

Ein Archivsystem sichert neben den eigentlichen Inhalten der Mail auch die zu diesem Zeitpunkt existierende ACL.


Lt. der abgebildeten ACL darf also neben dem Eigentümer der Maildate auch der Administrator lesend auf die Mails zugreifen und somit auch auf archivierte Mails.
Wird der Zugriff für den Leser Administrator wieder entfernt, so kann er weder auf die Datenbank noch auf Mails zugreifen, die nach diesem Zeitpunkt archiviert wurden. Sehr wohl kann er aber noch über die Archivrecherche auf Mails zugreifen, die vor dem Zeitpunkt der Löschung seines Zugriffs aus der ACL in das Archiv gespeichert wurden.

Die Probleme, die sich daraus ergeben können, sollen hier nicht weiter erläutert werden.

Ein in der Praxis wohl häufiger auftretendes Problem erfordert aber unbedingte AUfmerksamkeit; eine Lösung muss VOR Beginn der Mailarchivierung implementiert werden.

Dabei geht es um folgendes Szenario:

Ein Vorgesetzter delegiert den Zugriff auf seine Mails an eine Assistentin, die namentlich in die ACL eingetragen wird. Ã?ber einen gewissen Zeitraum werden nun Mails mit diesen Zugriffsberechtigungen archiviert.
Die bisherige Assistentin wird dann einem neuen Vorgesetzten zur Seite gestellt, oder vertritt eine Kollegin.

In Variante 1 hat dann die neue Assistentin keinen Zugriff auf die bisher archivierten Mails, weil sie bisher ja keinen Zugriff auf die Datenbank ihres Vorgesetzen hatte.
In Variante 2 kann nicht auf die archivierten Mails der zusätzlichen Datenbank zugegriffen werden, weil es an den nötigen Berechtigungen zum Zeitpunk der Archivierung fehlt.

Lösen lässt sich dieses Dilemma, wenn man in die ACL der Datenbank eine Gruppe einfügt, die auf die Datenbank Lesezugriff hat.

Hier stösst man aber zugleich auf ein weiteres Problem. Alle Einträge, die in der ACL nicht als MANAGER oder ENTWICKLER eingetragen sind, können vom Eigentümer der Datenbank über die Vorgaben geändert werden. Das betrifft sowohl die Art des Zugriffs als auch das Löschen des Eintrags.

Zugriff und Delegierung

Da wir aber der Gruppe keine Berechtigung als Manager geben wollen, müssen wir anderweitig sicherstellen, daÃ? der MailBox Eigentümer die Rechte der Gruppe nicht ändern kann.
Das kann am Einfachsten dadurch erreicht werden, daÃ? die Gruppe für den Eigentümer gar nicht sichtbar ist.

versteckte Gruppe

Mit einem kleinen Eingriff in die Gestaltung der Maildatei kommt man zum Ziel. Bei Einführung einer Mailarchivierung wird man in der Regel sowieso die Maildatei modifizieren müssen; bei der einen Lösung mehr, bei einer anderen weniger.
Die Modifikation zum Verstecken der Gruppe(n) sind so minimal, daÃ? sie im Prinzip nicht ins Gewicht fallen. Trotzdem sollten die Codeänderungen dokumentiert werden. 🙂

In der Script Bibliothek “ACLManagement” wird der Code ab Zeile 578 ( +/- 2 Zeilen ) folgendermaÃ?en geändert


    x = Ubound(Me.ReadMail)
    Me.ReadMail(x) = Me.aclentry.Name
    Redim Preserve Me.ReadMail(x+1)
    Call IsPublicReader()
    Call IsPublicWriter()


    x = Ubound(Me.ReadMail)
    '############## 26.10.2007,Ulrich Krause ################
    If ( Not Instr(Me.aclentry.Name, "#Arc" ) > 0 ) Then
     Me.ReadMail(x) = Me.aclentry.Name
     Redim Preserve Me.ReadMail(x+1)
     Call IsPublicReader()
     Call IsPublicWriter()
   End If

Durch diese einfache Ã?nderung ist es nun möglich, in die ACL der Maildatenbanken Gruppen einzufügen, die mit dem Prefix “#Arc” beginnen. Der Eintrag in das Domino Directory und die Pflege der Gruppenmitglieder erfolgt dann bei Bedarf manuell.
Der Name der Gruppe wird aus dem Prefix und z.B. den Namen des Mail Box Eigentümers gebildet. Damit lässt sich dann der Zugriff datenbankspeziefisch steuern. Eine weitere Gruppe “#ArcDefaultReaders” mit ACLLEVEL_READER kann dann in gleicher Weise zur datenbankübergreifenden Recherche verwendet werden.

Dies ist die aus meiner Sicht einfachste Lösung um sicherzustellen, daÃ? unterschiedliche Personen auf archivierte Mails zugreifen können.