Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: MrXYZ am 24.01.08 - 16:41:12
-
Hi @ALL, ???
mal wieder ein kleines Problem. Habe einen Agenten geschrieben, der Attachments aus einer Mail auf einen bestimmten Share lösen soll, danach wird eine auf dem Share befindliche exe-Datei angestartet, die den ZIP entpackt, auf Validatät überprüft und die entpackten Dateien in einen anderen Share schiebt.
Lokal funktioniert der Agent einwandfrei. Nur nicht auf dem Server ! Konsolenmeldung Server: object variable not set... ich arbeite auf einem Server, auf dem ich komplette Execution Rechte für die Skripte habe
On Error Goto ErrorHandler
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim view As NotesView
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim rtitem As Variant
Dim object As NotesEmbeddedObject
Dim fileCount As Integer
Dim tempshare, mailinshare As String
Dim message As String
Dim mail As NotesDocument
Dim stream As NotesStream
'### DEFINE Sharefolders
tempshare = "\\server1\mailin$\TEMP\"
mailinshare = "\\server1\mailin$\Anonymous\"
Set db = session.CurrentDatabase
Set view = db.GetView("($Inbox)")
fileCount = 0
Set doc = view.GetFirstDocument
While Not(doc Is Nothing)
Set rtitem = doc.GetFirstItem( "Body" )
'### Check: Attachment available ?
If doc.HasEmbedded = True Then 'Loop 1
If ( rtitem.Type = RICHTEXT ) Then 'Loop 2
'### Here we go ...
Forall o In rtitem.EmbeddedObjects
If ( o.Type = EMBED_ATTACHMENT ) Then 'Loop 3
fileCount = fileCount + 1
'# Extract to temporary Directory
Print o.Name
Call o.ExtractFile ( tempshare & o.Name )
'### Start Extraction of files and check
Dim result As Integer
result = Shell(tempshare & "zipchecka.exe " & o.Name, 1)
pathname = tempshare & "validation-" & Left$(o.Name,Len(o.Name)-4) & ".txt"
Sleep 20
Call o.Remove
Call doc.Save( True, True )
'Move processed document to processedfolder
'Call doc.Remove(True)
End If 'End Loop 3
End Forall
Else 'Else Loop 2
Print "No attachments in Document"
doc.subject = doc.subject(0) + "No attachments in document"
Call doc.Save( True, True )
'Move processed document to processedfolder
'Call doc.Remove(True)
Goto NextDoc
End If 'End Loop 2
'Mail generieren mit Informationen
'Sleep 10
Set stream = session.CreateStream
'Stream defined in Loop for detaching files !
'pathname = tempshare & "\validation-" & o.Name & ".txt"
If Not stream.Open(pathname, "ASCII") Then
Messagebox pathname ,, "Open failed"
Exit Sub
End If
If stream.Bytes = 0 Then
Messagebox pathname,, "File has no content"
Exit Sub
End If
'Send mail with information of stream to sender of the mail
Set mail = New NotesDocument(db)
Call mail.ReplaceItemValue("Form", "Memo")
Call mail.ReplaceItemValue("Subject", "Notes2XXX - Information Mail")
mail.sendto = doc.Principal(0)
Call mail.ReplaceItemValue("Body", stream.ReadText())
Call stream.Close
Delete stream
Call mail.Send(False)
pathname =""
Delete mail
End If
NextDoc:
'Call doc.Remove(False)
Set doc = view.GetNextDocument(doc)
Wend
'### Cleanup Documents
ErrorHandler:
routine$ = "Check Attachment Agent - Notes2XXX"
mailError routine$, Err, Erl, Error
Exit Sub
-
Du solltest mal nach
Print o.Name
Call o.ExtractFile ( tempshare & o.Name )
ein
Print "Nach ExtractFile"
einbauen und in der log.nsf nachsehen, ob das dort steht. Falls nicht liegt es vermutlich an den Verzeichnissen
tempshare = "\\server1\mailin$\TEMP\"
mailinshare = "\\server1\mailin$\Anonymous\"
Andreas
-
Die Markierung der Zeile, die der ErrorHandler angibt, wäre auch nicht schlecht.
Bernhard
-
Das Problem ist, dass der ErrorHandler auch nicht läuft >:(
-
die Sache ist ganz einfach: Vermutlich läuft der Server (wie 90% aller Domino- Server) als Dienst.
Und ein Dienst läuft mit dem Systemkonto, das keine Netzwerk- Credentials besitzt.
Mit Domino als Dienst auf ein Netzwerkshare zuzugreifen ist damit quasi unmöglich.
Es gibt diverse Workarounds, die aber alle am Server- Setup eingreifen, nicht im Code.
Die wären (u.a):
- Server nicht als Dienst laufen lassen (blöd, wenn man sich ausloggt dann stoppt der Server)
- Server als Dienst mit Benutzernamen laufen lassen (blöd, weil man dann keine Server- Konsole mehr sieht)
- Share einrichten ganz ohne Authentifizierung (blöd wegen Sicherheit)
...
Hier im Forum wurde das schon ein paar mal diskutiert, vielleicht findest Du eine andere Lösung...
Tode
-
Wir haben zum Testen erst einmal die unsicherste Methode gewählt und das ist der offene Share :(
-
geht imho generell nicht über einen UNC-Namen, wenn Domino als Dienst läuft. Auch wenn der Share für alle bearbeitbar ist. Wenn dann musst du (bereits vor Anmeldung) den Share als Laufwerk zuordnen. Hab ich so schon realisiert. Mehr kann ich da im Moment nicht sagen, weil ich nicht sicher bin ob ich grad die Citrix oder die W2K3-Brille aufhab und die damalige Umgebung grad nicht zur Hand hab.
Kann im Bedarfsfall morgen mal in der Umgebung nachschauen, wie ich das damals realisiert habe....
Jo
-
Dim ws As New NotesUIWorkspace
UI Klassen gehen für Hintergrundagenten nicht, manuell laufen die natürlich schon. Rausnehmen und erneut testen.
Und ein Dienst läuft mit dem Systemkonto, das keine Netzwerk- Credentials besitzt.
Mit Domino als Dienst auf ein Netzwerkshare zuzugreifen ist damit quasi unmöglich.
Das ist so quasi unkorrekt, auch wenn kein Kennwort existiert heißt das nicht, daß keine Credentials da sind.
Nur gibt es natürlich keinen Benutzernamen den man in der Share einträgt sondern man trägt direkt das Systemkonto des anderen Servers ein - das ist simpel deren Maschinenname statt eines Anmeldebenutzers.
Das praktiziere ich schon seit Jahren in bestimmten Kombinationen mit Windows und Exchangeservern, wo Dienste auf bestimmte Dinge zugreifen müssen - und es funktioniert ^^.
HTH Carsten
-
Dim ws As New NotesUIWorkspace
Genau das war es ... so ein shit. Habe die Klasse noch nicht mal benutzt, aber damit war der komplette Agent blockiert. Danke für den Hinweis !! ;D
-
@Carsten: Danek für die wertvolle Info. Da hat sich wohl eine "düstere Legende" gebildet. Bisher hat mir in dem Punkt noch niemand widersprochen.
Ich werde mir das gut merken.
Tode
-
Dank an Carsten, die Auskunft sorgt für die nötige Klarheit. Ich war mit meiner bisherigen Meinung an der Stelle nämlich ganz bei Thorsten gewesen. Und sehe mit einem Mal: das ist nur die halbe Wahrheit.
Wo wir aber bei den "düsteren Legenden" sind, vielleicht noch eine Frage von mir zu ein wenig Aufklärung, was für den Agentencode oben nicht unwichtig ist.
Bisher denke ich, daß die EMBEDDEDOBJECTS des Notes-Dokuments nur diejenigen sind, die NICHT in einem RT-Item hängen, während die EMBEDDEDOBJECTS eines RT-Items nur die sind, die in diesem RTITEM hängen.
Im Mailing heißt das typischerweise: Eingehende Faxe oder Mailgateways hängen die Attachments nicht an ein Feld, sondern an das Dokument (stehen ganz am Ende des Dokuments unter dem Strich,
Mails von Notes-Anwendern, die nur von Notes-Servern geroutet werden, enthalten die Attachments typischerweise im BODY-Feld.
Sicher ist, daß der obige Agent die ersteren Anhänge gar nicht erfassen kann, da er nur das BODY-Feld betrachtet. Fraglich ist für mich aber, ob die Eigenschaft doc.HasEmbedded zum gewünschten Ergebnis führt, wenn nur das Body-Feld einen Anhang hat.
Einmal ganz abgesehen von all den vielen anderen Unzulänglichkeiten des Agenten (mit Sleep 20 kann man pro Stunde gerade einmal 180 Anhänge wegzippen - und wenn die maximale Agentenlaufzeit auf dem Server auf 30 Minuten festgesetzt ist, ist vermutlich zwischen 87 und 89 Feierabend durch Abbruch). Was passiert, wenn in einer Mail-Sequenz der gleiche Anhang - vielleicht in modifizierter Form - noch einmal auftaucht ? Dafür ist keine Vorkehrung getroffen. Die Anwender werden sich freuen, wenn nicht die gültige, sondern nur irgendeine Dateiversion gesichert vorliegt. Aber das nur am Rande.
Interessiert bin ich an der Erhellung der "düsteren Finsternis" rund um die Eigenschaft des DOC.HASEMBEDDED. Wer klärt mich auf ?
Danke im Voraus
Norbert
-
Hallo zusammen,
wenn ich mich noch recht erinnere, deklariert die Zeile
Dim tempshare, mailinshare As String
eine Variable 'tempshare' vom Typ Variant und eine namens 'mailinshare' als String.
Ich weiss nicht, ob das hier so beabsichtigt ist...
Wäre nicht ein
Dim tempshare as String
Dim mailinshare as String
treffender?
Viele Grüße, Stefan
-
Deine Erinnerung täuscht Dich nicht - die von Dir zitierte Deklaration ist mehr als unsauber, Deine Korrektur ist korrekt.
Nur mit dem Problem hat es nichts zu tun.
Bernhard