Verbindungsherstellung zu einer verwalteten Komponente aus Excel 2002 mit VBA

Veröffentlicht: 19. Jan 2003 | Aktualisiert: 09. Nov 2004

Von Dennis Angeline, Misha Shneerson, und Siew-Moi Khor

Auf dieser Seite

Einführung Einführung
Systemanforderungen Systemanforderungen
Ausführen eines unsignierten VBA-Makros Ausführen eines unsignierten VBA-Makros
Ausprobieren Ausprobieren
So installieren Sie das Beispiel So installieren Sie das Beispiel
So verwenden Sie den Segment Viewer So verwenden Sie den Segment Viewer
Wie funktioniert das? Wie funktioniert das?
Überlegungen zur Sicherheit. Mögliche Sicherheitsrisiken Überlegungen zur Sicherheit. Mögliche Sicherheitsrisiken
Schlussfolgerung Schlussfolgerung

Einführung

Mithilfe der Interop-Dienste von COM (Component Object Model), die von der Common Language Runtime (CLR) zur Verfügung gestellt werden, können Sie verwalteten Code so aktivieren, dass er von COM bzw. dass COM-Code von verwalteten Anwendungen eingesetzt werden kann.

Der in diesem Artikel enthaltene Download eines Segment Viewers zeigt, wie dies realisiert werden kann. Beim Segment Viewer handelt es sich um eine verwaltete Komponente, die von COM-Clients über COM-ähnliche Schnittstellen verwendet werden kann. Er zeigt, wie mittels der COM-Interop-Dienste verwalteter Code von COM bzw. wie COM-Komponenten aus einer verwalteten Anwendung heraus eingesetzt werden können.

In diesem Artikel geht es darüber hinaus auch um die Sicherheitsaspekte, die mit der Implementierung einer solchen Projektmappe verbunden sind. Diese werden mittels des Segment Viewer-Beispiels verdeutlicht. Dabei wird davon ausgegangen, dass Sie mit Microsoft Office XP Visual Basic für Applikationen (VBA) und den Microsoft .NET-Technologien vertraut sind.

 

Systemanforderungen

Zum Ausführen des Beispiels benötigen Sie die folgende Software:

  • Microsoft Windows XP oder Microsoft Windows 2000 und verwandte Service Packs (SPs)

  • Microsoft Office XP und verwandte SPs

  • Microsoft .NET Framework und verwandte SPs

Zum Anzeigen des Beispielcodes benötigen Sie darüber hinaus noch Microsoft Visual Studio® .NET. Zum Kompilieren der Projektmappe sind die Microsoft Office XP Primary Interop Assemblies (PIAs) (in Englisch) erforderlich.

 

Ausführen eines unsignierten VBA-Makros

Das im Beispieldownload enthaltene Microsoft Excel 2002-Makro ist unsigniert. Dasselbe gilt für die Komponenten. Zum Ausführen des Excel 2002-VBA-Makros müssen die Sicherheitseinstellungen im Dialogfeld Sicherheit von Excel 2002 auf Mittel gesetzt sein (zeigen Sie im Menü Extras auf Makro und klicken Sie dann auf Sicherheit). Deaktivieren Sie außerdem das Kontrollkästchen Allen installierten Add-Ins und Vorlagen vertrauen. Führen Sie diese Aktionen möglichst nur in einer Testumgebung durch. Setzen Sie nach dem Testen die Sicherheitsstufe wieder auf Hoch.
Achtung:
Durch Einstellen der Sicherheitsstufe auf Mittel und Deaktivieren des Kontrollkästches Allen installierten Add-Ins und Vorlagen vertrauen haben Benutzer die Möglichkeit, unsignierte COM-Add-Ins und VBA-Makros nach Aufforderung zu aktivieren oder zu deaktivieren. Haben Sie die Sicherheitsstufe auf Hoch gesetzt und ist das Kontrollkästchen Allen installierten Add-Ins und Vorlagen vertrauen deaktiviert, werden alle unsignierten COM-Add-Ins und VBA-Makros automatisch deaktiviert. Deshalb wird unbedingt empfohlen, die Sicherheitseinstellung auf Hoch zu lassen und das Kontrollkästchen Allen installierten Add-Ins und Vorlagen vertrauen zu deaktivieren.

 

Ausprobieren

Zum Ausprobieren des Segment Viewer-Beispiels müssen Sie zuerst die mit diesem Artikel verknüpfte Beispieldatei (odc_xlnet.exe) herunterladen. Führen Sie anschließend das selbstextrahierende Paket aus, um das Beispiel auf Ihrem Rechner zu installieren.

 

So installieren Sie das Beispiel

Führen Sie SegmentInExcel.msi im Verzeichnis \Setup\Release aus, um das Segment Viewer-Beispiel zu installieren. Anmerkung: .NET Framework muss bereits auf dem Zielcomputer installiert sein, damit das Setup erfolgreich durchgeführt werden kann.

Durch das Setupprogramm werden die benötigten Dateien auf dem Computer des Benutzers installiert. Darüber hinaus werden die erforderlichen Assemblys in der Registrierung eingetragen, so dass COM-Clients über herkömmliche COM-APIs (Application Programming Interfaces) darauf zugreifen können.

Standardmäßig erfolgt die Installation in folgendem Verzeichnis: C:\Programme\WidgetWare\SegmentViewer (vgl. Abbildung 1). Sie können die Komponenten aber auch in einem anderen Verzeichnis installieren.

odc_xlnet01

Abbildung 1. Dialogfeld zum Auswählen des Installationsverzeichnisses

 

So verwenden Sie den Segment Viewer

Stellen Sie vor dem Ausführen des im Beispiel enthaltenen Excel-Makros sicher, dass Ihre Excel 2002-Sicherheitseinstellungen so eingestellt sind, wie im Abschnitt Ausführen eines unsignierten VBA-Makros beschrieben.

Öffnen Sie nach der Installation der Komponente im Installationsverzeichnis die Excel-Datei SampleSeg.xls Excel. Die Datei SampleSeg.xls enthält die Spezifikation für ein Ölpipelinesystem, dessen Kosten ein fiktives Unternehmen abschätzen möchte. Siehe Abbildung 2 unten.

odc_xlnet02

Abbildung 2. Das Arbeitsblatt "SampleSeg.xls"

Das Arbeitsblatt enthält Informationen zu den vier Abschnitten der Pipeline (die einzelnen Abschnitte sind grün dargestellt). Der erste Abschnitt enthält neun Segmente. Jedes einzelne Segment der Ölpipeline verfügt über eine andere Art von Verkleidung, wobei einige Segmente überhaupt keine haben.

Die Kosten für die Verkleidung pro Meter hängen von der Art des verwendeten Materials ab, wobei der Typ "Lite" (Leicht) am günstigen und der Typ "Ultra Heavy" (Sehr schwer) am teuersten ist. Am günstigsten ist es, ganz auf eine Verkleidung zu verzichten.

Somit hängen die Kosten für den Bau eines Abschnitts der Pipeline von der verwendeten Verkleidung ab sowie von der Länge des Segments, für das diese benötigt wird.

Mit dem Segment Viewer können Sie die Spezifikation bzw. die Abschnitte der Ölpipeline nicht wie üblich nur in tabellarischer Form bearbeiten, sondern auch mit einem Grafiktool. Der Segment Viewer wird durch Auswahl eines Abschnitts der Ölpipeline und Klicken mit der rechten Maustaste aktiviert.

Wählen Sie zu Übungszwecken die Zellen B13 bis B22 durch Klicken mit der rechten Maustaste aus. Der Segment Viewer wird daraufhin gestartet. Geschieht dies nicht, wurde er vermutlich nicht korrekt installiert.

odc_xlnet03

Abbildung 3. Die Segment Viewer-Komponente

Nach dem Aktivieren können Sie durch Ziehen an den Segmentbegrenzungen deren Länge ändern. Sie können auch mit der rechten Maustaste auf das Segment klicken und das Material für die Verkleidung für einen Teil des Segments ändern, vgl. Abbildung 4. Des Weiteren ist es möglich, sich die Länge der einzelnen Segmente anzeigen lassen.

Sobald Änderungen an der grafischen Darstellung vorgenommen werden, ändern sich auch die Werte des Excel-Arbeitsblattes.

odc_xlnet04

Abbildung 4. Optionen des Segment Viewer-Popupmenüs

 

Wie funktioniert das?

Die Segment Viewer-Beispielprojektmappe besteht aus drei einzelnen Projekten. Die verwalteten Komponenten sind in C# geschrieben. Öffnen Sie zum Anzeigen des Beispielcodes in der integrierten Entwicklungsumgebung (IDE, Integrated Development Environment) von Visual Studio .NET die Datei SegmentInExcel.sln. Diese befindet sich im Ordner <Installationspfad>\.

"Segment"-Steuerelement

Das Projekt Segment.csproj (im Ordner <Installationspfad>\Segment\) enthält den Code für das Segment-Steuerelement. Bei diesem handelt es sich um ein einfaches grafisches Tool zur Bearbeitung von Segmenten, das mit Excel nichts zu tun hat. Es kann auch für Nicht-Excel-Projekte eingesetzt werden.

Windows Form

Das Projekt SegmentInExcel.csproj (im Ordner <Installationspfad>\SegmentInExcel\) enthält ein Formular mit dem Segment-Steuerelement, das mit Excel interagiert. Dies ist der Teil des Tools, der während der Installation für COM-Interop-Aktionen registriert wird.

In unserem Beispiel arbeiten wir mit einer kleinen VBA-Coderoutine, über die wir die Funktionen des Projekts SegmentInExcel in das Excel-Dokument implementieren. Beim Öffnen der Datei SampleSeg.xls wird das Workbook_Open-Ereignis der Arbeitsmappe ausgelöst. Anschließend instanziiert der benutzerdefinierte Code das SegmentInExcel.WorkbookConnect-Objekt als reguläre COM-Komponente. Dann wird die BindToEvents-Methode aufgerufen, durch die die verwaltete Komponente mit Excel-Ereignissen verknüpft werden kann. Der nachfolgende VBA-Codeauszug zeigt, wie dies durchgeführt wird.

Private Sub Workbook_Open() 
... 
  Dim SegmentViewer As New SegmentInExcel.WorkbookConnect 
 SegmentViewer.BindToEvents ThisWorkbook 
...  
End Sub

Die BindToEvents-Methode registriert alle Rechtsklickereignisse, die in der Excel-Arbeitsmappe ausgeführt werden. Sobald ein Rechtsklick erfolgt, wird die WorkbookConnect.OnRightClick-Methode aufgerufen. Die OnRightClick-Methode erfasst die aktuelle Auswahl, erstellt die SegmentViewer-Komponente, übergibt die Auswahl an die SegmentViewer-Komponente und zeigt anschließend das Formular an. Der folgende Codeauszug aus der Datei WorkbookConnect.cs zeigt, wie dies realisiert wird.

public void BindToEvents(Workbook workbook) 
{ 
 worksheet = (Worksheet) workbook.Sheets[1]; 
 worksheet.BeforeRightClick +=  
  new DocEvents_BeforeRightClickEventHandler(OnRightClick); 
} 
internal void OnRightClick(Range target, ref bool cancel) 
{ 
 try 
 { 
  if (target.Rows.Count < 2) 
   return; 
   cancel = true; 
   SegmentViewer sv = new SegmentViewer(); 
   sv.SetRanges(target); 
   sv.ShowDialog(); 
 } 
 catch (Exception e) 
 { 
  MessageBox.Show(e.Message, "Segment Viewer"); 
 } 
}

Das Formular SegmentViewer (vgl. SegmentViewer.cs-Datei) parst die Auswahl und erstellt ein Array von Segment-Objekten, die an das Steuerelement übergeben werden (vgl. die Dateien Control.cs und Segment.cs). Diese werden wie im nachfolgenden Codeauszug aus der Datei Segment.cs beschrieben:

... 
Segment[] Segs = new Segment[RowCount]; 
for (int r = 1; r <= RowCount; r++)  
{ 
 Segs[r - 1] = new Segment( 
  (ArmorType)GetInt(ContentRng, GetAddr(3, r)), 
  GetInt(ContentRng, GetAddr(1, r)), 
  GetInt(ContentRng, GetAddr(2, r))); 
 } 
 this.SegmentCtrl.SetSegments(Segs); 
...

Werden die Trennlinien verschoben, gibt das Steuerelement ein Ereignis an den Segment Viewer aus, der wieder das über COM-Interop offen gelegte Excel-Objekt verwendet, um die Werte in der aktuellen Auswahl auf dem Arbeitsblatt zu aktualisieren.

Der dazugehörige Beispielcode verfügt über umfassende Kommentare, die jeden nicht selbstverständlichen Schritt des Programms erklären. Sehen Sie sich die Dateien Control.cs und Segment.cs an, um herauszufinden, wie das Segment Viewer-Steuerelement funktioniert.

Setupprojekt

Das dritte Projekt ist das Setupprojekt, das die Datei setup.exe erstellt. Dieses Projekt installiert die Assemblys Segment.dll und SegmentInExcel.dll auf dem Computer des Benutzers. Darüber hinaus legt es Einträge in der Registrierung an, damit das SegmentInExcel.WorkbookConnect-Objekt von COM erstellt werden kann. Es registriert zudem die Typenbibliothek, um eine Automatisierung zu ermöglichen.

