Robert: Firefox, lokale Seite und der Windows-Explorer

Hallöle,

ein Perl-Script generiert mir eine Liste von Dateien (nach bestimmten Kriterien ausgewählt, sind also nicht alle auf der Festplatte vorhandenen) als HTML-Datei (damit ich mit CSS verschiedene farbige Hervorhebungen machen kann, je nachdem, was mit der jeweiligen Datei als nächstes geschehen muß).
Am Ende des Programmlaufs ruft es die HTML-Datei auf, so daß diese im Standardbrowser aufgerufen wird (beim geschlossenen Benutzerkreis ist das der Firefox).

Da die auszulösenden Aktionen im Windows-Datei-Explorer auf den betroffenen Rechnern sowieso schon im Context-Menü liegen, wäre es jetzt sehr praktisch, wenn ich per Link bei der jeweiligen Datei direkt einen Windows-Datei-Explorer (KEINEN Internet-Explorer) öffnen könnte (ich hab keine Lust, per serverseitiger Logik das gesamte Explorer-Kontext-Menü nochmal nachzubauen).

Mein naiver Ansatz war:
<a href='file:///c:/bla/blubb/'>Explorer</a>

Leider öffnet das aber nicht den Windows-Datei-Explorer, sondern listet das Verzeichnis c:/bla/blubb/ direkt im Firefox auf (natürlich ohne das Explorer-Kontext-Menü zur Verfügung zu stellen.

Gibt es einen Trick, doch den Explorer mit dem passenden Ordner zu öffnen?
Wenn ja, welchen?

Wie gesagt, es muß nur aus einer lokalen Datei (file:///c:/bla/fasel.html) heraus auf einer Handvoll Rechner der Kollegen funktionieren. Es muß nicht aus einer Internet-Seite heraus funktionieren.

Firefox ist der aktuelle 2.0.0.1, Windows ist XP mit allen Servicepacks und Sicherheits-Update. Den Quellcode für den Link kann ich generieren wie ich will, das Perl-Script ist von mir.

cu,
Robert

  1. Hallo,

    Gibt es einen Trick, doch den Explorer mit dem passenden Ordner zu öffnen?
    Wenn ja, welchen?

    Das Mozilla XPCOM interface und JavaScript. Mit allen seinen unschönen, MS-ActiveX ähnlichen, sicherheitskritischen Nebeneffekten (siehe unten).

    Wie gesagt, es muß nur aus einer lokalen Datei (file:///c:/bla/fasel.html) heraus auf einer Handvoll Rechner der Kollegen funktionieren. Es muß nicht aus einer Internet-Seite heraus funktionieren.

    Siehe http://developer.mozilla.org/en/docs/Code_snippets:Running_applications, Beispiel:

      
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  
            "http://www.w3.org/TR/html4/strict.dtd">  
    <html>  
    <head>  
    <title>Beschreibung der Seite</title>  
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">  
    <script type="text/javascript">  
    <!--  
    function execute_app(complete_app_path, args) {  
       try {  
          netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");  
          try{  
             var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);  
             file.initWithPath(complete_app_path);  
             var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);  
             process.init(file);  
             process.run(true, args, args.length);  
          } catch(e2) {  
             alert(e1);  
          }  
       } catch(e1) {  
          alert(e1);  
       }  
    }  
    //-->  
    </script>  
    </head>  
    <body>  
    <button onclick="execute_app('C:\\Winnt\\explorer.exe', new Array('C:\\www\\docs\\'))">StartApp</button>  
    </body>  
    </html>  
    
    

    Im Kontext des file://-Protokolls aufgerufen, wirft das eine Sicherheitswarnung, die man mit [Erlauben] bzw. [Ablehnen] beantworten kann. Mit einem Haken bei "Diese Entscheidung merken" kann ab nun _diese Ressource_ immer auf UniversalXPConnect zugreifen. Zu netscape.security.PrivilegeManager.enablePrivilege siehe http://www.mozilla.org/projects/security/components/jssec.html#privs. Der Eintrag erfolgt in der prefs.js im Nutzerprofil von Mozilla. Dort steht dann:

    user_pref("capability.principal.codebase.p0.granted", "UniversalXPConnect");
    user_pref("capability.principal.codebase.p0.id", "file://");
    user_pref("capability.principal.codebase.p0.subjectName", "");

    oder eben

    user_pref("capability.principal.codebase.p0.denied", "UniversalXPConnect");
    user_pref("capability.principal.codebase.p0.id", "file://");
    user_pref("capability.principal.codebase.p0.subjectName", "");

    Bei weiteren Ressourcen wird aus p0 dann p1, p2 usw. Mir ist es allerdings noch nicht gelungen einen Zusammenhang zwischen diesen p0, p1 usw. und den Ressourcen herzustellen. Will man die Frage nach [Erlauben] oder [Ablehnen] wieder haben, muss man alle Zeilen

    user_pref("capability.principal.codebase.px

    löschen.

    viele Grüße

    Axel

    1. Hallo,

      Korrektur:

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
              "http://www.w3.org/TR/html4/strict.dtd">
      <html>
      <head>
      <title>Beschreibung der Seite</title>
      <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
      <script type="text/javascript">
      <!--
      function execute_app(complete_app_path, args) {
         try {
            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
            try{
               var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
               file.initWithPath(complete_app_path);
               var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
               process.init(file);
               process.run(true, args, args.length);
            } catch(e2) {

      alert(e2);

      }
         } catch(e1) {
            alert(e1);
         }
      }
      //-->
      </script>
      </head>
      <body>
      <button onclick="execute_app('C:\Winnt\explorer.exe', new Array('C:\www\docs\'))">StartApp</button>
      </body>
      </html>

        
      viele Grüße  
        
      Axel
      
    2. Hallo Axel,

      Das Mozilla XPCOM interface und JavaScript. Mit allen seinen unschönen, MS-ActiveX ähnlichen, sicherheitskritischen Nebeneffekten (siehe unten).

      damit sollte es doch auch möglich sein (auf einem Windows Client) den Windows Scripting Host anzusprechen - und damit die gleichen schönen Dinge zu tun, wie mit dem IE und VB-Script bzw. JScript. Ich sollte mal meine Testseite zu VB-Script erweitern.

      Danke für die schönen Hinweise.

      Vinzenz

      1. Hallo,

        damit sollte es doch auch möglich sein (auf einem Windows Client) den Windows Scripting Host anzusprechen

        Hm, mit [nsILocalFile.launch() kannst Du eine im lokalen Dateisystem abgelegte *.js bzw. *.vbs Datei aufrufen. Per process (Components.interfaces.nsIProcess) allerdings nicht. Da müsstest Du cmd.exe mit den entsprechenden Parametern starten. Oder schwebte Dir da jetzt was ganz anderes vor?

        • und damit die gleichen schönen Dinge zu tun, wie mit dem IE und VB-Script bzw. JScript.

        *g* Naja, ich sehe die Schönheit dieser "schönen Dinge" nicht ganz so optimistisch. Wie gesagt, der Nutzer muss wissen, was er da tut, wenn er file://-Ressourcen etwas erlaubt oder verbietet oder wenn er einem signierten Script etwas erlaubt oder verbietet, oder der Admin liefert die Firefoxe gleich entsprechend angepasst (prefs.js) aus. Letzters geht aber nur mit sehr eng eingeschränkten Nutzergruppen in einem firmeninternen Netz mit Domänenmitgliedern oder AD-Mitgliedern als Clients. Bei einem Intranet, welches dann auch eventuell von zu Hause aus und vom Hotel aus und vom Kunden aus greifbar sein soll, wird das schon wieder schwierig.

        viele Grüße

        Axel

    3. Hallöle,

      Gibt es einen Trick, doch den Explorer mit dem passenden Ordner zu öffnen?
      Wenn ja, welchen?
      Das Mozilla XPCOM interface und JavaScript. Mit allen seinen unschönen, MS-ActiveX ähnlichen, sicherheitskritischen Nebeneffekten (siehe unten).

      Muchachos Garcia!

      Funktioniert nach leichten Anpassungen (Pfad für Explorer ...) wunderprächtig!

      Danke für den wirklich guten Tipp!

      cu,
      Robert