VBOffice

Sicherheitsmodell, Teil 2

Mit einem kleinen Trick können Sie auch z.B. aus Excel heraus Emails über Outlook versenden, ohne dass eine Sicherheitswarnung angezeigt wird.

Zuletzt geändert: 19.12.2007 | Aufrufe: 17.700  | #31
◀ Vorheriges Beispiel Nächstes Beispiel ▶

Inhalt

OLKeeper OLKeeper
Der OLKeeper verhindert zuverlässig, dass Sie Microsoft Outlook unbeabsichtigt schließen und so etwa wichtige Emails verpassen würden.

Die Application-Objektvariable veröffentlichen

Einige Eigenschaften des Outlook-Objektmodells sind aus Sicherheitsgründen gesperrt. Wenn Sie z.B. aus Excel heraus versuchen, eine Email über Outlook zu versenden, dann wird dem Anwender ein Hinweis angezeigt; der Anwender muss das Senden dann explizit erlauben. Seit Outlook 2003 gibt es die Möglichkeit, das zu umgehen. Dazu müssen Sie nur das vorhandene und bereits instanzierte Application-Objekt nutzen.

Da die meisten Beispiele aber sowohl für VBA als auch VB gültig sein sollen, wird häufig selbst für VBA-Projekte gezeigt, eine neue Instanz der eigenen Host-Anwendung zu starten. Das Vorgehen ist für alle VBA-Projekte überflüssig; im Falle von Outlook 2003 kann es sogar zum Deaktivieren der VBA-Unterstützung führen und führt auf jeden Fall dazu, dass ihrem eigenen Code nicht vertraut wird.

In Outlook 2003 brauchen Sie sich also keine weiteren Gedanken um das Sicherheitsmodell zu machen. Was ist aber, wenn Sie z.B. aus Excel heraus auf Outlook zugreifen wollen? Auch dann wollen Sie ja, dass Ihrem Code vertraut wird. Neben der Verwendung von Produkten von Drittherstellern gibt es eine weitere Möglichkeit. Diese ist aber inoffiziell, d.h. Microsoft könnte jederzeit und ohne Ankündigung beschließen, eine Änderung einzuführen. Die einfache Lösung: Machen Sie das Application-Objekt öffentlich.

Fügen Sie die folgende Funkton ins Modul DieseOutlookSitzung ein. Wichtig ist, dass die Funktion als Public und die Rückgabe als Object deklariert wird.

Wichtiger Hinweis: Ich empfehle dringend, dass Sie sich selbst irgendeinen originellen Namen für die öffentliche Eigenschaft in Outlook ausdenken. Andernfalls bräuchte ein Angreifer nur zu testen, ob es bei Ihnen den hier vorgestellten Namen gibt und umgeht damit ebenfalls das Sicherheitsmodell!


tip  So fügen Sie Makros in Outlook ein
Public Property Get EinGeheimerName() As Object
  Set EinGeheimerName = Application
End Property

Das Problem

Das folgende Beispiel zeigt das Problem: Beim üblichen Aufruf des Outlook-Objektmodells aus Excel heraus tritt eine Sicherheitsmeldung auf, wenn versucht wird, die Email-Adresse des Empfängers einer Email im Posteingang zu lesen. (Es wird davon ausgegangen, dass Outlook bereits läuft.)

Private Sub Test()
  Dim Outlook As Outlook.Application
  Dim Mail as Outlook.MailItem
  Dim Folder As Outlook.MAPIFolder

  Set Outlook = GetObject(, "Outlook.Application")
  Set Folder = Outlook.Session.GetDefaultFolder(olFolderInbox)
  Set Mail = Folder.Items(1)
  Debug.Print Mail.Recipients(1).Address
End Sub
ReplyAll ReplyAll
Mit diesem Addin für Outlook erhalten Sie in verschiedenen Situationen eine Warnung, bevor Sie auf eine Email versehentlich allen anderen Empfängern antworten.

Die Lösung

Statt die Email über das Outlook.Application-Objekt zu referenzieren, das von der GetObject-Function für jedermann zugänglich ist, wird die Email über das Objekt referenziert, dass Sie zuvor im Outlook-Modul DieseOutlookSitzung selbst öffentlich gemacht haben.

Private Sub Test()
  Dim LockedOutlook As Outlook.Application
  Dim Outlook As Object
  Dim Mail as Outlook.MailItem
  Dim Folder As Outlook.MAPIFolder

  'GetObject liefert den Verweis, der dem Sicherheitsmodell unterliegt
  Set LockedOutlook = GetObject(, "Outlook.Application")

  'Über den öffentlichen Verweis, den GetObject geliefert hat, können wir auf unsere
  'geheime Eigenschaft zugreifen. Diesem Verweis vertraut Outlook. Weil Outlook die Eigenschaft
  'nicht kennt, muss die Variable als Object, nicht als Outlook.Application, deklariert sein.
  Set Outlook = LockedOutlook.EinGeheimerName

  Set Folder = Outlook.Session.GetDefaultFolder(olFolderInbox)
  Set Mail = Folder.Items(1)
  Debug.Print Mail.Recipients(1).Address
End Sub
Reporter Reporter
Mit dem Reporter erstellen Sie Berichte für Ihre Outlook Daten. Mit wenigen Klicks werden Werte aus Aufgaben, Terminen und dem Journal summiert.
email  Senden Sie eine Nachricht