Projekt „Kundenserver“

Ziel war es, den Mitarbeitern einer Firma eine einfache Möglichkeit zu schaffen, größere Dateien mit Kunden bzw. anderen Firmen zu teilen. Idealerweise bleiben die Daten im Haus und werden vom Kunden direkt heruntergeladen, somit muss kein Upload auf einen externen Server erfolgen.

HP Thin ClientGut, als erstes musste ein Server organisiert werden der diese Daten zur Verfügung stellen soll. Für solche Zwecke bieten sich Thin Clients oder kleine Barebones an – die sind klein, brauchen wenig Strom und sind gebraucht sehr günstig zu bekommen. Ich habe bei E-Bay einen alten HP Thin Client T5530 um ~ € 20,00 ergattert.

Technische Daten: VIA Eden 800 MHz CPU,  256MB RAM und 128MB Flash Speicher. Für diese Zwecke also völlig ausreichend, einziges Problem: Die 128MB Speicher sind zu wenig um eine vernünftige Linux Distribution zu installieren, daher musste dieser gegen ein größeres Modul getauscht werden. Ich habe mich für das 4GB KingSpec SSD IDE PATA 44 Pin Modul entschieden. Die eigentlichen Daten werden auf einem 32GB USB Stick gespeichert.

Als Betriebssystem wählte ich Debian, in der aktuellen Version „Wheezy“. Debian hat mir bisher immer treue Dienste erwiesen wenn es um solche Server Geschichten ging, daher war es auch diesmal wieder die erste Wahl für mich.

Danach noch Samba installiert und schon konnte die Kiste als Netzlaufwerk bei den Windows Rechnern eingebunden werden. Damit sich die Kunden die Dateien auch herunterladen können, war noch irgendeine Art von Fileserver notwendig. Ein Webserver erschien mir da am sinnvollsten, u.a. weil ich mir noch ein paar PHP Scripts für Statistiken etc. schreiben wollte. Also den Apache noch installiert und das Wurzelverzeichnis (Document Root) auf das selbe Verzeichnis gesetzt in dem auch die Samba Freigabe liegt. Somit war der Server im Grunde fertig und lauffähig.

Nun aber zum eigentlichen Thema dieses Blogposts: Der ganze Prozess des „Datei freigebens“ sollte für die Mitarbeiter so einfach wie möglich sein. Was wäre also einfacher als zu sagen „Rechtsklick -> Datei freigeben“? 🙂 Glücklicherweise lassen sich über die Windows Registry sehr einfach neue Kontextmenü Einträge erstellen – dazu aber später. Zuerst brauchen wir ein Script das uns die Datei von A nach B (auf den Server) kopiert.

Die Samba Freigabe des Servers ist als Laufwerk K: eingebunden, dort hin sollen die Dateien also kopiert werden. Dafür gäbe es mehrere Möglichkeiten, ich habe mich für VBScript entschieden. Der Einfachheit halber speichern wir das Script unter D:\share.vbs ab (wo es gespeichert wird ist egal, der User/Rechner muss nur darauf Zugriff 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

Über die Funktion urlEncode wird sichergestellt dass jegliche Sonderzeichen (auch Leerzeichen) URL konform umgewandelt werden. Gibt bestimmt elegantere Wege diese nicht vorhandene VBScript Funktion nachzubilden aber sie funktioniert 😉

Dieses Script macht, sobald es über das Kontextmenü aufgerufen wird, folgendes:

  1. Es wird ein zufällig generiertes Verzeichnis auf K: erstellt
  2. Die entsprechende Datei wird in dieses Verzeichnis kopiert (mit Fortschrittsanzeige)
  3. Es öffnet ein Textfeld in dem sich der direkte Link zur Datei befindet 🙂

Über diesen Link kann sich der Kunde dann die Datei downloaden.

So, nun zum letzten Teil – das Hinzufügen des Kontextmenü Eintrages.
Dazu am besten eine Textdatei share.reg mit folgendem Inhalt erstellen (egal wo):

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, im Beispiel D:\share.vbs.

Ein anschließender Doppelklick auf die Datei fügt den Eintrag zur Registry hinzu und der Kontextmenü Eintrag sollte sichtbar sein:

Kontextmenü

Klick auf Datei freigeben kopiert die Datei…
Kopiervorgang

Und fertig – Link kann kopiert und dem Kunden gesendet werden 🙂
Link kopieren

Zusätzlich kann man noch ein Icon für den Kontextmenüeintrag einbauen, wie es auch hier in den Bildern zu sehen ist. Dazu mittels regedit unter HKEY_CLASSES_ROOT\*\shell\Datei freigeben (Kundenserver) eine neue Zeichenfolge „Icon“ mit dem Pfad zum Icon anlegen.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 zu Cornelius Antworten abbrechen

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