PDF Drucken E-Mail

ActiveX-Dateien unter Vista registrieren

Mit ActiveX-Dateien hat man unter Vista kein leichtes Leben. 
Während man unter Windows XP zum Registrieren einer solchen DLL- oder OCX-Datei mit der dafür vorgesehenen Befehlszeilenanweisung regsvr32 schnell zum Ziel kommt, wenn man gerade als Administrator im System angemeldet ist, was bei Entwicklern häufig der Fall ist, macht einem die Benutzerkontensteuerung von Vista einen Strich durch die Rechnung.

Bei der Weitergabe von ActiveX-Komponenten - etwa COM-Addins, wie sie auf mossTOOLs zu finden sind -, reicht unter XP zum Registrieren eine einfache Batchdatei aus:

regsvr32 DieActiveX.DLL

Dieselbe Anweisung kann man genauso an die Befehlszeile absetzen, indem man sie im "Ausführen..."-Dialog von Windows eingibt. 
Auch dann, wenn man nicht als Administrator angemeldet ist, lässt sich die Batchdatei ausführen, wenn man in ihren Eigenschaften angibt, dass sie unter anderem Konto gestartet werden soll.
Das lässt sich sogar mit der Konsolenanweisung runas direkt in die Batchdatei einbauen.

Unter Vista führt all dies nicht zum Ziel:

  • Ein Start der Batchdatei über Rechtsklick und "Als Administrator ausführen" führt zu einer Fehlemeldung, weil die angegebene DLL-Datei nicht gefunden wird. Grund ist, dass die Kommandozeile des Administrators unter Vista immer das Root-Verzeichnis  windows\system32 hat.
    Falls sich die DLL nicht zufällig dort befindet, weiß die Kommandozeile nichts vom Verzeichnis, in dem die Batchdatei rechtsgeklickt wurde.
    Allerdings gibt es dafür eine Lösung mit veränderter Kommendozeilensyntax (s.u.).
  • Einträge in die Registry über regsvr32.exe sind nur erlaubt, wenn diese Datei im Adminstratorkontext ausgeführt wird. Sonst schlägt die Registrierung mit einer Meldung fehl, wie sie in der folgenden Abbildung zu sehen ist.

    Registrierung einer ActiveX-Komponente schlägt unter Vista fehl

    Der gemeldete Fehlercode bezieht sich auf fehlende Berechtigung zum Schreiben in die entsprechenden Zweige in der Registry.
  • Auch die Konsolenanweisung runas hilft nicht weiter, weil sich damit regsvr32 leider nicht "elevieren" lässt.

Damit funktionieren nun auch Hilfsskripte nicht mehr, die für DLLs und OCXe Shell-Erweiterungseinträge in die Registry einbauen, über die man dann im Explorer und Rechtsklick auf eine ActiveX-Datei unter XP die Registrierung vornehmen konnte.

Was tun?

Eine mögliche Lösung ist im Folgenden beschrieben.

  • Kopieren Sie die regsvr32.exe vom Windows-Systemverzeichnis in das Windows-Verzeichnis. Also normal von c:\windows\system32 nach c:\windows .
  • Benennen Sie die kopierte Datei in regsvradmin.exe um.
  • Rechtsklicken Sie die Datei und gehen auf Eigenschaften/Kompatibilität.
    Aktivieren Sie dort "Programm als ein Administrator ausführen".
  • Kopieren Sie die folgenden Zeilen in eine Textdatei und speichern diese irgendwo unter regsvradmin.reg ab.
  • Doppelklicken Sie die .reg-Datei und fügen damit deren Inhalt der Registry hinzu, wobei Sie beharrlich die Warnmeldungen von Vista ignorieren.
  • Nach dem nächsten Öffnen eines Explorer-Fensters - es müssen zuvor allen möglicherweise offenen geschlossen werden -, finden sich jetzt für Dateien des Types DLL und OCX neue Einträge "Register ActiveX DLL" und "Register OCX Control" und deren Pendants zu Deregistrieren im Kontextmenü.
  • Über diese Einträge können Sie nun in Zukunft komfortabel ActiveX-Dateien beliebiger Art registrieren und deregistrieren.

Dabei übernimmt nun nicht mehr die regsvr32.exe diese Aufgabe, sondern die kopierte regsvradmin.exe.
Vorteil: Das System bleibt so vor Modifikationen der regsvr32.exe bzw. deren Berechtigungen verschont.

REGEDIT4
[HKEY_CLASSES_ROOT\.dll]
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile\shell\regdll]
@="Register ActiveX DLL"
[HKEY_CLASSES_ROOT\dllfile\shell\regdll\command]
@="regsvradmin.exe \"%L\""
[HKEY_CLASSES_ROOT\dllfile\shell\unregdll]
@="Unregister ActiveX DLL"
[HKEY_CLASSES_ROOT\dllfile\shell\unregdll\command]
@="regsvradmin.exe /u \"%L\""
[HKEY_CLASSES_ROOT\.ocx]
@="ocxfile"
[HKEY_CLASSES_ROOT\ocxfile\shell\regocx]
@="Register OCX Control"
[HKEY_CLASSES_ROOT\ocxfile\shell\regocx\command]
@="regsvradmin.exe \"%L\""
[HKEY_CLASSES_ROOT\ocxfile\shell\unregocx]
@="Unregister OCX Control"
[HKEY_CLASSES_ROOT\ocxfile\shell\unregocx\command]
@="regsvradmin.exe /u \"%L\""

 

Lösung mit modifizierter Kommandozeilensyntax für regsvr32 in Batch-Dateien

Wie oben beschrieben, muss eine Batch-Datei zum Registrieren einer ActiveX-Komponente im Administratorkontext aufgerufen werden.
Unter Vista schaltet die Shell dabei in den Windows-Systemordner und macht diesen zum aktuellen Verzeichnis.
Damit man regsvr32 nun mitteilen kann, in welchem Verzeichnis sich die zu registrierende Datei befindet, gibt es einen Trick. Statt

regsvr32 DieActiveX.DLL

schreibt man diesen Aufruf in die Batch-Datei, wenn sich die ActiveX-Komponente im selben Verzeichnis befindet:

regsvr32 "%~dp0\DieActiveX.DLL"
Erklärung:
  • Der Parameter % ist eine spezielle Kommendozeilenoption, die den Namen der ausgeführten Batchdatei zurückgibt.
  • ~ sagt der Shell, dass der von % zurückgegebene Wert einer Modifikation unterzogen werden soll
  • d bedeutet "Drive" und gibt den Laufwerksbuchstaben zurück
  • p0 bedeutet "Path" und gibt den Pfadanteil zurück

Lautet der Pfad der Batchdatei etwa "d:\testordner\test.bat", dann gibt die Anweisung "%~dp0" den Wert "d:\testordner" zurück

Das Ganze läuft auch unter Windows 2000 und Windows XP.

 

Ihren Kommentar hinzufügen

Ihr Name:
Betreff:
Kommentar:
  Bild, welches den Sicherheitscode enthält
Sicherheitscode: