Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

mossSOFT OLConnector

COM-Addin für Microsoft Outlook 2000/2003 zum Umgehen der Sicherheitsabfrage bei Automation (Freeware)

Seit dem Service-Pack 2 von Microsoft Outlook 2000 ist es nicht mehr möglich, über die Automationsschnittstelle Emails in größerer Zahl zu versenden, ohne dass sich ein Sicherheitsdialog öffnet. Werden viele Mails etwa aus einer MSAccess-Datenbank an ein Outlook.Application-Objekt übertragen, dann erscheint ein Meldungsfenster, das nachfragt, ob der Zugriff erlaubt werden soll - und dies gegebenenfalls bei jeder neuen Email ("Object Model Guard").

Es gibt keine Möglichkeit, dies auszuschalten; weder über Optionen von Outlook noch über geeignete Registry-Einträge. Als Workaround für VB und VBA haben sich zwei Methoden eingebürgert, die beide ihre Nachteile haben:

ClickYes (http://www.contextmagic.com/express-clickyes ). Dieses kleine Programm sitzt im Tray von Windows, wirkt im Hintergrund und identifiziert das besagte Meldungsfenster von Outlook, falls es aufpoppt. Dann klickt es automatisch auf den "Zugriff erlauben"-Button. Das funktioniert soweit, ist aber ziemlich zeitraubend, wenn Massenmails versandt werden sollen, weil das Meldungsfenster mit einem Timer "gesichert" ist, der das Klicken des Buttons erst nach einer Zeitspanne von einigen Sekunden erlaubt. Und elegant ist das Ganze sicher auch nicht.
Redemption (http://www.dimastr.com/redemption ). Diese ActiveX-DLL kann in die Verweise eines VB(A)-Projekts aufgenommen werden und erlaubt dann das Versenden von Mails über die sogenannte Extended MAPI-Schnittstelle. Das Meldungsfenster erscheint dabei nicht, weil das Application-Objekt von Outlook umgangen wird; der Vorgang läuft auch schnell ab. Leider ist einiger Lernaufwand erforderlich, um sich mit der Redemption-Schnittstelle und deren Objektmodell vertraut zu machen, zumal die Dokumentation recht unübersichtlich ist. Und vor allem: Es ist nicht kostenlos (aktuell ca. 170 €).

Mit dem OLConnector stellt Access im Unternehmen eine neue Methode von Sascha Trowitzsch vor, die diese Nachteile vermeiden soll:

Der OLConnector ist ein COM-Add-In für MS Outlook in Version 2000 oder Version 2003 - unter Outlook XP funktioniert es leider nicht (siehe Erläuterung unten). Es besteht lediglich aus einer kleinen ActiveX-DLL, die im System registriert werden muss und dann automatisch ressourcenschonend im Hintergrund von Outlook arbeitet. Das Add-In-Objekt ist selbst automationsfähig und schleift wiederum das Application-Objekt von Outlook an andere Anwendungen durch. Da sich das Add-In im Prozessraum von Outlook selbst befindet kommt es nicht zur Anzeige des Meldungsfensters.

Gegenüber dem üblichen Code zum Versand von Emails über VBA ändert sich nur wenig. Im Anhang sind zwei kommentierte Code-Beispiele für MSAccess und MSExcel (ab Version 2000) enthalten, die die Verwendung der Connector-Schnittstelle verdeutlichen (olconnector_demo.zip). Außerdem finden Sie dort ein Delphi6-Beispielprojekt zur Automation von Outlook aus einem Delphi-Programm heraus.

Neu in Version 1.1 (April 2006):

Der Einsatz des OLConnectors stellt natürlich eine neue Sicherheitslücke für Outlook dar. Mit seiner Hilfe war es in Version 1.0 jeder entsprechend programmierten Anwendung möglich, auf in Outlook gespeicherte Daten wie Kontakte oder Emails zuzugreifen. Um dies zu verhindern, ermöglicht die Version 1.1 die Eingabe eines Kennworts, das im Code der aufrufenden Anwendung angegeben werden muss. Zur genaueren Erläuterung siehe die Ausführungen am Ende von: Anleitung zur Programmierung unter VB/VBA.

Die Technik dahinter:

Das COM-Addin wird nach Registrierung (Datei register_connector.bat ausführen) beim Start von Outlook automatisch geladen und hat damit Zugriff auf dessen Application-Objekt.

Die Idee war nun, dieses Application-Objekt nach außen hin zu veröffentlichen, wodurch Zugriff auf dessen Funktionen möglich wird. Das Meldungsfenster von Outlook wird aus dem Grund nicht aufgerufen, weil die entsprechende Sicherungsroutine nur beim direkten Zugriff auf das Application-Objekt über die ROT zum Einsatz kommt - zumindest gilt dies für die Outlook-Versionen 2000 und 2003. (Outlook XP gestattet leider auch COM-Addins keinen Zugriff auf das Objektmodell ohne die Sicherheitsabfrage.)

(ROT = die Running Objects Table; Teil des OLE-Systems von Windows; über diese ROT können andere Anwendungen Zugriff auf Objekte von OLE-Servern erhalten, was unter VB mit der Methode GetObject() geschieht.) Die Veröffentlichung erfolgt im Connector mit einem nicht unkomplizierten Code, der das OLConnector-Objekt selbst in der ROT registriert. Dieses kann damit von anderen Anwendungen über GetObject("OLConnector.Connect") ermittelt und anschließend über dessen Eigenschaft OLApplication das durchgeschleifte Outlook.Application-Objekt erhalten werden.

Download OLConnector V.1.1 + Demo für Access und Excel

Download Delphi-Demo (erfordert zusätzlich vorigen Download)

Anmerkungen:

Das COM-Addin und das Verfahren wurden unter verschiedenen Konfigurationen erfolgreich getestet.
Für irgendwelche Folgen aus der Verwendung trägt der Anwender jedoch selbst Verantwortung. Es wird keine Haftung übernommen.
Das COM-Addin ist frei für privaten und kommerziellen Einsatz. Eine Verbreitung über andere Seiten als diese ist aber nicht gestattet, soweit nicht ausdrücklich mit mossSOFT vereinbart. Bei anderweitigen Hinweisen auf das Addin ist eine Referenz auf diese Seite anzubringen.
Diese Software ist "as is". Ich kann keinen darüberhinaus gehenden Support leisten.
Der Source-Code ist aus Sicherheitsgründen nicht erhältlich.

Anleitung für den Einsatz des OLConnectors

Der Vorgang, um Outlook zu automatisieren, unterscheidet sich mit dem OLConnector nur geringfügig vom handelsüblichen Code. Um irgendwelche Aktionen ausführen zu können benötigt man eine laufende Instanz von Outlook und Zugriff auf dessen Application-Objekt.

Es gibt zwei Möglichkeiten unter VBA:

Man legt einen Verweis auf die "Microsoft Outlook Library x.0" an und erzeugt das Application-Objekt wie folgt:

Set objOutlook = New Outlook.Application

Hier handelt es sich um so genanntes Early Binding.

Alternativ kann man das Application-Objekt direkt über die so genannte ProgID - das ist die Klassenbezeichnung eines Objekts - erzeugen:

Set objOutlook = CreateObjekt("Outlook.Application")

Hier handelt es sich um Late Binding.

Die letztere Variante ist grundsätzlich zu bevorzugen. Wenn Outlook zum Beispiel auf dem Zielsystem gar nicht installiert ist oder in einer anderen Version vorliegt, dann bekommt man Probleme mit dem Verweis, der dann als "NICHT VORHANDEN" markiert sein wird, und das gesamte VBA-Projekt kann möglicherweise nicht mehr ausgeführt werden. Im Folgenden wird deshalb ausschließlich die zweite Methode eingesetzt. Eine Prozedur zur Automation sieht also üblicherweise so aus:

Sub OhneConnector()

    Dim objOL As Object 'Variable für das Outlook.Application-Objekt

    On Error Resume Next

 

    Set objOL = CreateObject("Outlook.Application")

Hier wird die Application-Variable instanziert. Zu bemerken ist hier, dass es egal ist, ob Outlook bereits geöffnet ist oder nicht. Da Outlook eine so genannte Multi-Use-Anwendung ist, gibt CreateObject() eine bereits laufende Outlook-Instanz zurück und erzeugt nicht eine neue. Es verhält sich also faktisch genauso wie GetObject( , "Outlook.Application").

    If objOL Is Nothing Then

        MsgBox "Instanz von MSOutlook konnte nicht erhalten werden." & vbCrLf & _

            "Ist Outlook korrekt installiert?", vbExclamation

        Exit Sub

    End If

In diesem Teil wird geschaut, ob die Application-Variable auch gefüllt ist. Falls Outlook auf dem System nicht installiert ist, dann ist die Variable leer, was durch den Test If objOL Is Nothing ermittelt wird. In diesem Fall erfolgt eine benutzerdefinierte Meldung und die Prozedur wird verlassen. Andernfalls kann ab hier mit weiterem Code fortgefahren werden, der beliebige Aufgaben auf das Outlook.Application-Objekt (objOL) ausführt wie etwa das Auslesen von Kontakten (ContactItems), das Exportieren und Senden von Emails (MailItems) oder das Anlegen von Aufgaben (TaskItems). Davor setzt man aber noch eine Fehlerbehandlung ein, denn eingangs der Prozedur wurde diese mit der Zeile On Error Resume Next außer Kraft gesetzt:

    On Error Goto Fehlerbehandlung

    ...

    Fehlerbehandlung:

        Msgbox "Fehler Nummer " & Err.Number & vbCrLf & Err.Description,   vbExclamation

Das mit gutem Grund: Wird Outlook nach vorstehendem Code automatisiert, dann wird die Sicherheitsabfrage von Outlook erscheinen, die bestätigt werden muss - meist nach der zweiten Aktion, z.B. der zweiten exportierten Email. (Outlook scheint nur eine einzige Email gutmütigerweise durchgehen zu lassen, ohne dass der Sicherheitsdialog erscheint.) Wird die Sicherheitsabfrage nicht bestätigt, sondern stattdessen die Abbrechen-Schaltfläche geklickt, so wird dies im obigen Code zu einem Fehler führen, der die Nummer 287 hat. Dieser Fehler wird in der Fehlerbehandlung abgefangen.

Wird der OLConnector eingesetzt, dann ist das ganze Verfahren im Prinzip dasselbe, nur dass die Instanzierung der Application-Variable anders aussieht:

Sub MitConnector()

    Dim objOL As Object

    Dim objConnect As Object

 

    On Error Resume Next

    Set objOL = CreateObject("Outlook.Application")

        If objOL Is Nothing Then

            MsgBox "Instanz von MSOutlook konnte nicht erhalten werden." & vbCrLf & _

                "Ist Outlook korrekt installiert?", vbExclamation

            Exit Sub

        End If

Bis hierhin ist der Code derselbe wie im ersten Beispiel. Nun kommt der OLConnector ins Spiel:

    Set objConnect = GetObject(, "OLConnector.Connect")

Wenn der OLConnector als COM-Addin in Outlook geladen wurde, was automatisch der Fall sein sollte, wenn er im System korrekt installiert (= registriert) wurde, dann steht die Objektvariable objConnect nun auf dem Connect-Objekt des OLConnectors. Das wird im Folgenden aber erst noch geprüft:

    If objConnect Is Nothing Then

        Set objOL = Nothing

        MsgBox "Konnte keine Verbindung zum OLConnector herstellen." & vbCrLf & _

            "Ist das COM-Addin OLConnector registriert und wird es von Outlook geladen?", vbExclamation

        Exit Sub

    End If

Wenn der OLConnector zum Beispiel nicht registriert wurde und folglich auch nicht von Outlook geladen ist, dann ist die Variable objConnect leer; mit dem Test auf Nothing wird das getestet und in diesem Fall eine entsprechende angepasste Fehlermeldung ausgegeben. Ansonsten läuft alles nach Plan und jetzt kommt der Clou der ganzen Sache:

    Set objOL = objConnect.olApplication

Hier wird die bisher auf das Outlook.Application-Objekt stehende Variable objOL auf die wichtige Eigenschaft OLApplication des OLConnectors gesetzt. Die enthält zwar genau dasselbe Outlook.Application-Objekt, doch erscheint der Sicherheitsdialog anschließend nicht, weil dieses Application-Objekt nun "von außen" und nicht direkt angesprochen wird. Der weitere Code führt dann genauso wie im ersten Beispiel die eigentlichen Aufgaben durch.

 

Neu in V.1.1:

Der Einsatz des OLConnectors führt natürlich zu einem gewissen Sicherheitsrisiko: Jede Anwendung kann nun nach beschriebenen Verfahren mit seiner Hilfe Outlook automatisieren, ohne dass die Sicherheitsabfrage erscheint. Damit ist das Versenden von Massenmails und Zugriff auf die Kontakte im Stillen möglich. Aus diesem Grund wurde die Möglichkeit implementiert, das Outlook-Application-Objekt erst nach Angabe eines Passworts zu erhalten.

    objConnect.Password = "Sascha Trowitzsch"

    Set objOL = objConnect.olApplication

Ist der Passwort-Modus des OLConnectors eingeschaltet, dann würde im vorstehenden Code die Objektvariable objOL ungültig sein (Nothing), falls das übergebene Passwort inkorrekt ist oder die entsprechende Zeile weggelassen würde. Somit ist es nur einer Anwendung, die dieses Passwort kennt, möglich auf Outlook mit dem Connector zuzugreifen. Das Passwort kann in V.1.1 in den Optionen von Outlook eingegeben werden. Ist der OLConnector geladen, dann sieht der Optionen-Dialog (Menü Extras/Optionen...) so aus:

Es gibt eine neue Registerseite "OLConnector". Im entsprechenden Feld kann darin das Passwort eingegeben werden und mit "Übernehmen" oder "OK" gespeichert werden. Die Passwortabfrage tritt dabei nur in Kraft, wenn auch das Häkchen auf "Use Password" gesetzt wurde. Ist das Häkchen deaktiviert, dann ist die Codezeile mit der Passwortübergabe irrelevant.

Das Passwort wird übrigens RC4-verschlüsselt in der Registry unter dem Zweig HKEY_CURRENT_USER abgelegt und gilt damit nur für den aktuellen Benutzer des Computers. Sollen also mehrere User den OLConnector im Passwort-Modus verwenden können, so muss für jeden einzelnen das Passwort in Outlook eingegeben werden. Dies wurde aus Sicherheitsgründen explizit so implementiert.

Zum Schluss noch der ausdrückliche Hinweis, dass es aus technischen Gründen nicht möglich ist, den OLConnector auch unter OutlookXP einzusetzen!

04/2006, Sascha Trowitzsch

development@moss-soft.de

Tools

In dieser Rubrik finden Sie Tools für die Anwendung mit Access.

Showplan Capturer - Abfrage-Ausführungspläne ganz einfach protokollieren, in einem eigenen Tool während der Ausführung der Abfrage anzeigen und analysieren

RTF2 (deutsch) - das bekannte RTF2-Steuerelement für Formulare und Berichte von Stephen Lebans jetzt in deutscher Sprache

OLConnector - Tool zum Umgehen der Sicherheitsabfragen bei der Automation von Microsoft Outlook

accessUnit - Unit-Testing-Framework für Microsoft Access

Procbrowser - Plugin für den VBA-Editor zum Anzeigen aller Elemente des aktuellen Moduls (Deklarationen, Prozeduren etc.)

MsgBox-Wizard - Assistent zum Erstellen von MsgBox-Anweisungen

MZ-Tools-Bibliothek - .ini-Datei, mit der Sie aus MZ-Tools heraus per Mausklick oft benötigte Funktionen zum VBA-Projekt hinzufügen können

Zeiterfassung - Zeiterfassung mit Outlook und Access, Projekt zu c't 9/2008

© 2003-2015 André Minhorst Alle Rechte vorbehalten.