SMB-Serv


Was ist SMB, welchen Zweck erfüllt dieser Server?


SMB ist das Netzwerk-Protokoll, mit dem es möglich ist mit einem SMB-Client auf einen SMB-Server zuzugreifen. Unter Windows werden SMB-Server und -Client unter dem Namen "Datei- und Druckerfreigabe" geführt.
Dieser SMB-Server bietet die Möglichkeit, eben solche Freigaben zu erzielen. Obwohl Windows einen solchen Server bereits enthält, habe ich einen eigenen programmiert, da mir die Options-Vielfalt des Windows-Server zu stark eingeschränkt ist (mein Server behebt diesen Makel). Außerdem ist es möglich, meinen Server unter DOS zu starten, ohne daß irgendwelche anderen Dateien benötigt werden.

Welche Features warten auf mich?


SMB-Serv gibt dir die völlige Kontrolle über deine Freigaben. Mit SMB-Serv bist du in der Lage sämtliche Dateioperationen im einzelnen zu erlauben oder zu verbieten. Du kannst für jedes einzelne freigegebene Verzeichnis und sogar für einzelne Dateien unterschiedliche Rechte vergeben. Jeder Zugriff auf deine Dateien kann optional mitprotokoliert werden. Desweiteren bist du in der Lage Wenn-Dann-Abfragen zur Fallunterscheidung einzubauen, um zum Beispiel vom Rechnername oder von der Uhrzeit abhängig Rechte zu vergeben oder zu nehmen.


Allgemeine Hinweise zu SMB-Serv


Dieses Dokument bezieht sich auf die aktuelle Version 0.99 Beta, eine Vor-Version. Diese Version enthält läuft zwar stabil, ist jedoch in Bezug auf grobe Fehler in der Konfigurationsdatei noch sensibel. Auch die Verarbeitung fehlerhafter SMBs (die z.B. Windows schickt) könnte zu abstürtzen führen. Letzteres tritt in der Regel nie auf, ersteren könnte passieren... Sollte der Server also abstürzen (was mir eigentlich auch noch nie passiert ist...), dürfte ein Blick ins Log für eine schnelle Aufklärung sorgen. Ich werde evtl. Abstürze als Sicherheitslücken, die gezielt ausgenutzt werden könnten. Die Benutzung des Servers geschieht mit größerer Gefahr, wenn man ihn zufällig in einem Netzwerk benutzt, in dem sich ein "Hacker" befindet, der sich gut mit dem SMB-Protokoll und meinem Server auskennt. Ansonsten, denke ich, besteht keine Gefahr beim Einsatz in "normaler" Netzwerkumgebung. Ich tue es ja auch...
Ach ja:Ich übernehme keine Verantwortung für evtl. Schäden, die mit SMB-Serv in Verbindung gebracht werden könnten.



Die Bedienung von SMB-Serv


Das Starten von SMB-Serv erfolgt nach der üblichen Methode. Wichtig ist nur ,daß sich das Config-File ("smbserv.cfg") im gleichen (aktuellen) Verzeichnis befindet! Beenden läßt sich der Server durch einen Druck auf die "Escape"-Taste, die Taste "R" (groß "r", also "Umschalt"+"r") sorgt für ein Erneutes Laden des Konfigurationsfile, bzw. einer Aktualisierung gegebener Rechte. Sämtliche Einstellungen den Server betreffend, werden in dieser Konfigurationsdatei eingestellt.

Das Konfigurations-File


Das Konfigurations-File trägt den Namen "smbserv.cfg" und muß sich im aktuellen Verzeichnis beim Start des Servers befinden. Der Inhalt dieser Datei könnte zum Beispiel so aussehen:
[] #Kommentar [\] EGAL= [EGAL] path=c: [**] Dies ist jedoch kein besonders gutes Beispiel für eine Konfigurationsdatei, denn es entfallen nur die Dinge, die zum fehlerfreien Start notwendig sind.
Was man hier nicht deutlich sehen kann, ist das Prinzip, dem dieses File folgt: Alle Einstellungen sind in Blöcke zusammengefasst. Diese Blöcke beginnen mit einem Ausdruck in eckigen Klammern und hören da auf, wo der nächste Block beginnt, nämlich bei der nächsten eckigen Klammer. Der Ausdruck in Klammern dient dabei als Bezeichnung für den Block. Desweiteren ist es möglich Kommentare einzufügen, indem man eine Raute ('#') einfügt. Alles was hinter der Raute steht, wird bis zum Zeilenende ignoriert.
Schauen wir uns nun mal ein besseres Config-File an:
[] #Globale Rechte localname=MEINNAME [\] #Freigaben auf dem Server EGAL= #Freigabe mit dem Namen "EGAL" [EGAL] #Block der den Namen "EGAL" trägt. Er gibt die Einstellung für die Freigabe an path=c:\egal #eine Einstellung innerhalb des Blockes readable=yes [**] #Ende des Config-Files Gehen wir dieses File im Detail durch. Der erste Block hat keinen Namen. Es ist ein Sondername, der sonst nicht benutzt werden darf. Innerhalb dieses Blockes werden wichtige Allgemeine Rechte und Einstellungen festgelegt. Eine Zeile tiefer steht eine solche Einstellung: Die Angabe "localname=MEINNAME", mit der der Name, unter dem der Server erreichbar ist, eingestellt wird. Der Name wird in diesem Beispiel auf "MEINNAME" gestellt. Damit endet dieser Block auch schon ,denn in der nächsten Zeile beginnt bereits der nächste Block. Auch er trägt einen Sondernamen: den Namen "\". Hier werden die Namen der Freigaben eingestellt. Die Freigabe ,die hier eingestellt ist, heißt "EGAL". Das Gleichheitszeichen muß aus technischen Gründen dastehen, um zukünftige Erweiterungen leicht zu machen. Damit ist auch der "\"-Block zu Ende. Als nächstes folgt ein Block mit dem Namen "EGAL". Dieser Name bezieht sich auf den Namen der Freigabe. In diesem Block werden die Einstellungen zur Freigabe "EGAL" getroffen. Darunter steht in diesem Beispiel die Einstellung "path=c:\egal", die den Pfad der Freigabe "EGAL" festlegt. Damit auf den Ordner zugegriffen werden kann, müssen noch die Rechte eingetragen werden. Standardmäßig sind keine Rechte vergeben. Das hier eingetragene Recht für den Ordner lautet "readable=yes" und erlaubt sämtliche Operationen, die zum Leserecht gehören: Das Recht, Dateien zu öffnen, sich den Inhalt eines Verzeichnisses anzusehen, Informationen über Dateien zu erhalten u.a. . Es ist jedoch kein Recht gegeben, den Datenträgerinhalt in irgendeiner Form zu verändern. Danach folgt der Block [**] , der das Ende des Config-Files andeutet.
Würde man dieses Config-File verwenden, hätte dies folgenden Effekt:
Es würde ein Server gestartet werden, der den Namen "MEINNAME" trägt und eine Freigabe, nämlich "EGAL" enthält. Der Inhalt dieser Freigabe wäre der Inhalt des Ordners "c:\egal".
Wichtig: Der Server ist nur über direkte Verbindungen, z.B. durch Netzlaufwerke zu erreichen. Um ein Netzlaufwerk mit dem Server zu verbinden, müßte man in diesem Fall mit "\\mainname\egal" verbinden. Der Name der Freigabe muß mit in den Netzlaufwerkpfad!

Sämtliche Einstellungen erfolgen nach diesem Schema. Will man Rechte für Dateien oder Verzeichnisse innerhalb dieses Ordners vergeben, fügt man einfach einen weiteren Block ein, der den Namen des Pfades trägt, dessen Rechte geändert werden sollen: [] #Globale Rechte localname=MEINNAME [\] #Freigaben auf dem Server EGAL= #Freigabe mit dem Namen "EGAL" [EGAL] #Block der den Namen "EGAL" trägt. Er gibt die Einstellung für die Freigabe an path=c:\egal #eine Einstellung innerhalb des Blockes readable=yes [EGAL\PRIVAT] #Verzeichnis, auf das kein Zugriff gegeben sein soll deny=yes [**] #Ende des Config-Files
Zwar würde im Wurzelverzeichnis der Freigabe der Ordner "PRIVAT" erscheinen, doch es wäre nicht möglich, in den Ordner zu wechseln.
Da gegebene Rechte und andere Einstellungen aus übergeordneten Ordnern übernommen werden, ist es hier nicht notwendig eine Zeile "path=c:\egal\privat" einzufügen. Die Einstellung "deny=yes" ist radikal, da sämtliche Rechte entzogen werden (sofern vorhanden). Es hätte auch gereicht, eine Einstellung "readable=no" einzufügen, doch ist dies in der Regel nicht zu empfehlen, weil sonst die Gefahr auftritt, daß Rechte für den Ordner erhalten bleiben, wenn die Rechtseinstellungen des Übergeordneten Ordners verändert werden und die Rechte der Unterverzeichnisse nicht angepasst werden... Würde man für den Block "[EGAL]" statt dem Recht "readable=yes", das Recht "allrights=yes" eintragen, womit alle Rechte gegeben werden, würde die Zeile "readable=yes" im Block "[EGAL\PRIVAT]" dem Ordner lediglich das Lese-Recht entziehen. Das Schreib-, Lösch und etliche andere Rechte blieben erhalten. Daher gibt es die Möglichkeit, mehrere sich überlappende Rechtseinstellungen anzugeben. Wollte man mit dem Ordner "PRIVAT" nur das Recht geben, seinen Inhalt anzuzeigen, könnte man als erstes alle Rechte durch den Befehl "deny=yes" zurücksetzen und dann lediglich das Recht "general_allrights=yes" vergeben, das die Schicht der grundlegensten Rechte darstellt, zu der das Anzeigen von Verzeichnisinhalten, die Abfrage von Datei- und Ordnerinformationen, wie Erstellungsdatum und Attributen, sowie die Abfrage des verfügbaren Plattenspeichers gehört. Durch "deny=yes" ist sichergestellt, daß keine Rechte aus [EGAL] automatisch in den Ordner "PRIVAT" übernommen werden.
Die Hintereinanderreihung von Befehlen ist jederzeit möglich, wenn auch nicht immer sinnvoll. Da die Konfigurationsdatei von oben nach unten abgearbeitet wird, hat ein tiefer stehendes Recht grundsätzlich Priorität. Setzt man z.B. "readable=yes" in die erste Zeile (eines Blockes!) und in die zweite Zeile "readable=no" ein, so ist das readable-Recht nicht gegeben. Die andere Reihenfolge bewirkt das Gegenteil.
Zu nahezu jedem Recht, läßt sich das Gegenteil bilden, indem man statt "yes" "no" und statt "no" "yes" einsetzt. Eine Zeile "deny=no" wäre das exakte Gegenteil von "deny=yes". Da "deny=yes" alle Rechte entzieht, würde "deny=no" alle Rechte geben.

Wenn-Dann-Fallunterscheidung

SMB-Serv bietet Benutzer ein mächtiges Mittel zur Automatischen Rechts-Vergabe: Die Fallunterscheidung. Fallunterscheidungen sind in drei Teile aufteilbar:
1. Die Bedingung
2. Die Konsequenz
3. Das Ende einer Fallunterscheidung

Als Bedingung kann entweder eine einzige Bedingung oder eine Verknüpfung von mehreren Bedingungen dienen. Eine Bedingung wird einfach als einzelne Zeile innerhalb eines Rechts-Blockes eingefügt. Soll auf einen Ordner nur zu Weihnachten '98 zugegriffen werden können lautet die Bedingung "if date=24.12.98". Die folgenden Zeilen können dann die Rechte enthalten, die gegeben werden, wenn die Bedingung zutrifft. Sollte die Bedingung nicht zutreffen, wird zum Ende des Fallunterscheidungs-Blockes gesprungen, das durch "if_end" gekennzeichnet ist. Ein Beispiel:
[] #Globale Rechte localname=MEINNAME [\] #Freigaben auf dem Server EGAL= #Freigabe mit dem Namen "EGAL" [EGAL] #Block der den Namen "EGAL" trägt. Er gibt die Einstellung für die Freigabe an path=c:\egal #eine Einstellung innerhalb des Blockes readable=yes [EGAL\PRIVAT] #Verzeichnis, auf das kein Zugriff gegeben sein soll deny=yes [EGAL\HOHOHO] deny=yes #zuerst werden alle Rechte entzogen general_allrights=yes #es wird das Recht gegeben, sich den Inhalt des Ordners anzusehen if date=24.12.98 #ist heute Weihnachten '98? readable=yes #diese Zeile wird nur an Weihnachten '98 beachtet! if_end #Ende des If-Blocken (Fallunterscheidungs-Blockes) [**] #Ende des Config-Files
Hinter einer Fallunterscheidung muß nicht Schluß sein! Es wäre möglich, weitere Rechte (unabhängig von der Fallunterscheidung) zu vergeben. Man hätte "general_allrights=yes" auch unter "if_end" schreiben können, ohne das sich etwas ändern würde. Würde man jedoch "deny=yes" unter den Fallunterscheidungs-Block schreiben, würden die Rechte für "HOHOHO" entweder komplett entzogen werden, oder alleinig das Recht die Dateien anzuzeigen, wäre gegeben, je nach dem ob "deny=yes" vor oder hinter "general_allrights=yes" steht. Denn auch hier gilt, daß das was weiter unten steht die Priorität hat.
Wie gesagt, ist es auch möglich mehrere Fallunterscheidungen hintereinanderzustellen (in Zukunft werden die Fallunterscheidungen If-Anweisung genannt): [] #Globale Rechte localname=MEINNAME [\] #Freigaben auf dem Server EGAL= #Freigabe mit dem Namen "EGAL" [EGAL] #Block der den Namen "EGAL" trägt. Er gibt die Einstellung für die Freigabe an path=c:\egal #eine Einstellung innerhalb des Blockes readable=yes [EGAL\PRIVAT] #Verzeichnis, auf das kein Zugriff gegeben sein soll deny=yes [EGAL\HOHOHO] deny=yes #zuerst werden alle Rechte entzogen general_allrights=yes #es wird das Recht gegeben, sich den Inhalt des Ordners anzusehen if date=24.12.98 #ist heute Weihnachten '98? readable=yes #diese Zeile wird nur an Weihnachten '98 beachtet! if_end #Ende des If-Blockes if date=31.12.98 #ist heute Jahresende? allrights=yes #diese Zeile wird am Jahresende beachtet! if_end # Ende des 2. If-Blockes [**] #Ende des Config-Files In diesem Beispiel werden an Jahresende alle Rechte gegeben. Würde man an Jahresende ebenfalls nur das Leserecht ("readable=yes") vergeben, könnte man die beide Fallunterscheidungen zu einer zusammenfassen.

