Das Ziel bestand darin, den Mitarbeitern eines Unternehmens eine unkomplizierte Möglichkeit zu bieten, größere Dateien mit Kunden oder anderen Firmen auszutauschen. Dabei sollte idealerweise gewährleistet sein, dass die Daten im eigenen Unternehmen verbleiben und vom Kunden direkt heruntergeladen werden können, ohne dass ein Upload auf externe Server notwendig ist.
Zunächst musste ein Server bereitgestellt werden, der die Dateien zur Verfügung stellt. Für diesen Zweck eignen sich besonders Thin Clients oder kleine Barebones, da sie kompakt sind, wenig Strom verbrauchen und gebraucht zu einem sehr günstigen Preis erhältlich sind. Über eBay habe ich beispielsweise einen gebrauchten HP Thin Client T5530 für etwa 20 Euro erworben.
Technische Daten: VIA Eden 800 MHz CPU, 256MB RAM und 128MB Flash Speicher. Für diesen Zweck war der Thin Client völlig ausreichend. Das einzige Problem war der begrenzte Speicherplatz von 128 MB, der nicht ausreichte, um eine gängige Linux-Distribution zu installieren. Daher musste das Modul durch eine größere Speicherlösung ersetzt werden. Ich entschied mich für ein 4GB KingSpec SSD IDE PATA 44-Pin-Modul. Die eigentlichen Dateien werden auf einem 32GB USB-Stick gespeichert.
Als Betriebssystem entschied ich mich für Debian in der Version „Wheezy“. Debian hat sich für mich in der Vergangenheit bei Serveranwendungen stets bewährt, weshalb es auch diesmal meine erste Wahl war.
Nachdem das Betriebssystem eingerichtet war, installierte ich Samba, um den Server als Netzlaufwerk für die Windows-Rechner im Unternehmen einzubinden. Damit auch Kunden die Dateien herunterladen konnten, benötigte ich zusätzlich eine Lösung für einen Fileserver. Ein Webserver schien mir dafür ideal, unter anderem, weil ich plante, ein paar PHP-Skripte für Statistiken und ähnliche Zwecke zu schreiben. Daher installierte ich den Apache-Webserver und legte das Document Root auf dasselbe Verzeichnis, das auch als Samba-Freigabe verwendet wurde. Damit war der Server im Grunde einsatzbereit.
Jetzt zum Kern des Blogposts: Der Prozess des „Dateifreigebens“ sollte für die Mitarbeiter so einfach wie möglich gestaltet sein. Was könnte einfacher sein als ein Rechtsklick mit der Option „Datei freigeben“? Glücklicherweise lassen sich über die Windows-Registry relativ einfach neue Einträge für das Kontextmenü erstellen – dazu später mehr. Zunächst benötigten wir ein Skript, das die Datei vom lokalen Rechner auf den Server kopiert.
Die Samba-Freigabe des Servers war als Laufwerk K: eingebunden, sodass die Dateien dorthin kopiert werden sollten. Dafür gab es mehrere Optionen; ich entschied mich für VBScript. Der Einfachheit halber speichern wir das Skript unter D:\share.vbs
(der Speicherort ist beliebig, solange der Benutzer und der Rechner Zugriff darauf haben):
set oArgs = Wscript.Arguments if oArgs.count = 0 then wscript.echo "Keine Datei angegeben" wscript.quit end if Set fso = CreateObject("Scripting.FileSystemObject") ' Zielverzeichnis zufällig generieren DestDir = GetRandom(8) Src = WScript.Arguments(0) Dest = "K:\" & DestDir ' Zielverzeichnis erstellen falls es nicht existiert If Not fso.FolderExists(Dest) Then fso.CreateFolder Dest End If ' Datei kopieren CopyFileProgress Src, Dest Set SourceFile = fso.GetFile(WScript.Arguments(0)) ' Download Link generieren ' Hier muss die Domain oder die öffentliche IP des Servers angegeben werden Dim myUrl myUrl = "http://mein.kundenserver.xy/" & DestDir & "/" & URLEncode(fso.GetFileName(SourceFile)) rtrn = InputBox("Download Link für Datei, mit Strg-C kopieren:", "Download Link", myUrl) Set fso = Nothing Function GetRandom(Count) Randomize For i = 1 To Count If (Int((1 - 0 + 1) * Rnd + 0)) Then GetRandom = GetRandom & Chr(Int((90 - 65 + 1) * Rnd + 65)) Else GetRandom = GetRandom & Chr(Int((57 - 48 + 1) * Rnd + 48)) End If Next End Function Function CopyFileProgress(Src, Dest) Const FOF_SILENT = &H4& Const FOF_RENAMEONCOLLISION = &H8& Const FOF_NOCONFIRMATION = &H10& Const FOF_ALLOWUNDO = &H40& Const FOF_FILESONLY = &H80& Const FOF_SIMPLEPROGRESS = &H100& Const FOF_PROGRESSWITHFILENAME = &H0& Const FOF_NOCONFIRMMKDIR = &H200& Const FOF_NOERRORUI = &H400& Const FOF_NOCOPYSECURITYATTRIBS = &H800& Const FOF_NORECURSION = &H1000& Const FOF_NO_CONNECTED_ELEMENTS = &H2000& cFlags = FOF_SIMPLEPROGRESS + FOF_NOCONFIRMATION Set oFSO = Createobject("Scripting.FileSystemObject") Set oShell = CreateObject("Shell.Application") If Not oFSO.FolderExists(Dest) Then oFSO.CreateFolder(Dest) Set oFolder = oShell.NameSpace(Dest) oFolder.CopyHere Src, cFlags End Function Function urlEncode(str) str = Replace(str, "%", "%25") str = Replace(str, "/", "%2F") str = Replace(str, "|", "%7C") str = Replace(str, "?", "%3F") str = Replace(str, "!", "%21") str = Replace(str, "@", "%40") str = Replace(str, "\", "%5C") str = Replace(str, "#", "%23") str = Replace(str, "$", "%24") str = Replace(str, "^", "%5E") str = Replace(str, "&", "%26") str = Replace(str, "*", "%2A") str = Replace(str, "(", "%28") str = Replace(str, ")", "%29") str = Replace(str, "}", "%7D") str = Replace(str, ":", "%3A") str = Replace(str, ",", "%2C") str = Replace(str, "{", "%7B") str = Replace(str, "+", "%2B") ' str = Replace(str, ".", "%2E") str = Replace(str, "-", "%2D") str = Replace(str, "~", "%7E") str = Replace(str, "-", "%2D") str = Replace(str, "[", "%5B") str = Replace(str, "_", "%5F") str = Replace(str, "]", "%5D") str = Replace(str, "`", "%60") str = Replace(str, "=", "%3D") str = Replace(str, "'", "%27") str = Replace(str, " ", "%20") str = Replace(str, Chr(34), "%22") ' Umlaute str = Replace(str, "Ö", "%C3%96") str = Replace(str, "Ä", "%C3%84") str = Replace(str, "Ü", "%C3%9C") str = Replace(str, "ö", "%C3%B6") str = Replace(str, "ä", "%C3%A4") str = Replace(str, "ü", "%C3%BC") str = Replace(str, "ß", "%C3%9F") urlEncode = str End Function
Die Funktion urlEncode
stellt sicher, dass alle Sonderzeichen, einschließlich Leerzeichen, in URL-konforme Zeichen umgewandelt werden.
Das Skript führt folgende Schritte aus:
- Es erstellt ein zufällig generiertes Verzeichnis auf dem Laufwerk
K:
. - Die ausgewählte Datei wird in dieses Verzeichnis kopiert, wobei der Fortschritt angezeigt wird.
- Anschließend öffnet sich ein Textfeld, das den direkten Link zur Datei enthält.
- Der Kunde kann die Datei über diesen Link herunterladen.
Nun zum letzten Schritt – dem Hinzufügen des Kontextmenü-Eintrags. Dafür erstellen Sie am besten eine Textdatei mit dem Namen share.reg
und folgendem Inhalt (Speicherort ist beliebig):
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\Datei freigeben (Kundenserver)\command] @="wscript.exe \"D:\\share.vbs\" \"%1\""
Wichtig hier die Pfadangabe zum Script, hier D:\share.vbs.
Ein Doppelklick auf die Datei fügt den Eintrag zur Registry hinzu, wodurch der Kontextmenüeintrag sichtbar wird:
Ein Icon für den Kontextmenüeintrag kann ebenfalls hinzugefügt werden, wie im Beispielbild zu sehen ist. Dafür öffnet man mit regedit den Pfad HKEY_CLASSES_ROOT\*\shell\Datei freigeben (Kundenserver)
und erstellt dort eine neue Zeichenfolge mit dem Namen „Icon“, in der der Pfad zum gewünschten Icon angegeben wird.
Klasse Lösung – Super Idee und gut umgesetzt.
Wir haben alles auf Webserverbasis programmiert, aber die VB-Einbindund in den Explorer fehlt uns. Dafür können Kunden us auch Daten zusenden.
Danke Franz!
Eine Owncloud-Installation wäre viel einfacher gewesen. Damit hat man die Kontext-Menü Einträge direkt ohne Programmieren. Außerdem hätte man eine Versionsverwaltung und Rechteverwaltung (Kunde darf Link teilen, bearbeiten, oder eben nicht). Es gibt aber noch viele andere Vorteile. Es gibt sogar Android und iOS Apps.