Dieses Informationsfenster platziere ich freiwillig und unentgeldlich zur Unterstützung meiner Schwester bei ihrem Jobwechsel. Es wird nur für eine begrenzte Zeit angezeigt und kann ausgeblendet werden. Ich hoffe, dass die Aktion keinen meiner Leser zu sehr stört. Zum Ausblenden werden Cookies benutzt, diese müssen aktiviert und für diese Seite erlaubt werden. Werden die Cookies gelöscht oder die Seite auf einem anderen Gerät betrachtet, erscheint das Informationsfenster wieder und muss erneut geschlossen werden.

Information

Katja Schurig sucht neue berufliche Herausforderungen!

Liebe Leser, ich habe hier einen Geheimtipp für euch:
Katja Schurig
Katja Schurig, berufserfahren und kampferprobt in den Bereichen Veranstaltungsmanagement und -verkauf, Personalwesen, Sales & Marketing sowie Tourismus, will sich neuen beruflichen Herausforderungen stellen. Wer mit viel Energie umgehen kann und auf der Suche nach einer professionellen Fachkraft ist (oder jemanden kennt, der jemanden kennt), der findet ihr Profil nebst Kontaktdaten auf: Xing
Edit Comment
IT-Stuff, Tutorials, Software, Internet, Unterhaltung Willkommen auf IMA

Archive for the ‘IT’ Category

Ziel ist es in einer beliebigen Datei – der Inhalt sollte aber schon irgendeine Art von Text sein – scriptgesteuert Text oder Zeichen suchen und ersetzen zu können; und zwar ohne Installation von Tools wie grep/sed sondern nur mit dem Script.
Eine pure Batch-Lösung halte ich für zu riskant, da Batch mit zu vielen Sonderzeichen Schwierigkeiten hat. Statt dessen greifen wir auf ein einfaches .vbs Script zurück.

Für Einsteiger: VBS (Visual Basic Script) Scripts sind Batch Scripts sehr ähnlich. Es ist praktisch nur Text in einer Datei mit der Dateiendung .vbs. Ausgeführt werden .vbs Scripts mit folgendem Code aus der CMD heraus, ggf. mit Parametern:
cscript //nologo script.vbs "parameter1"
zeichen-einfachen-text-suchen-ersetzen-vbs-batch-vbs-execution
VBS Scripts, im Vergleich zu Batch, laufen allerdings etwas stabiler, liefern notfalls Fehlermeldungen und bieten auch mehr Features. An dieser Stelle nutzen wir also diese Vorteile aus.

Hier der Code für ein einfaches .vbs Script zum Auslesen einer Datei, Suchen und Ersetzen 3 verschiedener Zeichen/Texte und Schreiben in eine andere Datei:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForWriting = 2

' Datei öffnen und Text einlesen und schließen
Set objFile = objFSO.OpenTextFile("test.html", ForReading)
strText = objFile.ReadAll
objFile.Close