Bool'sche Operatoren in If-Anweisungen

Um If-Anweisungen zusammenzufassen (was nur geht, wenn die Konsequenz gleich ist), muß man unter eine if-Zeile wie "if date=24.12.98" eine weitere Bedingung schreiben. Die Bedingungen müssen durch die Bool'schen Operatoren "oder/or" oder "und/and" verknüpft werden. Verknüpft man mehrere "or" (dt. oder) Anweisungen, so muß mindestens eine erfüllt sein, damit die Konsequenz erfolgt. Wird mit "and" (dt. und) verknüpft, müssen alle Bedingungen erfüllt werden, damit die Konsequenz erfolgt. Entsprechende Operatoren werden an weitere Bedingungen mit einem "if_or" bzw. "if_and" geknüpft. Beispiel: [] #Globale Rechte localname=MEINNAME [\] #Freigaben auf dem Server EGAL= #Freigabe mit dem Namen "EGAL" [EGAL] #Block der den Namen "EGAL" trägt. Er gibt die Einstellung für die Freigabe an path=c:\egal #eine Einstellung innerhalb des Blockes readable=yes [EGAL\PRIVAT] #Verzeichnis, auf das kein Zugriff gegeben sein soll deny=yes [EGAL\HOHOHO] deny=yes #zuerst werden alle Rechte entzogen general_allrights=yes #es wird das Recht gegeben, sich den Inhalt des Ordners anzusehen if date=24.12.98 #ist heute Weihnachten '98? if_or date=31.12.98 #oder ist heute Jahresende? readable=yes #diese Zeile wird beachtet, wenn Weihnachten '98 oder Jahresende ist if_end # Ende des If-Blockes [**] #Ende des Config-Files Würde man statt "if_or" "if_and" einsetzen, mußte das Datum der 24.12.98 und gleichzeitig 31.12.98 sein. Da dies nie vorkommt, könnte die Bedingung nie erfüllt werden. Daher ein sinnvolleres Beispiel: [] #Globale Rechte localname=MEINNAME [\] #Freigaben auf dem Server EGAL= #Freigabe mit dem Namen "EGAL" [EGAL] #Block der den Namen "EGAL" trägt. Er gibt die Einstellung für die Freigabe an path=c:\egal #eine Einstellung innerhalb des Blockes readable=yes [EGAL\PRIVAT] #Verzeichnis, auf das kein Zugriff gegeben sein soll deny=yes [EGAL\HOHOHO] deny=yes #zuerst werden alle Rechte entzogen general_allrights=yes #es wird das Recht gegeben, sich den Inhalt des Ordners anzusehen if date=24.12.98 #ist heute Weihnachten '98? if_and time=15:00 #und ist es jetzt 15:00 Uhr? (Sekunde egal) readable=yes #diese Zeile wird beachtet, wenn es Weihnachten '98 und 15:00 Uhr ist if_end # Ende des If-Blockes [**] #Ende des Config-Files Ohne Probleme kann dort weitere If-Anweisungen anfügen: [] #Globale Rechte localname=MEINNAME [\] #Freigaben auf dem Server EGAL= #Freigabe mit dem Namen "EGAL" [EGAL] #Block der den Namen "EGAL" trägt. Er gibt die Einstellung für die Freigabe an path=c:\egal #eine Einstellung innerhalb des Blockes readable=yes [EGAL\PRIVAT] #Verzeichnis, auf das kein Zugriff gegeben sein soll deny=yes [EGAL\HOHOHO] deny=yes #zuerst werden alle Rechte entzogen general_allrights=yes #es wird das Recht gegeben, sich den Inhalt des Ordners anzusehen if date=24.12.98 #ist heute Weihnachten '98? if_or date=31.12.98 #oder ist heute der letzte Jahrestag? if_and time=15:00 #und ist es jetzt 15:00 Uhr? (Sekunde egal) readable=yes #diese Zeile wird beachtet, wenn es Weihnachten '98 und 15:00 Uhr ist if_end # Ende des If-Blockes [**] #Ende des Config-Files Sowohl an Jahresende und an Weihnachten wäre um 15:00 Uhr die Bedingung erfüllt.
Natürlich ist es auch möglich Klammern zu setzen: [] #Globale Rechte localname=MEINNAME [\] #Freigaben auf dem Server EGAL= #Freigabe mit dem Namen "EGAL" [EGAL] #Block der den Namen "EGAL" trägt. Er gibt die Einstellung für die Freigabe an path=c:\egal #eine Einstellung innerhalb des Blockes readable=yes [EGAL\PRIVAT] #Verzeichnis, auf das kein Zugriff gegeben sein soll deny=yes [EGAL\HOHOHO] deny=yes #zuerst werden alle Rechte entzogen general_allrights=yes #es wird das Recht gegeben, sich den Inhalt des Ordners anzusehen if_( if date=24.12.98 #ist heute Weihnachten '98? if_and time=20:00 #und ist es jetzt 20 Uhr? if_) if_or( if date=31.12.98 #oder ist heute der letzte Jahrestag? if_and time=15:00 #und 15:00 Uhr? if_) readable=yes #diese Zeile wird beachtet, wenn Weihnachten '98 oder Jahresende ist if_end # Ende des If-Blockes [**] #Ende des Config-Files In diesem Fall tritt die Konsequenz ein, wenn entweder die Doppelbedingung ' Weihnachten 20:00 Uhr ' oder die Doppelbedingung ' Jahresende 15:00 Uhr ' erfüllt ist. Die Konsequenz tritt nicht an ' Weihnachten 15:00 Uhr ' oder 'Jahresende 20:00 Uhr' ein, da '15:00 Uhr' durch die Klammer an 'Jahresende' gebunden ist (das Gleiche gilt für 'Weihnachten 15:00 Uhr'). Es ist möglich bis zu 255 Klammern ineinander zu verschachteln. (In dem Beispiel tritt keine Verschachtelung auf. Eine Verschachtelung ist das einfügen einer Klammer-If-Anweisung innerhalb einer anderen.)

Variablen

Variablen innerhalb einer Konfigurationsdatei geben dieser einen absolut neuen Charakter und geben die Möglichkeit die selbige stark zu verkürzen. Ein Beispiel:
if hostname=FRIEDRICH if_or hostname=GUSTAV if_or hostname=HEINZ if_or hostname=OLAV deny=yes if_end Wollte man dies auf eine einfache und leicht durchschaubare Art erreichen könnte man Variablen benutzen, die in Kombination mit dem Hostnamen einen Wert enthält, der angibt, ob das Recht gesetzt werden soll oder nicht. In diesem Fall denken wir uns mal einen Variablennamen aus. Passend wäre hier vielleicht 'i.am.denied.flag'. Die Trennpunkte hierbei sind übrigens keine Pflicht! Es ist ebenso 'iamdeniedflag' oder 'i_am_denied_flag' zulässig, da die Trennzeichen nicht benötigt oder verarbeitet werden. Allerding muß in dieser Variablen noch der Hostname integriert werden. Nennen wir die Variablen also mal 'FRIEDRICH.denied.flag', 'GUSTAV.denied.flag' usw. Wenn wir diese Variablen allgemein verwenden wollen, können wir Kennzeichen, daß an entsprechender Stelle der aktuelle Hostname steht. Dazu setzt man gewisse vorgegebene Begriffe in Anführungszeichen. Diese Begriffe werden dann durch die aktuellen Werte ersetzt. Aber wieder zurück zum Beispiel. Mit Variablen könnte das Ganze so aussehen: if var="hostname".denied.flag=yes deny=yes if_end "yes" ist hierbei kein fester Begriff. Es hätte auch "ja" oder "gugui" sein können! In dem Beispiel ist die erste Zeile eine gewöhnliche If-Abfrage, bei der die Variable ' "hostname".denied.flag' auf den Wert "yes" getestet wird. "hostname" wird jeweilig durch den aktuellen Hostnamen ersetzt. Greift also der Client mit dem Namen "HEINZ" zu und seine Rechte sollen geprüft werden, wird die Variable "HEINZ.denied.flag" auf "yes" getestet. Allerdings müssen zur Überprüfung von Variablen auf bestimmte Werte, die Variablen selbstverständlich erstmal existieren. SMB-Serv speichert alle Variablen in der Datei "smbserv.var" in folgendem Format:
Variablenname=Wert
Also z.B.: HEINZ.denied.flag=yes
Es ist möglich Variablenwerte entweder dadurch zu ändern, indem man vorhandene Werte einfach in der "smbserv.var" ändert oder neu hinzufügt. Da SMB-Serv die Variablen-Datei jedoch während seines Betriebes offenhält und schreibschützt, muß man den Server zur Veränderung stoppen, oder durch drücken von "V" die Variablen deaktivieren. Man kann die Variablenwerte jedoch auch durch entsprechende Befehle im Config-File verändern. Entsprechende Befehle stehen in der Referenz.
Eine weitere Möglichkeit Variablen zu nutzen, ist es ihren Wert transparent bei der Verarbeitung einsetzen zu lassen. Ein Beispiel hierfür ist zum Beispiel ein Home-Verzeichnis. Möchte man jedem Benutzer in dem gleichen Freigabeordner von Benutzer zu Benutzer unterschiedliche Ordner zuordnen, kann man dies so erledigen:
[] #Globale Rechte localname=MEINNAME [\] #Freigaben auf dem Server EGAL= #Freigabe mit dem Namen "EGAL" [EGAL] path=c:\egal readable=yes [EGAL\HOME] #Verzeichnis, das für jeden Benutzer anders ist path=%homedir."hostname"% [**] #Ende des Config-Files Dabei wird bei der Verarbeitung des Config-Files der Ausdruck %homedir."hostname"% durch die '%'-Zeichen als durch den Variablenwert zu ersetzender erkannt. Also wird der Wert von homedir."hostname" durch den Wert ersetzt. Wenn HEINZ der Benutzer ist, der die Freigabe nutzt und der Wert der Variable 'homedir.HEINZ' 'c:\homes\HEINZ' ist, wird die Zeile
path=%homedir."hostname"% in
path=c:\homes\HEINZ umgewandelt.

Parameter und Optionen

Parameter für "Generelle Einstellungen ([])"

Dieser Bereich wird automatisch beim Start des Servers verarbeitet. Die hier aufgelisteten Optionen können jedoch auch an anderer Stelle stehen. Auf diese Weise kann man durch Zugriff auf eine bestimmte Datei oder ein Verzeichnis allgemeine Optionen ändern und eine Art Fernadministration durch kontrollierten Zugriff erzielen.
logging_file
logging_file aktiviert oder deaktiviert bestimmte Log-Stufen. Hinter dem Gleichheitszeichen müssen die einzelnen Logging-Stufen angefangen bei der ersten bis zur zehnten durch ein "y" aktiviert oder durch ein "n" desaktiviert werden. Die Einstellungen beziehen sich auf das, was in die Log-Datei "smbserv.log" gerät.
Die Logging-Stufen bedeuten:
Log-StufeBedeutung
1Allgemeine Nachrichten, wie Server-Start und Stop
2?
3wichtigere/seltenere NetBIOS Nachrichten wie Verbindungsauf- und abbau
4unwichtigere NetBIOS Nachrichten wie empfangen oder senden
5Kommando Logging für seltenere/wichtigere Kommandos
6DebugLogging: Eingehende SMBs
7DebugLogging: Ausgehende SMBs
8Kommando Logging für oft vorkommende/nicht aussagekräftige Kommandos
9Fehlermeldungen
10Rechtsverletzungen
logging_screen
Dasselbe wie logging_file, bezieht sich jedoch statt auf die Log-Datei auf das Bildschirm-Logging.
idle_timeout
Idle-Time-Out bei dessen erreichen eine Verbindung vom Server geschlossen wird. Er muß als Zahl der Sekunden hinter den Gleichheitszeichen stehen
localname
localname gibt den NetBios-Namen des Servers an. Er darf maximal 15 Zeichen lang sein.
Bsp: "localname=MEINNAME"
netbios_adapter
Bestimmt auf welche Netzwerkkarte reagiert werden soll. Standardwert ist 0.
work_around
Aktiviert/Deaktiviert alle Work-Arounds. (Betrifft aktuell nur die Such/Directory-Funktion und bringt bei Aktivierung Performance-Einbusen. Der Bug macht sich bemerktbar, wenn mehrere DOS-Clients gleichzeitig die Such/Directory-Funktion nutzen, und bewirkt, daß die Suche zu unvorhersehbarem Zeitpunkt abgebrochen wird.)
Volumename
Mit dieser Option läßt sich der anzuzeigende Laufwerksname einstellen. Er darf maximal 11 Zeichen lang sein.

Einstellungen für Datei- und Verzeichnisrechte