Die beiden Assemblys Segment.dll und SegmentInExcel.dll werden auf dem Computer des Benutzers in demselben Ordner gespeichert. Dadurch ist es der Common Language Runtime (CLR) möglich, die Segment.dll-Assembly zu finden, wenn sie über die SegmentInExcel.dll-Assembly aufgerufen wird, ohne dass die Assembly Segment.dll im globalen Assemblycache (GAC) gespeichert werden muss.

In unserem Beispiel werden die folgenden Office XP-PIAs eingesetzt:

  • Microsoft.Office.Interop.Excel.dll

  • Microsoft.Vbe.Interop.dll

  • Office.dll

  • Stdole.dll

Diese sind im Setupprojekt enthalten, so dass Benutzer die Office XP-PIAs nicht bereits auf ihren Computern installiert haben müssen. Dieses Verfahren wird generell für die Weitergabe von Projektmappen empfohlen, die auf Office XP-PIAs basieren. Projektmappen, die auf diesem Wege verbreitet werden, installieren und registrieren automatisch die benötigten Office XP-PIAs im globalen Assemblycache (GAC). Darüber hinaus werden auf diese Weise doppelt vorhandene Office XP-PIAs auf den Computern der Benutzer vermieden.

Weitere Informationen zum Hinzufügen von Office XP-PIAs zum Setupprojekt finden Sie im Abschnitt "Distributing solutions that rely on the Office XP PIAs" in der Infodatei Microsoft Office XP Primary Interop Assemblies (PIAs) (in Englisch).

Das Setupprojekt legt auch die Startbedingungen fest, die ermitteln, ob .NET Framework installiert ist. Ist keine Installation vorhanden, wird eine Fehlermeldung ausgegeben.

 

Überlegungen zur Sicherheit. Mögliche Sicherheitsrisiken

Tabelle 1 beschreibt das Verhalten von Office XP-Anwendungen beim Laden von Add-Ins und Makros. Sie verdeutlicht, wie Office das Risiko minimiert, gefährliche Komponenten zu laden, indem die Identität des Verlegers geprüft und explizite vertrauensbasierende Entscheidungen getroffen werden.

Die nachfolgende Tabelle listet die verfügbaren Sicherheitseinstellungen von Microsoft Office XP einschließlich des entsprechenden Verhaltens im Dialogfeld Sicherheit (Menü Extras, Option Makros) auf.

Tabelle 1. Matrix der Sicherheitseinstellungen von Microsoft Office XP

Office XP-Sicherheitseinstellungen

Sicherheitsstufe

Kontrollkästchen "Allen installierten Add-Ins und Vorlagen vertrauen"

Digital signiert

Aus vertrauenswürdigen Quellen

Office XP führt folgende Aufgaben aus:






Hoch






Deaktiviert

Ja



Ja



Nein

Ja



Nein



N/V

Lädt das Add-In oder Makro

Fordert auf, das Add-In oder Makro zu aktivieren bzw. zu deaktivieren

Lädt das Add-In oder Makro nicht






Mittel






Deaktiviert

Ja



Ja



Nein

Ja



Nein



N/V

Lädt das Add-In oder Makro

Fordert auf, das Add-In oder Makro zu aktivieren bzw. zu deaktivieren

Lädt das Add-In oder Makro nicht

Niedrig

Deaktiviert

Ja oder Nein

Ja oder Nein

Lädt das Add-In oder Makro

Hoch, Mittel oder Niedrig

Aktiviert

Ja oder Nein

Ja oder Nein

Lädt das Add-In oder Makro

Anmerkung:
Die Verfügbarkeit des Dialogfelds Sicherheit sowie die darin enthaltenen Optionen hängen von der installierten Office-Version ab. Darüber hinaus laden bestimmte Office-Anwendungen signierte Add-Ins und Makros zusammen mit registrierten COM-Add-Ins und Smarttag-Erkennungsfunktionen nur aus bestimmten Verzeichnissen. Weitere Informationen finden Sie im Microsoft Office XP Macro Security White Paper (in Englisch).

Zur Verdeutlichung der Sicherheitsaspekte, die mit dem Implementierungsverfahren verbunden sind, verwenden wir eine Analogie.

Dabei vergleichen wir das Office-Sicherheitsmodell mit einer privaten Party. Der Zutritt zu dieser Party wird von einem Türsteher überwacht. Dieser überprüft die Identität der Gäste und lässt nur die herein, die auf der Gästeliste stehen (also nur diejenigen, die vom Gastgeber als vertrauenswürdig angesehen und eingeladen wurden). Eine Überprüfung der Mitbringsel der Gäste findet nicht statt, da der Türsteher den Personen vertraut, die sich entsprechend ausweisen können.

Nehmen wir an, einer der Gäste bringt ohne böse Absicht einen Scherzartikel mit, den er auf der Party vorführen möchte. Während diese in vollem Gange ist, holt er den Artikel hervor und zeigt ihn den anderen Gästen. Dies ist für ihn Teil des Partyspaßes.

Stellen wir uns nun einmal vor, auf dem Weg zur Party wurde der eigentlich harmlose Artikel gegen einen gefährlichen ausgetauscht. Da niemand überprüft, ob es sich bei dem Scherzartikel um das Original handelt, liegt nun eine Gefährdung der Gäste vor.

Ähnliches kann auch mit Office-Makros und -Add-Ins passieren. Ob Office XP ein VBA-Makro (signiert oder unsigniert) lädt oder nicht, hängt von den Sicherheitseinstellungen aus Tabelle 1 ab. Werden sie jedoch für die Ausführung zugelassen, wird nicht mehr darauf geachtet, welche Aktionen sie durchführen. Es liegt nun in der Verantwortung der Add-Ins sicherzustellen, dass nur geprüfte Komponenten verwendet werden. Das VBA-Makro entspricht dem "vertrauenswürdigen" Gast aus der Analogie, wobei der verwaltete Code den "Original-Scherzartikel" und der "Ersatzscherzartikel" den gefährlichen verwalteten Code darstellt.

Im Segment Viewer-Beispiel geschieht ein solcher Austausch nicht. Im oben dargestellten VBA-Makrocode wird eine Klasse von einem anderen Modul geladen und ausgeführt (in diesem Fall einem Modul einer verwalteten Komponente), ohne die Integrität des Moduls zu überprüfen, das heißt ohne festzustellen, ob das Modul verändert wurde oder nicht. In der Tat ist diese Überprüfung ohne ein explizites Hosting der Common Language Runtime (CLR) nicht ganz einfach durchzuführen, wie im folgenden Artikel aufgezeigt: Weitergabe von verwalteten COM-Add-Ins in Office XP.

Die Möglichkeit einer solchen "Attacke" ist jedoch ziemlich gering. Denn nachdem eine Assembly auf einem Computer installiert und registriert wurde, muss der Angreifer, um eine Attacke auszuführen, auf die Festplatte zugreifen können, um die Assembly durch eine andere auszutauschen. Und ehrlich gesagt: Hat es ein Angreifer tatsächlich geschafft, auf die lokale Festplatte zuzugreifen, wird er vermutlich wesentlich schlimmere Aktionen durchführen als nur den Austausch der Datei Excel.exe gegen eine gefährliche Excel-Anwendung.

Die Entscheidung, ob Sie die vorgestellten Verfahren verwenden möchten, liegt bei Ihnen. Sie sollten abwägen, ob Sie dieses relativ einfache, aber aufwändige Verfahren in Ihrem Unternehmen einsetzen möchten, um Ihre Anwendungen zu schützen.

 

Schlussfolgerung

Mithilfe der Interop-Dienste von COM (Component Object Model), die von der Common Language Runtime (CLR) zur Verfügung gestellt werden, können Sie verwalteten Code so aktivieren, dass er von COM bzw. dass COM-Code von verwalteten Anwendungen eingesetzt werden kann. Allerdings gibt es dabei einige Sicherheitsaspekte, die Sie beim Implementieren einer solchen Lösung beachten sollten.

Weitere Informationen

Nachfolgend einige hilfreiche Artikel zu den Themen PIAs, .NET-Sicherheit, .NET und COM-Interop usw., in denen Sie weitere nützliche Informationen finden.

Microsoft Office XP Primary Interop Assemblies (PIAs) (in Englisch)
Einführung in COM-Interop
Primary Interop Assemblies (PIAs) (in Englisch)
Weitergabe von verwalteten COM-Add-Ins in Office XP
Microsoft Office XP Macro Security White Paper (in Englisch)
Häufig gestellte Fragen zu Microsoft .NET Framework
Microsoft .NET/COM Migration and Interoperability (in Englisch)
Interop
Offenlegen von .NET Framework-Komponenten in COM
Code Signing Office XP Visual Basic For Applications Macro Projects (in Englisch)
Aufrufen einer .NET-Komponente von COM
Calling COM Components from .NET Clients (in Englisch)