Das war mal wieder ein ganz mysteriöser Fehler: Im Domino Administrator
unter dem Reiter Dateien eine Datenbank ausgewählt, im Rechtsklick-Kontextmenü
"Signieren..." und im folgenden Dialog "ID des aktiven Servers"
gewählt. Sofort kommt eine Dialogbox mit der Fehlermeldung "Sie sind
zur Durchführung dieser Operation nicht berechtigt." (You are not
authorized to perform that operation).
Kurze Recherche und viel Überprüfen
der aktuellen Einstellungen:
- Aktueller Benutzer muss Administrator
auf dem Server sein (Server-Dokument, Sicherheit-Reiter): gecheckt.
Er hat sogar das Recht für Administration mit voller Berechtigung - und selbst wenn diese aktiviert ist, kommt der Fehler. - Er muss mindestens Autor sein auf der Datenbank admin4.nsf (Administrationsanforderungen) und Dokumente erstellen können: gecheckt, sogar Manager mit allen Rechten.
- Er ist Manager auf der zu signierenden Datenbank
- Er kann die Gestaltung der Datenbank mit seiner ID problemlos signieren.
Als Entwickler im Herzen probiere ich es über einen Agenten, den ich in der
zu signierenden Datenbank erstelle:
Option Public
Option Declare
Sub Initialize
'/**
'* signs this database by manually creating a request with NotesAdministrationProcess.
'*
'* @author Thomas Bahn <tbahn@assono.de>
'* @version 2014-07-03
'*/
Dim uiws As New NotesUIWorkspace
Dim session As NotesSession
Dim currentDB As NotesDatabase
Dim adminDB As NotesDatabase
Dim adminP As NotesAdministrationProcess
Dim noteID As String
Set uiws = New NotesUIWorkspace
Set session = New NotesSession
Set currentDB = session.CurrentDatabase
Set adminDB = New NotesDatabase(currentDB.Server, "admin4.nsf")
Set adminP = session.CreateAdministrationProcess(currentDB.Server)
noteID = adminP.SignDatabaseWithServerID(currentDB.Server, currentDB.FilePath,False)
If noteID <> "" Then
Call uiws.EditDocument(False,adminDB.GetDocumentByID(noteID))
End If
End Sub
Ich nenne ihn "Datenbank per Administration
Request signieren lassen via AdminP-Objekt" (SignDatabaseAdminPViaAdminPObject),
- Auslöser: Durch Ereignis - Auswahl im Menü 'Aktionen'
- Ziel: Keine
- Sicherheitsstufe zur Laufzeit: 2. Beschränkte Operationen zulassen
Es kommt in der Zeile mit "adminP.SignDatabaseWithServerID" der gleiche Fehler wie im Admin-Client. Noch gebe ich mich nicht geschlagen, ein anderer Weg, ein anderer Agent:
Option Public
Option Declare
Sub Initialize
'/**
' * signs this database by manually creating a request document in the admin4.nsf.
' *
' * @author Thomas Bahn <tbahn@assono.de>
' * @version 2014-07-03
' */
Dim session As NotesSession
Dim currentDB As NotesDatabase
Dim adminDB As NotesDatabase
Dim requestDoc As NotesDocument
Set session = New NotesSession
Set currentDB = session.CurrentDatabase
Set adminDB = New NotesDatabase(currentDB.Server, "admin4.nsf")
Set requestDoc = adminDB.CreateDocument
Call CreateItem(requestDoc, "Form", 0, "AdminRequest", False, True)
Call CreateItem(requestDoc, "Type", 0, "AdminRequest", False, True)
Call CreateItem(requestDoc, "ProxyProcess", 0, "Adminp", True, True)
Call CreateItem(requestDoc, "ProxyAction", 0, "101", True, True)
Call CreateItem(requestDoc, "ProxyTextItem1", 0, "0", True, True)
Call CreateItem(requestDoc, "ProxyOriginatingTimeDate", 0, Now, True, False)
Call CreateItem(requestDoc, "ProxyServer", 0, currentDB.Server, True, True)
Call CreateItem(requestDoc, "ProxyDatabasePath", 0, currentDB.FilePath, True, True)
Call CreateItem(requestDoc, "ProxyNameList", 0, currentDB.Title, True, True)
Call CreateItem(requestDoc, "ProxyAuthor", 0, session.UserName, True, True)
Call CreateItem(requestDoc, "FullName", AUTHORS, session.UserName, True, False)
Call CreateItem(requestDoc, "$OnBehalfOf", AUTHORS, session.UserName, True, False)
Call CreateItem(requestDoc, "ProxyOriginatingAuthor", AUTHORS, session.UserName, True, False)
Call CreateItem(requestDoc, "ProxyOriginatingOrganization", AUTHORS, StrRightBack(session.UserName, "/O="), True, False)
Call CreateItem(requestDoc, "ProxyOriginatingRequestUNID", 0, requestDoc.UniversalID, False, False)
Call requestDoc.Sign()
Call requestDoc.Save(True, True)
End Sub
Sub CreateItem(doc As NotesDocument, itemName As String, itemType As Integer, itemValue As Variant, signItem As Boolean, protectItem As Boolean)
'/**
' * creates a item in the document.
' *
' * @param doc NotesDocument to create item in.
' * @param itemName name of the item to create.
' * @param itemType type of the item to create.
' * @param itemValue value to assign to item.
' * @param signItem should item be signed?
' * @param protectItem should item be protected?
' *
' * @author Thomas Bahn <tbahn@assono.de>
' * @version 2014-07-03
' */
Dim item As NotesItem
If doc.HasItem(itemName) Then
Call doc.RemoveItem(itemName)
End If
If itemType <> 0 Then
Set item = New NotesItem(doc, itemName, itemValue, itemType)
Else
Set item = New NotesItem(doc, itemName, itemValue)
End If
item.IsSummary = True
item.IsSigned = signItem
item.IsProtected = protectItem
End Sub
Ich speichere diesen Agenten in der
gleichen Datenbank unter den Namen "Datenbank per Administration Request
signieren lassen via admin4.nsf-Dokument" (SignDatabaseAdminPViaAdmin4.nsfDoc).
- Auslöser: Durch Zeiplan - Nie
- Ziel: Keine
- Sicherheitsstufe zur Laufzeit: 2. Beschränkte Operationen zulassen
Dann starte ich ihn auf der Serverkonsole mit tell amgr run "datenbank.nsf" 'SignDatabaseAdminPViaAdmin4.nsfDoc' Er läuft fehlerfrei durch und die Datenbank wird tatsächlich mit der Server-ID signiert (Juhu!). Eigentlich machen beide Agenten doch das gleiche: Ein Dokument in der admin4.nsf anlegen, das dann vom Administrationsprozess abgearbeitet wird. Trotzdem geht der eine Weg, der andere nicht. Weitere, ausgiebige Recherchen bringen weitere Ideen:
- cache.ndk löschen - bringt nichts
- eine neue Arbeitsumgebung anlegen und zu dieser wechseln - bringt nichts
- im persönlichen Adressbuch die Letzten Kontakte (Recent Contacts) löschen - bringt nichts
- im persönlichen Adressbuch einen vorhandenen Eintrag für den aktuellen Benutzer löschen - bringt nichts
- im persönlichen Adressbuch alle Gruppen löschen - bringt nichts
Jetzt komme ich irgendwie auf die Idee,
einige Gruppen aus dem öffentlichen Adressbuch in das persönliche kopieren:
LocalDomainAdmins und LocalDomainServers.
ERFOLG!
Das war's.
Offenbar prüft der (Admin-)Client die
Berechtigung des Benutzers und verwendet dabei ggf. vorhandene lokale Gruppen?!
Egal, Problem gelöst, Kunde glücklich.
Und das ist das Wichtigste.