fileopen
fileopen ist das Recht zum Öffnen einer Datei. fileopen ist das erste Kommando, daß erste Kommando, das ein Programm durchführen muß, um auf den Inhalt einer Datei zugreifen zu können. Einige Programme reagieren unerwartet, da sie davon ausgehen, sie wären immer in der Lage Dateien zu öffnen.
fileread
Ermöglicht das Lesen einer zuvor geöffneten Datei. Sollte aktiviert sein, wenn fileopen möglich ist...
filewrite
Ermöglicht das Verändern des Inhalts einer Datei.
file_rw
Aktiviert alle Lese- und Schreibrechte für Dateien (also alle bis jetzt genannten).
filecreate
Erlaubt das Erstellen einer neuen Datei.
fileseek
Erlaubt das verstellen der aktuellen Lese-/Schreibposition einer geöffneten Datei. Es ist dringend zu empfehlen, dieses Recht immer zu geben!
getfileattribs
Erlaubt es die Dateiattribute, zu denen auch die letzte Änderungsuhrzeit gehört, zu verändern.
setfileattribs
Erlaubt das Setzen dieser Attribute.
file_nochange
Setzt alle Rechte zurück, die eine Datei verändern könnten. Achtung: "file_nochange=yes" setzt die Rechte zurück, "file_nochange=no" aktiviert alle Rechte, die eine Dateiveränderung herbeiführen können!
file_ro
Setzt alle Lese-Rechte für Dateien.
filerename
Erlaubt das Umbenennen von Dateien. Achtung: Da Wildcards eingesetzt werden können, ist es möglich Dateinamen zu verändern, obwohl das Recht für eine Datei zurückgesetzt wurde.
filedel
Erlaubt das Löschen von Dateien. Siehe Hinweis bei filerename!
filedatelie
Gibt als Datum der Datei das aktuelle Datum an.
filetimelie
Gibt als Uhrzeit der Datei die aktuelle Uhrzeit an.
filemake
Erlaubt es Dateien zu erstellen, auch wenn diese schon existieren.
dir_create
Aktiviert das Erstellen von Verzeichnissen.
dir_del
Erlaubt das Löschen eines Verzeichnisses. Dazu muß ein Verzeichnis jedoch leer sein.
dir_rename
Erlaubt es Verzeichnisse umzubenennen.
dir_change
Erlaubt alle verändernden Operationen an Verzeichnissen.
dir_allrights
siehe dir_change
general_allrights
Aktiviert die generellen Rechte Dateisuche, Pfadüberprüfung und den Erhalt von Datenträgerinformationen.
search
Erlaubt das Suchen von Dateien (Anzeigen von Verzeichnisinhalten).
check_path
Erlaubt die Überprüfung eines Pfades auf Vorhandensein.
getdiskattribs
Erlaubt den Erhalt von Datenträgerinformationen.
path
Setzt den Pfad für ein Verzeichnis um.
server_stop
Der Zahl-Wert hinter dieser Option gibt die Zeit in Sekunden an, nach der der Server sich beenden soll.
server_stop_abort
Bricht einen laufenden Server Beendungs-Count-Down ab.
config_reload
config_reload verlasst das sofortige Neu-Laden der Konfigurations-Datei.
deny
Setzt alle gegebenen Rechte zurück.
readable
Setzt alle Lese-Rechte.
file_allrights
Gibt alle Datei-Rechte.
allrights
Gibt alle Rechte - Gegenteil von Deny.
readonly
Setzt ein absolutes Lese-Recht. Alle vorher gesetzten Rechte werden zurückgesetzt und die Leserechte gesetzt.
rights_nochange
Hält die gegebenen Rechte aufrecht, so daß neue Einstellungen für Unterverzeichnisse ignoriert werden.
right_only_here
!!!

vorgegebene Variablen für If-Anweisungen

