Benutzer mit den meisten Antworten
Sicherheits-Abfrage von Outlook, wenn ich via C# versuche eine neue Mail zu erstellen

Frage
-
Hallo
Ich habe eine Frage bzw. ein Problem mit Outlook, wenn ich via C#-Code eine neue E-Mail erstelle.
Outlook.Application outlookApp = new Outlook.Application(); MailItem mailItem = outlookApp.CreateItem(OlItemType.olMailItem); mailItem.Subject = "This is the subject"; mailItem.To = "someone@example.com"; .... ....
Ich habe eine kleine Test-Applikation, mit der läuft das alles einwandfrei; es kommt mit diesem Code immer das "Neue-Mail"-Fenster von Outlook.
Jetzt habe ich eine bestehende .NET-Applikation erweitert, und auch dort diese E-Mail-Erweiterung implementiert. Funktioniert bestens auf dem Entwicklungs-Rechner und der Entwicklungs-Umgebung, ABER - beim Kunden natürlich nicht.
Dort kommt folgende Zugriffs-Berechtigungs-Meldung:
...natürlich - wenn der Button "Erteilen" gedrückt wird, funktioniert der weitere Vorgang.
Und was mich dann überhaupt ganz verwirrt ist die Tatsache, dass dann auf dem gleichen Rechner das kleine Test-Programm mit dem Erstellen einer Mail-Nachricht einwandfrei funktioniert.
Was hat es da bei der bestehenden .NET-Applikation ? Warum wird diese als nicht vertrauenswürdig eingestuft ??
Kann mir dazu bitte jemand weiterhelfen.....
Danke schon mal & schönen Gruß
Michael
Michael Erlinger
Antworten
-
Hallo Michael,
Was aber heute der Fall war - es hat funktioniert (was 'IsTrusted' mit false ja schon wohl aussagt).
Ich verstehe nicht, was damit gemeint ist. Application.IsTrusted sagt einfach nur aus, ob dem Code im aktuellen Kontext vertraut wird. Wie es scheint, laufen deine beiden Assemblies out-of-process, und externem Code wird von Outlook grundsätzlich nie vertraut (d.h. IsTrusted gibt immer false zurück).
Und damit dass Ganze noch verwirrender wird: Unter bestimmten Umständen ist es möglich, dass die Sicherheits-Dialoge gar nicht angezeigt werden obwohl IsTrusted false zurückgibt: Das ist z.B. der Fall wenn Object Model Guard deaktiviert wurde ([HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\[Version]\Outlook\Security]) oder die Anzeige der Dialoge per Richtlinie außer Kraft gesetzt wurde.
Kann es sein, dass es einen Unterschied gibt zwischen dem Erstellen einer E-Mail-Nachricht, und dem Abfrage der Mails aus einem bestimmten Ordner oder dem Posteigang?
Zum einen: Der Object Model Guard schützt nur vor Zugriff auf schutzwürdige Objekte (eine Liste findest Du hier). Zum anderen: Wenn der Kunde Exchange verwendet, dann werden - wenn keine gegenteilige Konfiguration über Richtlinien oder einem öffentlichen Ordner erfolgt - die Exchange-Sicherheitseinstellungen verwendet. Das kann z.B. dazu führen, dass die Überprüfung der AntiViren-Software als Sicherheitsmerkmal für die Feststellung der Vertrauenswürdigkeit nicht mehr ausreicht.Wenn's am Exchange-Server liegt, könnte man vielleicht über die direkte Verwendung der WebDAV API u. ab O2007 der Exchange Web Services nachdenken (statt den Weg über Outlook zu nehmen). Du könntest evtl. auch die Redemption-Bilbiothek verwenden, bei kommerzieller Anwendung ist aber eine Lizenz notwendig.
Eine kleine Nachbemerkung noch: Es ist egal ob man bei "out-of-process"-Code eine Referenz auf Outlook.Application durch Erstellung einer neuen Instanz von Application oder über Marshal.GetActiveObject("Outlook.Application") as Outlook.Application holt, prozessextern bleibt prozessextern und Outlook vertraut dem Code nicht.
Lass mich wissen, ob dir diese Infos geholfen haben. Über C#-Code werden wir m.E. aber nicht wirklich viel ausrichten können. Es hängt alles mit der Konfiguration zusammen und dem Zusammenspiel zwischen Exchange-Einstellungen - Richtlinien - Outlook-TrustCenter und AV Scanner.
Gruß
Marcel
- Als Antwort markiert M.Erlinger Mittwoch, 10. Juli 2013 07:08
-
Hallo Marcel
vielen Dank für Deine Rückmeldung, und ausführlichen Infos dazu.
Ich werde die Sache in dem Projekt nun "von hinten" angehen, und nicht aus der bestehenden Applikation auf die Mails zugreifen und versuchen auszulesen, sondern via AddIn für Outlook programmieren - und somit kann auch der Benutzer dann auswählen, welche Mails in die Applikation übernommen werden sollen. Denn mir ist beim Kunden auch aufgefallen, dass in dem gewünschten Exchange-Ordner ca. 7000 Mails waren - und das Einlesen eine Ewigkeit gedauert hat.
Schönen Gruß - Michael
Michael Erlinger
- Als Antwort markiert Marcel RomaModerator Mittwoch, 10. Juli 2013 07:59
Alle Antworten
-
Hallo Michael,
das Dialog wird vom Outlook Object Model Guard beim Zugriff auf sicherungswürdige Objekt angezeigt. Über Application.IsTrusted kannst Du ab Outlook 2007 überprüfen, ob der Anwendung beim Zugriff auf Outlook vertraut wird.
Die Vertrauensstellung hängt von einigen Faktoren ab wie:
- aktuelle Anti-Viren-Software und -Definitionen
- Windows Sicherheits-Center im "grünen Bereich"
- Gruppenrichtlinien und Exchange-seitige Sicherheitseinstellungen lassen den Zugriff zu
Code Security Changes in Outlook 2007
Es gibt viele Add-ins, die einfach die Sicherheitsvorkehrungen von Outlook abschalten. Das würde ich im produktiven Betrieb aber keinesfalls empfehlen!
Schon viel besser ist es, ein signiertes VSTO-Outlook-Add-in zu erstellen, dessen Herausgeber in die Liste der vertrauten Herausgeber aufgenommen wird und/oder aus einem vertrauten Verzeichnis geladen wird. Deine Anwendung könnte mit diesem vertrauenswürdigen Add-in per Remoting, Pipes, Memory Mapped Files, WCF usw. kommunizieren. Wenn hohe Sicherheitsanforderungen gelten, könnte das Add-in die relevanten Methoden über das InternalsVisibleToAttribute nur für von bestimmten Assemblies sichtbar machen und die Kommunikation selbst könnte kryptografisch sicher über asymetrische Verschlüsselung gestaltet werden.
Mit dem Object Model Guard versucht man Viren wie Melissa und ILOVEYOU Einhalt zu gebieten, die seiner Zeit großen Schaden angerichtet haben.
Outlook "Object Model Guard" Security Issues for Developers
Gruß
Marcel
- aktuelle Anti-Viren-Software und -Definitionen
-
Hallo Marcel
vielen Dank für Deine Rückmeldung, und Deiner Erklärung.
Aber für mich bleibt immer noch die Frage - warum funktioniert es bei einem einfachen Test-Programm (WinForm mit einem Button, der eine neue Mail erstellt), und bei der bestehenden WinForm-Applikation die schon seit Jahren bei dem Kunden auf den PC's läuft nicht.; was ist bei der bestehenden (Kunden)WinForm-Applikation anders, dass es dort nicht funktioniert.
Bei dem Ganzen handelt es sich nicht um ein Outlook-AddIn.
Dafür muss es doch eine Erklärung geben.....oder wie siehst Du das?
GrußMichael
Michael Erlinger
-
Hi Michael,
welche Office-Version läuft beim Kunden und welche bei dir? Welche Betriebsysteme? Welche Frameworks? Haben die Assemblies einen starken Namen? Sind die Assemblies über Authenticode signiert? Werden die Assemblies mit den selben (evtl. geerbten) Berechtigungen ausgeführt?
P.S. Und was sagt Application.IsTrusted in beiden Fällen?
Gruß
Marcel- Bearbeitet Marcel RomaModerator Freitag, 5. Juli 2013 14:55 P.S.
-
Hallo
beim Kunden ist es Office-2010. Bei mir am Entwicklungs-System ist es Office-2013.
Betriebssysteme bei beiden Win-7 (1x 64bit - beim Kunden glaube ich 32bit).
Framework = .NET 4.5
Assemblies haben keinen starken Namen; und sind auch nicht signiert; nein - Assemblies werden nicht mit den selben (oder geerbten) Berechtigungen ausgeführt.
Und das Application.IsTrusted - muss ich noch testen.
Gruß
Michael
Michael Erlinger
-
Hallo
Und das Application.IsTrusted - muss ich noch testen.
Gut. Lass mich bitte wissen, wenn Du die Ergebnisse hast. Dann schauen wir weiter.
P.S. Überprüfe bitte auch nochmal die Einstellungen im Trust-Center. Nachfolgend zwei Bildschirmkopien, einmal aus Windows 8 mit Outlook 2013 (in W8 wurde Defender um Microsoft Security Essentials erweitert):
und dann eine Kopie aus Windows 7 mit Outlook 2010 (mit Defender aber ohne Security Essentials):
Im letzten Fall greift Object Model Guard ein und zeigt das von dir erwähnte Sicherheits-Dialog an. Ich fürchte also, dass wir hier nichts über C# lösen können.
Gruß
Marcel
- Bearbeitet Marcel RomaModerator Samstag, 6. Juli 2013 11:26 P.S.
-
Hallo Marcel
so, habe jetzt die Ergebnisse vom Kunden - wo sowohl in einer kleinen Test-Applikation, als auch in der bestehenden WinForm-Datenbank-Applikation eine neue E-Mail erstellt wird.
In beiden Fällen ist: Application.IsTrusted=false!
Was aber heute der Fall war - es hat funktioniert (was 'IsTrusted' mit false ja schon wohl aussagt).
Kann es sein, dass es einen Unterschied gibt zwischen dem Erstellen einer E-Mail-Nachricht, und dem Abfrage der Mails aus einem bestimmten Ordner oder dem Posteigang? Denn das wäre der einzige Unterschied zwischen dem heutigen Test - und dem Testen von voriger Woche.....
Danke & Grüße
Michael
Michael Erlinger
-
Hallo Michael,
Was aber heute der Fall war - es hat funktioniert (was 'IsTrusted' mit false ja schon wohl aussagt).
Ich verstehe nicht, was damit gemeint ist. Application.IsTrusted sagt einfach nur aus, ob dem Code im aktuellen Kontext vertraut wird. Wie es scheint, laufen deine beiden Assemblies out-of-process, und externem Code wird von Outlook grundsätzlich nie vertraut (d.h. IsTrusted gibt immer false zurück).
Und damit dass Ganze noch verwirrender wird: Unter bestimmten Umständen ist es möglich, dass die Sicherheits-Dialoge gar nicht angezeigt werden obwohl IsTrusted false zurückgibt: Das ist z.B. der Fall wenn Object Model Guard deaktiviert wurde ([HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\[Version]\Outlook\Security]) oder die Anzeige der Dialoge per Richtlinie außer Kraft gesetzt wurde.
Kann es sein, dass es einen Unterschied gibt zwischen dem Erstellen einer E-Mail-Nachricht, und dem Abfrage der Mails aus einem bestimmten Ordner oder dem Posteigang?
Zum einen: Der Object Model Guard schützt nur vor Zugriff auf schutzwürdige Objekte (eine Liste findest Du hier). Zum anderen: Wenn der Kunde Exchange verwendet, dann werden - wenn keine gegenteilige Konfiguration über Richtlinien oder einem öffentlichen Ordner erfolgt - die Exchange-Sicherheitseinstellungen verwendet. Das kann z.B. dazu führen, dass die Überprüfung der AntiViren-Software als Sicherheitsmerkmal für die Feststellung der Vertrauenswürdigkeit nicht mehr ausreicht.Wenn's am Exchange-Server liegt, könnte man vielleicht über die direkte Verwendung der WebDAV API u. ab O2007 der Exchange Web Services nachdenken (statt den Weg über Outlook zu nehmen). Du könntest evtl. auch die Redemption-Bilbiothek verwenden, bei kommerzieller Anwendung ist aber eine Lizenz notwendig.
Eine kleine Nachbemerkung noch: Es ist egal ob man bei "out-of-process"-Code eine Referenz auf Outlook.Application durch Erstellung einer neuen Instanz von Application oder über Marshal.GetActiveObject("Outlook.Application") as Outlook.Application holt, prozessextern bleibt prozessextern und Outlook vertraut dem Code nicht.
Lass mich wissen, ob dir diese Infos geholfen haben. Über C#-Code werden wir m.E. aber nicht wirklich viel ausrichten können. Es hängt alles mit der Konfiguration zusammen und dem Zusammenspiel zwischen Exchange-Einstellungen - Richtlinien - Outlook-TrustCenter und AV Scanner.
Gruß
Marcel
- Als Antwort markiert M.Erlinger Mittwoch, 10. Juli 2013 07:08
-
Hallo Marcel
vielen Dank für Deine Rückmeldung, und ausführlichen Infos dazu.
Ich werde die Sache in dem Projekt nun "von hinten" angehen, und nicht aus der bestehenden Applikation auf die Mails zugreifen und versuchen auszulesen, sondern via AddIn für Outlook programmieren - und somit kann auch der Benutzer dann auswählen, welche Mails in die Applikation übernommen werden sollen. Denn mir ist beim Kunden auch aufgefallen, dass in dem gewünschten Exchange-Ordner ca. 7000 Mails waren - und das Einlesen eine Ewigkeit gedauert hat.
Schönen Gruß - Michael
Michael Erlinger
- Als Antwort markiert Marcel RomaModerator Mittwoch, 10. Juli 2013 07:59