Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Joker am 03.09.03 - 09:46:46
-
Hi,
habe da mal eine Frage.
Habe eine Datenbank in der eigentlich alle eingetragenen Personen nur Leserzugriff besitzen. (Bis auf 4-5 Leute mit Editor bzw. Managerrechten).
In einer Maske mit der die einzelnen Dokumente erstellt werden, befinden sich auch ein Autoren- sowie Leserfeld. Autorenzugriff haben standardmäßig nur die Personen, welche der Rolle [Administrator] angehören. Die Leserechte werden für jedes Dokument nach der Erstellung explizit festgelegt.
Nun habe ich folgendes Problem:
Beim öffnen einer Datenbank durch eine Person, welche als Leser in der ACL eingetragen ist, soll ein Script aufgerufen werden, welches einige Dokumente in der Datenbank aktualisiert. Sprich, in ein Richtextfeld werden die neuesten Dateien, welche sich in einem Verzeichnis befinden, eingebettet.
Bei einer Person mit Editorrechten oder höher funktioniert das ja einwandfrei. Doch bei einer Person welche nur Leserrechte hat funktioniert das nicht. Klar, sie hat ja nur Leserrechte und kann kein Dokument verändern und diese Änderungen dan speichern.
Also warum das nicht geht ist mir klar. Doch nun meine Frage: Gibt es eine Möglichkeit, dass eine Person die nur Leserrechte besitzt trotzdem Änderungen an einem Dokument durchführen kann (also nicht im Frontend, sondern durch ein Script im Backend).
Ich habe schon an einen Agenten gedacht der auf dem Server läuft oder aber auch daran der Person kurzzeitig Editorrechte zu geben ??? oder so ???
Vielleich kann mir ja jemand helfen. Vielleich habe ich auch gerade eine kleine Blockade !
Gruss
Martin
-
Hi,
die Person braucht Autorenrechte und dann musst Du in die Dokumente ein Autorenfeld setzen und den Namen der Person, oder Rolle rein. Dann dürfte es gehen. So hast Du zumindest den Schreibzugriff auf bestimmte Dokumente begrenzt.
Ich denke Du kommst in keinem Fall drumherum die Rechte zu erhöhen. Egal wie Du es machst. Dafür sind die Sicherheitsfeatures da. :)
Gruß
Markus
-
Eine Methode wäre der Start eines Agents, der die Signatur mit den entsprechenden Rechten trägt.
Schau' mal unter NotesAgent.RunOnServer in der Designer-Hilfe.
A-Bär: Du mußt dann vor Aufruf des Agents checken, ob lokal oder auf dem Server gearbeitet wird.
Eine andere Variante könnte sein, je nach den Userrechten Felder nur zum Lesen oder zum Editieren anzubieten.
Bernhard
-
@Markus
... du musst die rechte nicht erweitern. Bernhard hat es in seinem Posting beschrieben - Agenten verwenden nicht die ID des Users, sondern die ID des Agenten - und das ist die ID mit der der Agent zuletzt gespeichert oder signiert wurde...
... wenn das lokal läuft sollte die konsistente ACL aktiviert sein, da sonst keine Sicherheitsüberprüfung stattfindet...
ata
-
Hi,
danke für eure Antworten.
Habe das mit dem Agenten ausprobiert. Der Agent läuft auch einwandfrei. Jedoch nur wenn ich ihn von Hand (also rechte Maustaste - Starten) aufrufe.
Habe folgendes Script zum aufruf des Agenten entwickelt:
Dim session As NotesSession
Dim db As NotesDatabase
Dim agent As NotesAgent
Set session = New NotesSession
Set db = session.CurrentDatabase
Set agent = db.GetAgent("PDFAktualisierung")
If agent.RunOnServer = 0 Then
'Meldung für erfolgreiche Aktualisierung
Messagebox("Aktualisierung ausgeführt.")
Else
'Meldung, falls die Aktualisierung fehlschlägt
Messagebox("Aktualisierung fehlgeschlagen")
End If
Habe das ganze auch in eine Aktion gepackt. Es kommt auch die Meldung "Aktualisierung ausgeführt.", doch der Agent macht nichts !
Müsste doch eigentlich so gehen, oder ?
-
Du führst den Agent ja gar nicht aus, du hast lediglich ein Handle auf den Agenten.
Da fehlt was wie Call agent.Run
-
Klar führt er den Agent aus:
If agent.RunOnServer ....
-
... was für einen Trigger hat der Agent? Wenn er auf die markierten Dokumente einer Ansicht läuft, dann lässt er sich nicht "fernsteuern"
ata
-
Ooops, erst lesen, dann denken, dann schreiben ::)
-
@ata
Nein, der Agent läuft nicht auf die markierten Dokumente einer Ansicht. An sich müsste er ja funktionieren, denn wie gesagt, wenn ich ihn von Hand ausführe, dann läuft er ja auch ohne Probleme.
Habe es jetzt mal mit der Formel @Command([ToolsRunMacro];"PDFAktualisierung") ausprobiert. Funktioniert auch !!!
Jedoch wieder nur bei Personen die mindestens Editorrechte besitzen !
Zieht er sich durch die Ausführung bei der Formel nicht die ID des Agenten (letzte Speicherung bzw. Signierung) heran ?
Müssen am Server bestimmte Vorraussetzungen gegeben sein, dass ich ihn per Script aufrufen kann ???
Gruss
Martin
-
... schau mal im Serverdokument in den Sicherheitseinstellungen, dort gibt es die Mögklichkeit einiges einzuschränken...
... er zieht sich als User auf jeden Fall die Signierung des Agenten...
ata
-
Hallo,
soweit ich weiss läuft ein Agent (zumindest in R5) mit den Rechten des Users. Abhilfe Daten irgendwo zwischenspeíchern (zb. mit einer Public Form) und dann per Hintergrundagenten (zeit/ereignissgesteuert) einlesen.
-
Hi,
habe jetzt herausgefunden, warum das Script mit dem RunOnServer-Befehl nicht ging.
Notes führt den Agenten zwar ganz normal aus. Jedoch habe ich im Script des Agenten eine Bibliothek eingebunden welche mir eine eine Funktion bereitstellt, mit der ich das Erstellugsdatum einer bestimmten Datei bekomme ( Script in WinAPI !!!!!!!!!). Genau dann wenn ich die Funktion aufrufen möchte steigt er aus.
Ich mache das folgendermaßen (Script-Klasse heißt FileInfo) :
Set FileInfo = New FileInfo
ErstDatumNeu = FileInfo.GetFileTimeInfo(FilePath,2)
Muss man die Script-Klasse vielleicht anders initialisiert werden. Oder muss vielleicht für WinAPI im Serverdokument etwas eingestellt werden. Oder funktioniert der Aufruf von WinAPI-Methoden in einem Agenten auf dem Server nicht ??
Vielleicht kann mir ja jemand weiterhelfen. Beschäftige mich leider zum ersten Mal mit WinAPI-Einbindung in Lotus.
Gruss
Martin
-
Was steht denn in FilePath drin ? Gibt es denn diese bestimmte Datei auch auf dem Server ?
-
Hi,
in FilePath steht der Pfad für die Datei, von der das Erstellungsdatum ermittelt werden soll (z.B. C:/Temp/...).
Die Script-Klasse, welche ich verwende sieht folgendermaßen aus:
Const INVALID_HANDLE_VALUE = -1
Const MAX_PATH = 260
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Type WIN32_FIND_DATA
dwFileAttributes As Long ' Dateiattribute
ftCreationTime As FILETIME ' Erstellungsdatum
ftLastAccessTime As FILETIME ' Letzter Zugriff
ftLastWriteTime As FILETIME ' Letzte Speicherung
nFileSizeHigh As Long ' Größe (Hi)
nFileSizeLow As Long ' Größe (Lo)
dwReserved0 As Long ' bedeutungslos
dwReserved1 As Long ' bedeutungslos
cFileName As String * MAX_PATH ' Dateiname
cAlternate As String * 14 ' 8.3-Dateiname
End Type
Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (Byval lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (Byval hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Declare Function FindClose Lib "kernel32" (Byval hFindFile As Long) As Long
Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Declare Function SystemTimeToFileTime Lib "kernel32" (lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As Long
Class FileInfo
Public Function GetFileTimeInfo ( strPath As String , MODE As Integer ) As String
Dim FileHandle As Long
Dim FileData As WIN32_FIND_DATA
Dim LocalFileTime As FILETIME
Dim LocalSystemTime As SYSTEMTIME
FileHandle = FindFirstFile(strPath & vbNullChar, FileData)
Select Case MODE
Case 0
FileTimeToLocalFileTime FileData.ftLastAccessTime, LocalFileTime
Case 1
FileTimeToLocalFileTime FileData.ftLastWriteTime, LocalFileTime
Case 2
FileTimeToLocalFileTime FileData.ftCreationTime, LocalFileTime
End Select
FileTimeToSystemTime LocalFileTime, LocalSystemTime
GetFileTimeInfo = _
Left$(FileData.cFileName, Instr(FileData.cFileName, vbNullChar) - 1) _
& LocalSystemTime.wDay & "." _
& LocalSystemTime.wMonth & "." _
& LocalSystemTime.wYear & ", "_
& LocalSystemTime.wHour & ":" _
& Format$(LocalSystemTime.wMinute, "00") _
& ":" & Format$(LocalSystemTime.wSecond, "00") & " Uhr"
FindClose FileHandle
End Function
Public Function GetFileInfo ( strPath As String , MODE As Integer ) As String
Dim FileHandle As Long
Dim FileData As WIN32_FIND_DATA
FileHandle = FindFirstFile ( strPath & vbNullChar , FileData )
If FileHandle <> INVALID_HANDLE_VALUE Then
Select Case MODE
Case 3
GetFileInfo = FileData.cFileName
Case 4
GetFileInfo = Cstr(FileData.nFileSizeLow)
Case 5
GetFileInfo = FileData.cFileName
Case 6
GetFileInfo = Cstr(FileData.dwFileAttributes)
Case 7
GetFileInfo = Cstr(FileData.cAlternate)
End Select
End If
FindClose FileHandle
End Function
End Class
Also mit MODE = 2 hole ich mir das Erstellungsdatum.
Diese Script-Klasse habe ich in eine Script Bibliothek eingefügt. Diese wiederum habe ich mit Use "Name der Bibliothek" zum Agenten hinzugefügt (wie auch bei einer normalen Bibliothek mit Lotus-Script-Code).
Habe es auch schon mal probiert, wenn ich die Klasse direkt in den Agenten hineinkopiere (also ohne Use).
Gleicher Fall : Irgendwie kann er auf dem Server die WinAPI-Funktion nicht ausführen.
Gruss
Martin
-
Vielleicht sollte eknori da mal was zu sagen, scheint ja der API-Gott hier zu sein ;)
-
... ist das ein Windows-Server?
ata