hostname
Hostname ist der NetBIOS-Name mit dem der Client sich mit dem Server verbindet. Unter Windows ist dieser Name i.d.R. der Computername, der bei Identifikation vom Benutzer gewählt wurde. Da der Computername jederzeit geändert werden kann, ist mit hostname keine sichere Identifizierung des Fremd-Computers gegeben. Stattdessen sollte man eine Überprüfung auf der MAC-Adresse setzen.
Zur Überprüfung eines Host-Names kann man das Wildcard '?' einsetzen. Am Ende des Namen sollte ein '~' stehen, um dem Server zu signalisieren, daß der zu überprüfende Name keine weiteren Zeichen außer Leerzeichen enthält. (NetBIOS-Namen werden immer mit Leerzeichen aufgefüllt)
hostmac
Hostmac ist die einmalige Netzwerkadapter-Adresse, mit eine Eindeutige Unterscheidung zwischen Hosts möglich ist. Die MAC-Adresse läßt sich aus dem Log entnehmen. Ansonsten gelten die gleichen Regeln, wie för hostname.
time
time dient dazu, die aktuelle Uhrzeit für eine Fallunterscheidung zu nutzen. Die Uhrzeit wird in den Teilen Stunden, Minuten und Sekunden angegeben, wobei die Teile durch Doppelpunkte getrennt sind. Als Vergleichsoperatoren sind 'gleich', 'großer als' und 'kleiner als' zuläß. Zusätzlich kann man die Wildcards '*' und '?' einsetzen. Jeder der Teile muß zwei Zeichen lang sein, gültig ist also 03:45:20, 17:39:11, 23:59:59, nicht jedoch 3:55:00, 17:15:0. Dennoch ist es möglich die Sekundenangabe oder die Sekundenangabe und die Minutenangabe wegzulassen: 03:55, 17:15, 20. Nicht möglich ist jedoch :55:20 oder 15::20. Will man das Wildcard einsetzen, fügt man an die Stelle, die ignoriert werden soll ein Fragezeichen ein: 15:??:00, ??:15:??, 1?:00:00, ??:??:3?. Der Vergleich mit dem Vergleichsoperator '=' gestaltet sich sehr einfach. Ein Beispiel:
if time=20:00:00 readable=yes if_end In diesem Falle wird nur um exakt 20 Uhr die Konsequenz eintreten. if time=20:00 readable=yes if_end Hier wird die Konsequenz eintreten, wenn es 20 Uhr ist, doch ist diesmal die Sekunde egal. if time=20 readable=yes if_end Hier tritt die Konsequenz ab 20:00:00 Uhr bis 20:59:59 Uhr ein.
Noch ein Beispiel mit dem Wildcard: if time=20:??:?0 readable=yes if_end Diesmal tritt die Konsequenz zwischen 20:00:00 Uhr und 20:59:59 Uhr dann ein, wenn die zweite Ziffer der Sekundenzahl 0 ist. Also um 20:36:20, 20:00:00 und 20:59:50.
Der Einsatz von '<' und '>' ist schon etwas schwieriger:
if time<20:00:00 readable=yes if_end In dem Fall tritt die Konsequenz vor 20:00:00 Uhr, also das letzte Mal um 19:59:59 ein. if time<20:00 readable=yes if_end Dieser Fall liefert das gleiche Ergebnis. if time<20 readable=yes if_end Auch hier tritt die Konsequenz bis 19:59:59 Uhr ein.
Nun noch ein Beispiel mit Wildcards: if time<20:??:00 readable=yes if_end Hier tritt die Konsequenz bis 19:59:59 Uhr immer ein und ab 20:00:00 Uhr nie wieder. Ein besseres Beispiel: if time<20:??:40 readable=yes if_end Hier tritt die Konsequenz vor 20 Uhr immer auf und danach immer dann, wenn die Sekundenzahl kleiner als 40 ist.
Der Vergleich mit '>' verläuft nach dem gleichen Schema.
date
Mit date verhält sich ähnlich wie mit time. Das Trennzeichen ist diesmal jedoch ein Punkt und es dürfen keine Teile weggelassen werden. Ansonsten bleibt das Schema gleich (intern wird für die Überprüfung auch die gleiche Routine verwendet...). Ein Beispiel: if date>30.01.98 fileopen=no if_end Hier tritt die Konsequenz ab dem 01.02.98 ein.
server_stop_flag
Sollte ein Server-Shutdown-Countdown im Gange sein, wird die Konsequenz ausgefürt.
server_stop_time
!!!
file_exists
Sollte die hinter dem Gleichheitszeichen angegebene Datei existieren, wird die Konsequenz ausgefört. Die Lage der Datei bezieht sich auf das "normale" Dateisystem und nicht auf das durch den Server "emulierte".
Beispiel: if file_exists=c:\config.sys readable=yes if_end Sollte in diesem Beispiel die Datei "config.sys" im Hauptverzeichnis von Laufwerk "c:" vorhanden sein, wird das Lese-Recht gesetzt.
time_diff
Mit Hilfe dieser Vergleichsoperation kann ein Bezug zum alter einer Datei oder eines Verzeichnisses gezogen werden. Die Konsequenz tritt dann ein, wenn die angefordete Datei oder das Verzeichnis nicht älter ist, als das als Parameter angegebene. Die Zeit wird dabei im Format "Stunden:Minuten:Sekunden" angegeben. Jedes Feld muß aus zwei Zeichen bestehen.
Beispiel: if time_diff=01:25:35 allrights=yes if_end Sollte nicht mehr als eine Stunde, 25 Minuten und 35 Sekunden seit der Erstellung dieser Datei oder des Verzeichnisses vergangen sein, werden alle Rechte gegeben. Sollte die Datei oder das Verzeichnis noch nicht existieren, wird ebenso verfahren, da die Datei ja neu ist und daher nicht älter als die angegebene Zeit. Die Funktion arbeitet leicht ungenau.
var_exists
Die Konsequenz tritt bei diesem Vergleichsoperator ein, wenn die als Parameter angegebene Variable existiert.
var
Bei diesem Vergleichsoperator tritt die Konsequenz ein, wenn die als Parameter angegebene Variable den ebenfalls anzugebenden Wert enthält. Variable und der Wert werden dabei durch ein weiteres Gleichheitszeichen getrennt.
Beispiel: if var=meine.test.variable=ich.bin.da readable=yes if_end Hier tritt die Konsequenz ein wenn die Variable "meine.test.variable" den Wert "ich.bin.da" besitzt.

Befehle für Variablen

set_var
Mit set_var lässt sich ein Wert einer Variablen zuordnen. Sollte sie noch nicht existieren, wird sie erstellt. Die Syntax: set_var=Variablenname=Wert_der_Variablen
newset_var
newset_var hat die gleiche Aufgabe wie set_var, jedoch mit dem Unterschied, daß newset_var, keinen vorhandenen Variablenwert verändert, sondern nur neue Variablen erstellt. Sollte eine Variable schon existieren, wird der Wert durch newset_var nicht verändert.
clear_var
clear_var löscht die Variable mit dem Namen, der hinter dem Gleichheitzeichen steht.