' Änderungen am Inhalt
strNewText = Replace(strText, """", "'")
strNewText = Replace(strNewText, "lang='de'", "lang='en'")
strNewText = Replace(strNewText, "Hannes Schurig", "Max Mustermann")

' Neue Datei erstellen mit neuen Inhalten füllen
set resultFile = objFSO.CreateTextFile("test-neu.html", true)
resultFile.WriteLine strNewText
resultFile.Close

Relativ straight forward. Hier ein Beispielresultat:
zeichen-einfachen-text-suchen-ersetzen-vbs-batch-simple-script

Für eine bessere Handhabung lässt sich nun dieses Script optimieren. Die Eingabe- und Ausgabedatei könnte man parametirisieren. Wenn immer nur 1 Sache ersetzt werden soll, sich diese aber während der Scriptlaufzeit ändert oder erst währenddessen entschieden wird, könnte man auch diese Daten als Parameter übergeben.

Hier der Code für ein komplexeres .vbs Script:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForWriting = 2
' Parameter einlesen
inputFile = WScript.Arguments(0)
outputFile = WScript.Arguments(1)
searchText = WScript.Arguments(2)
replaceText = WScript.Arguments(3)

' Datei öffnen und Text einlesen und schließen
Set objFile = objFSO.OpenTextFile(inputFile, ForReading)
strText = objFile.ReadAll
objFile.Close

' Änderungen am Inhalt
strNewText = Replace(strText, searchText, replaceText)

' Neue Datei erstellen mit neuen Inhalten füllen
set resultFile = objFSO.CreateTextFile(outputFile, true)
resultFile.WriteLine strNewText
resultFile.Close

Hier das Resultat:
zeichen-einfachen-text-suchen-ersetzen-vbs-batch-complex-script

Eigentlich recht easy. In meinem nächsten Beitrag werden ich dieses Script nutzen um mit Batch dynamische HTML Reports zu erstellen. Wait for it!


In eigener Sache möchte ich heute kurz den Dienst servercheck24.de unter die Lupe nehmen. Der Dienst ist einer von vielen kostenpflichtigen Server Monitoring Diensten, kann sich in dem Preissegment aber sehen lassen. Im Gegensatz zu vielen Server Monitoring Anbietern hat Servercheck24 gleich 3 Preismodelle und ist somit für viele Anwendungsbereiche geeignet. Es gibt zwar leider kein kostenloses Angebot (was ich definitiv empfehlen würde), eine 14-tägige Testphase kann jedoch einen guten Einblick in die Features geben.
Ich habe mir das mal angesehen.

Coolerweise haben die Betreiber von servercheck24.de direkt nach der Veröffentlichung meines Tests einige angemerkte Stellen ausgebessert und mich informiert. Entsprechende Stellen habe ich im Beitrag angepasst.

Die Registrierung ist schnell gemacht und unkompliziert. Nach der Registrierung bekommt man direkt einen Überblick über die Features. Der „Server“ Menüpunkt ist natürlich die erste Station; hier kann man seinen ersten Server erstellen, bzw. dessen Überwachung. Die Eingabe einer URL ist erforderlich und ein Name wird vergeben.

Vorher: Die Eingabe kann anfangs knifflig werden. Meine ersten Versuche mit http:// am Anfang schlugen direkt fehl, egal welche Kombinationen ich probierte. Viel Hilfe gibt es beim Eingeben auch nicht, so eine Art Formatbeschreibung wie www.[name].[tld] hätte mir ja gereicht. Die URL Eingabe soll nämlich ohne Protokoll sein, nur www. am Anfang. Etwas ungewöhnlich aber verständlich, denn erst im nächsten Schritt wird erst das Protokoll gewählt, dass überwacht werden soll.
Nachher: Die Eingabe der URL sollte problemloser verlaufen, seit dem nun ein kleiner Hinweis unter dem Eingabefeld auf das Format hinweist.
serverueberwachung-uptimechecks-und-mehr-servercheck24-url-neu

serverueberwachung-uptimechecks-und-mehr-servercheck24-overview serverueberwachung-uptimechecks-und-mehr-servercheck24-protocols

Die Protokolle, die man überwachen kann, sind zahlreich. HTTP(S), SSH, FTP, DNS, Mailsprotokolle, TCP, PING, MYSQL, Domains, da ist alles wichtige mit dabei. Von normalen HTTP Abfragen bis hin zu stark modifizierten HTTPS Requests mit Suchbegriffen, Login Credentials, User-Agents, modifiziertem Header und POST Parametern ist da alles einstellbar. Die Möglichkeiten reichen also auch tief in interne, abgesicherte Webbereiche.

Vorher: Traurig: sowohl bei der Eingabe als auch in der Übersicht wird das Passwort der Login Credentials als Klartext dargestellt. C’mon, r’lly? Wenn ein type="password" im Eingabefeld schon zu viel Code ist, möchte ich nicht wissen wie die Passwörter in der Datenbank gespeichert sind. Unbedingt ändern!
Nachher: Die Passwörter werden nun maskiert angezeigt, so wie es sich gehört. Die erhöhte Sicherheit wird hoffentlich in der gesamten Programmierung des Dienstes so angestrebt wie bei den Textfeldern.
serverueberwachung-uptimechecks-und-mehr-servercheck24-password1-neu serverueberwachung-uptimechecks-und-mehr-servercheck24-password2-neu

Nach der Eingabe erscheint die Übersicht der Einstellungen, mit den Einstellungen für die Benachrichtigung und den Kontakten, die Benachrichtigungen erhalten sollen. Benachrichtigungen können entweder als E-Mail oder als SMS rausgehen, abhängig vom Status der Webseite. Eine Pager Nachricht ist ebenfalls möglich, sollte jemand noch einen Pager haben.
serverueberwachung-uptimechecks-und-mehr-servercheck24-new-http-pro-server serverueberwachung-uptimechecks-und-mehr-servercheck24-server-overview

Vorher: Leider scheinen SMS bisher nur in den USA möglich zu sein, deutsche Mobilfunkbetreiber sucht man vergeblich.
Nachher: Zugegeben, an dieser Stelle habe ich vermutlich nicht aufmerksam genug geschaut. Die Landesvorwahl +49 für Deutschland ist vorhanden und enthält auch die größeren hiesigen Netzbetreiber. Neu ist jetzt, dass sowohl beim Erstellen eines Accounts als auch beim Bearbeiten von Kontakteinstellungen automatisch die passende Landesvorwahl ausgewählt wird. Ich musste also +49 nicht einmal auswählen; das geschieht jetzt automatisch. Es funktioniert alles problemlos, TOP!
serverueberwachung-uptimechecks-und-mehr-servercheck24-sms serverueberwachung-uptimechecks-und-mehr-servercheck24-sms2

Weitere Protokolle und Server sind schnell erstellt und die eigene Weblandschaft in wenigen Minuten zur Überwachung konfiguriert. Dabei werden alle Protokolle eines Servers in eine „Gruppierung“ gesteckt. Ein neuer Server ist mit seinen Protokollen eine neue Gruppe. Mehrere logisch zusammengehörige Server zu einer Gruppe oder Art Kategorie zusammenzufügen geht leider nicht.
Für die Übersicht aller Server gibt es sowohl eine ausführliche und eine kurze Version.
serverueberwachung-uptimechecks-und-mehr-servercheck24-short-overview serverueberwachung-uptimechecks-und-mehr-servercheck24-detailed-overview

Zwei weitere nette Features sind der grafische Verlauf und der Auswertungsversand.
Ersteres zeigt den Status eines Servers in einem bestimmten Zeitraum grafisch an. Leider lassen sich hier nicht mehrere Protokolle oder Server in eine Grafik packen. Die Daten lassen sich in typische Dateiformate exportieren. Und die Auswertungen sind konfigurierbare regelmäßige Reports per E-Mail.
serverueberwachung-uptimechecks-und-mehr-servercheck24-daily-report serverueberwachung-uptimechecks-und-mehr-servercheck24-grafic-status

Fazit? Servercheck24 bietet ein recht angenehmes Preis-Leistungs-Verhältnis. Wer nicht viele Seiten zu überwachen hat kann mit 5€/Monat schon alle Features nutzen, mit einem 10 Minuten Intervall allerdings. Ich habe mal nach der Konkurrenz gesehen und nur sehr wenige (und auch wenig brauchbare) kostenlose Angebote, dafür aber auch viele recht teure Angebote gefunden.

Vorher: Wenn Servercheck24 jetzt noch die paar Kinderkrankheiten (ich glaube der Dienst ist erst vor ca 2, 3 Jahren online gegangen) ausbessern kann, sehe ich große Chancen in dem Markt.
Nachher: Innerhalb von 1 Tag haben die Entwickler einige Punkte ausgebessert und ich habe das Gefühl, dass in diesen Dienst noch sehr viel Energie fließen wird. Hut ab, Daumen hoch, go for it!

Interessiert? Einfach für einen Tarif registrieren und den Testzeitraum nutzen.


Mit einem PowerShell Script möchte ich alle Login/Logoff basierten Events eines Computers auflisten und gut lesbar in eine Textdatei schreiben. In meinem konkreten Fall filtere ich nur das Entsperren heraus.

Hier das PowerShell Script:

# Connects to the security eventlog of a remote computer and retrieves successful login events ( event ID 528 ) and what type of login took place 
# Information about login types found at http://www.ultimatewindowssecurity.com/securitylog/encyclopedia/event.aspx?eventid=528 
# 
# 22.09.2009 Konráð Hall 
# 2013 - edited by Hannes Schurig for newer systems (vista/7/server 2k8) and filter in german/english
cls

"Starte Tool..."
 
$events =  Get-EventLog -ComputerName Hannes-PC -LogName "Security" -newest 1000 | Where { $_.eventid -eq 4624 }

# english: $logonTypeText = "Logon Type:    "
# german:
$logonTypeText = "Anmeldetyp:			"

"Starte Eventverarbeitung..."

foreach ($event in $events) {
    
    if (($event.message | Select-String $logonTypeText+"2")){ 
        "LogonType 2 (Interactive Login);"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } <#
    if (($event.message | Select-String $logonTypeText+"3")){ 
        "LogonType 3 (Network Login)    ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"4")){ 
        "LogonType 4 (Batch Login)      ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"5")){ 
        "LogonType 5 (Service Login)    ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } #>
    if (($event.message | Select-String $logonTypeText+"7")){ 
        "LogonType 7 (Computer Unlocked);"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } <#
    if (($event.message | Select-String $logonTypeText+"8")){ 
        "LogonType 8 (Network Cleartext Login);"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"9")){ 
        "LogonType 9 (NewCredentials)   ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"10")){ 
        "LogonType 10 (RDP Login)       ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"11")){ 
        "LogonType 11 (Cached Credentials Login);"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } #>
}

original script by Konrad Hall

Das, ursprünglich von Konrad Hall stammende, Script habe ich etwas angepasst. In Zeile 9 muss der gewünschte Computername eingefügt werden.

Um die Funktionsweise zu verstehen sollte man in Erfahrung bringen welche verschiedenen Anmeldeereignisse und Anmeldetypen es gibt und welche EventIDs sie haben. Es gibt unterschiedliche EventIDs in XP/Server<2k3 und Vista/7/Server>2k3.
Ein Beispiel: erfolgreiche Anmeldungen werden mit der EventID 528 in Server 2k3 und mit 4624 in Server 2k8 geloggt.
tecchannel schreibt zu den vielen IDs auch noch etwas.
Mit ultimatewindowssecurity.com lässt sich das aber überblicken. Meine Beispiele beziehen sich auf Windows 7.

Wenn man sich alle Events des Security Logs anzeigen lässt, ist das eine ganze Menge:
anmeldeereignisse-mit-PowerShell-auslesen-all-events

Es kommt also drauf an, was man loggen möchte. Dann kommt es drauf an, welche EventIDs dieses Event auslöst. Daraus bastelt man sich den EventID Filter.
Mit | Where { $_.eventid -eq 4624 } (528 bei XP/2k3) am Ende des Befehls filtere ich erfolgreiche Anmeldungen heraus:
anmeldeereignisse-mit-PowerShell-auslesen-all-logins-4624

Das gleiche geht bei Abmeldungen mit der EventID 4634 (538 bei XP/2k3):
| Where { $_.eventid -eq 4634 }
oder eine Art Range Filter für Login und Logoff:
| Where { $_.eventid -ge 4624 -AND $_.eventid -le 4634 }
anmeldeereignisse-mit-PowerShell-auslesen-logins-and-logoffs

Nun sind also alle Events gefiltert. Diese werden dann in dem Script ab Zeile 17 noch einmal gefiltert. Hier kommen die Anmeldetypen ins Spiel. Diese sind aber bei allen Windows Versionen gleich.
Beispiel: „Normale“ Anmeldungen haben den Typ 2, Netzwerkanmeldungen 3, Entsperren die 7.

An dieser Stelle könnt ihr das Script beliebig anpassen um nur einen oder bestimmte Anmeldetypen zu filtern.
In dem Beispielscript oben sind alle Anmeldetypen bis auf den normalen („interaktiven“) Login auskommentiert. Hier 2 Beispiellogs für Entsperrungen und Entsperrungen+Logins:
anmeldeereignisse-mit-PowerShell-auslesen-logs
Achtung! Auf englischen Systemen müsst ihr die Kommentierung von Zeile 11 und 13 vertauschen, da sonst die Filterung Exceptions schmeißt. Ich habe das ja schon soweit vorbereitet.

Mit diesen Grundlagen könnt ihr beliebig in den Computerlogs (es gibt ja nicht nur die Security Logs) lesen, filtern, exportieren und mehr.


Ich sah letztens ein nettes Video über Curiosity’s Kameras und eine Stelle fand ich sehr verblüffend:
wie macht der Mars Rover solche Fotos?
PIA16239 High-Resolution Self-Portrait by Curiosity Rover Arm Camera

Definitiv ein Selbstportrait des Rovers. Wie wurde es gemacht? Der Rover stellt ja nicht mal eben so ein Stativ mit Kamera auf den Marsboden, stellt den Selbstauslöser ein und positioniert sich brav.

Nein, dieses Foto wurde mit einem der Arme des Rovers gemacht. Dass dieser Arm auf dem Foto nicht zu sehen ist, wurde mit einem ziemlich cleveren Verfahren erreicht:

(dieses Video wird in Chrome nicht direkt angezeigt, Chrome Users: klickt hier)


Git Repository 1:1 kopieren (duplizieren)

Ziel ist es ein Git Repository in ein anderes, leeres Git Repository zu kopieren, inklusiver aller Daten wie z.B. der History. Also das Kopieren / Klonen / Duplizieren eines Repositories inklusive aller Infos. Es reicht also nicht den Ordner nur zu kopieren und in das neue Repository zu pushen, damit hätte dieses Repository nur 1 Commit, nicht aber alle Daten übernommen.

Hier die Abfolge der Schritte:

  1. Das alte Repository „old-repo“ auf der Festplatte auf den aktuellsten Stand bringen; logisch
  2. Einen Ordner für das neue Repository anlegen; der Name des Ordners sollte dem Namen des neuen Repositories entsprechen
  3. Den Inhalt des Ordners „old-repo“ in den Ordner „new-repo“ kopieren
  4. Git Bash in „new-repo“ starten bzw. diesen Ordner in der Bash aufrufen
  5. Git origin neu setzen, Ziel ist das neue Repository:
    git remote set-url origin git@[Server IP/URL]:new-repo
  6. Neuen Master Stand pushen:
    git push origin master

Hier ein Video der Vorgehensweise:
YouTube Preview Image


Wenn ein frisch installiertes Betriebssystem erstmal fertig eingerichtet ist und perfekt läuft sollte man diesen Zustand im Notfall wiederherstellen können. Das Sichern von funktionierenden Treibern ist einer der Schritte, die man dafür regelmäßig durchführen sollte.

Double Driver ist klein, portable, kostenlos, einfach zu bedienen und besonders schnell!

Die Oberfläche ist besonders einfach und die Bedienung ist selbsterklärend:

Die Treiber des eigenen Systems sind in weniger als 1 Sekunde komplett geladen (zumindest bei mir). Irgendwie soll man auch andere Systeme scannen können; wie das geht habe ich aber noch nicht getestet.

Wie bei den meisten Treiber Backup Tools werden alle Systemtreiber gelistet aber nur die non-Microsoft Treiber ausgewählt. Diese Selektion ist schon am sinnvollsten, lässt sich bei Bedarf aber verändern. „All“, „None“, „Invert“ beschleunigen die Anpassung.

Die Treiber lassen sich als Ordner, als gezippte Ordnerstruktur oder als selbstentpackendes Archiv sichern. Treiber größerer Systeme können schon mal 100-200MB groß sein, die 2 ZIP Auswahlmöglichkeiten würde ich also empfehlen. Damit kann die Größte auf 40-80MB verringert werden. Das Wiederherstellen der Treiber ist ebenso simpel. Die Sicherung wird ausgewählt und alle gesicherten Treiber werden aufgelistet. Hier kann man dann entweder alle Treiber wiederherstellen oder einzelne Einträge deselektieren.

Das Tool ist dazu portable, muss also nicht installiert werden und funktioniert sofort auf jedem System, gerne auch vom USB Stick aus.

Super Freeware, Hut ab.
Das Sichern der Treiber funktioniert auch bei Windows 8. Ich gehe davon aus, dass auch die Wiederherstellung funktioniert. Probieren geht über studieren.


Ich habe bereits vor einigen Monaten mal über die Erkennung von laufenden Prozessen via Batch geschrieben. Damals habe ich diese Erkennung in einfachen oder komplexeren If Else Blöcken verschachtelt. Ich habe nun gemerkt, dass dies zu Problemen und falschen Erkennungen führen kann!

Daher hier das Update: If Else Verschachtelungen können zwar ein paar Zeilen sparen aber verfälschen Errorlevel Rückgaben! In If Else Blöcken würde ich keine Programmbefehle schreiben, die mit dem Errorlevel arbeiten sollen. Lieber mit einigen gotos arbeiten.

Hier ein Beispiel:

REM Statt:
if /i %action%==start-server (
 tasklist |find /i "IQB_Server.exe"
 if not %errorlevel%==0 start IQB_Server.exe
 goto end
)

REM folgenden Code verwenden:
if /i %action%==start-server goto start-server
:start-server
 tasklist |find /i "IQB_Server.exe"
 if not %errorlevel%==0 start IQB_Server.exe
 goto end

REM Errorlevel in IF ELSE Blöcken können falsch sein!

Nochmal zum Erkennen von Prozessen via Batch: hier sind 3 verschiedene funktionierende Methoden:

REM %errorlevel% ist immer 0 wenn der Prozess existiert
REM 1 wenn nicht gefunden
REM am besten mit 'if not "%errorlevel%"=="0"' überprüfen

REM Variante 1:
tasklist | find /i "dropbox.exe"

REM Variante 2:
tasklist /FI "IMAGENAME eq dropbox.exe" 2>NUL | find /I /N "dropbox.exe">NUL
REM beide NUL Umleitungen optional

REM Variante 3:
tasklist /nh /fi "imagename eq dropbox.exe" | find /i "dropbox.exe" >NUL
REM letzte NUL Umleitung optional

English Version

A few months ago I already wrote a post about the detection of running processes with batch. In this post I used this detection code inside simple or more complex if-else block statements. I recently noticed possible false positives if doing so. Using %errorlevel% return codes inside if-else statements can lead to wrong return codes.

So, here’s the update: if else structures can save a few code lines but can also falsify errorlevel return codes! And since the detection of running processes rely on errorlevel returns you should use gotos instead of if else.

Here’s a code example:

REM instead of:
if /i %action%==start-server (
 tasklist |find /i "IQB_Server.exe"
 if not %errorlevel%==0 start IQB_Server.exe
 goto end
)

REM use this code:
if /i %action%==start-server goto start-server
:start-server
 tasklist |find /i "IQB_Server.exe"
 if not %errorlevel%==0 start IQB_Server.exe
 goto end

REM errorlevel return codes in if-else blocks may be wrong!

Here are 3 different working code examples for process detection:

REM %errorlevel% is always 0 if the process is running
REM and 1 if it is not running
REM best way is to check with 'if not "%errorlevel%"=="0"'

REM code 1:
tasklist | find /i "dropbox.exe"

REM code 2:
tasklist /FI "IMAGENAME eq dropbox.exe" 2>NUL | find /I /N "dropbox.exe">NUL
REM both NUL redirections are optional

REM code 3:
tasklist /nh /fi "imagename eq dropbox.exe" | find /i "dropbox.exe" >NUL
REM last NUL redirection is optional

via, via


Admin

Sie möchten hier werben oder Sponsor auf längere Zeit werden? Ich garantiere Ihnen unschlagbare Preise bei meinen Besucherzahlen. Egal ob Banner, Textlinks oder andere Werbeformen. Informieren Sie sich bei mir unter werbung@hannes-schurig.de