Projekt „Kundenserver“

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.

HP Thin ClientZunä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:

  1. Es erstellt ein zufällig generiertes Verzeichnis auf dem Laufwerk K:.
  2. Die ausgewählte Datei wird in dieses Verzeichnis kopiert, wobei der Fortschritt angezeigt wird.
  3. Anschließend öffnet sich ein Textfeld, das den direkten Link zur Datei enthält.
  4. 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:

Kontextmenü

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.
Registry

 

 

3 Gedanken zu „Projekt „Kundenserver““

  1. 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.

  2. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert