Windows Server 2008: automatisches Backup per Batch

Im Windows Server 2008 ist das Backup Tool „Windows Server Backup“ enthalten.

Edit/Update: Diese Serversicherung (vor allem die später beschriebene automatische Sicherung per Script) ist ein Feature von Windows Server und muss als solches also erst installiert werden. Geht dazu in den Server-Manager, auf „Features hinzufügen“ und installiert die komplette „Windows Server-Sicherungsfeatures“. Für die Befehlszeilenvariante muss auch „Windows Powershell“ mitinstalliert werden.

Mit diesem Feature sind Backups schnell erstellt, manuell oder auch automatisch. Die automatische Erstellung von Server Backups wird durch einen simplen „Sicherungszeitplan“ ermöglicht. Bei der Erstellung eines solchen Plans stehen allerdings nur 2 Zeitspannen zur Verfügung: täglich und mehrmals täglich.

Für eine seltenere Sicherung ist keine Option vorgesehen. Möchte man nun doch flexibler Backups erstellen ist ein Workaround angebracht.

Meine spontane Idee war ein Backup per Batch und diese dann per Taskplaner timen.

Wie erstellt man ein Backup per Batch? Hier der Befehl:

wbadmin start backup -backuptarget:F: -include:C:,D: -vssfull -quiet
-backuptarget

bestimmt das Ziel,

-include

die zu sichernden Quellen,

-quiet

besagt ohne UI und

-vssfull

gibt an, dass mit dem Volume Shadow Copy Service die History aller Dateien aktualisiert wird.
Mehr Infos erhaltet ihr mit

wbadmin start backup /?

.
Backups die mit Hilfe der Batch erstellt wurden werden auch im „Windows Server Backup“ Tool gelistet und können dort auch ganz normal benutzt werden. Also es geht keinerlei Funktionalität durch die CMD verloren.

Die erstellte Batch können wir jetzt per „Aufgabenplanung“ automatisch ausführen lassen, in meinem Fall einmal wöchentlich.
Um eine etwas bessere Kontrolle über das Ergebniss der Sicherung zu haben empfehle ich die Batch auszubauen:

set logfile="C:\backuplog.txt"
echo ########################## %computername%: %date% - %time% >> %logfile%
echo. >> %logfile%
wbadmin start backup -backuptarget:F: -include:C:,D: -vssfull -quiet >> %logfile%
echo. >> %logfile%
echo ########################## %computername%: %date% - %time% >> %logfile%

Wir setzen den Pfad zu einer Logdatei in die Variable

logfile

und geben vor dem Backupvorgang und danach einige Informationen dazu. An unsere bekannte Zeile 4 hängen wir die Umleitung

>> %logfile%

an.
Die Textdatei sieht nach einem Backupvorgang ungefähr so aus:

Der Aufgabenplaner sollte die Batch nach Plan ausführen, diese sollte ein tolles Backup erstellen und den Vorgang in die Logdatei schreiben und das Server Backup Tool sollte die Sicherung erkennen.
Links die manuellen Tests und rechts das Backup am Samstag.

Das wars! Vielleicht etwas unprofessionell aber es funktioniert 1A!

Update: Ich habe das Script noch weiter ausgebaut und möchte euch das natürlich nicht vorenthalten. Das Sicherungsziel wird jetzt über eine Variable angesprochen. Diese wird erst auf Ort 1 gesetzt und falls dieser – aus welchen Grund auch immer – nicht erreichbar ist wird ein Ort 2 als Alternative gesetzt. Hier ließen sich natürlich weitere Alternativen einbauen, es sollte aber eher die Bemühung es Admins sein, einen zuverlässigen Ort zu arrangieren 😉
Das Backup wird jetzt mit -allCritical und -systemState ausgeführt und sicher somit systemkritische Dateien aller Art mit.
Update 20.07.2011: -systemState gibt es nicht mehr!? Vorerst entfernt.
Bei einem Fehlschlag wird die Logdatei entsprechend geschrieben und eine Alarmmail via Batch Mailer an die Admins abgesetzt. Wie ihr diesen Batch Mailer aufsetzt steht hier.

@echo on
if not exist Z: net use Z: \\server\*** /user:***
set logfile="C:\backuplog.txt"
::error mail reciever
set mailto=***@***.***
for /f "skip=1 tokens=2 delims=[]" %%* in ('ping.exe -n 1 -4 %computername%') Do (set "IP=%%*") 
for /f "tokens=1,2,3,4 delims=." %%a in ("%IP%") do set IPb1=%%a&set IPb2=%%b&set IPb3=%%c&set IPb4=%%d

set target=\\server\***

echo ########################## %computername%: %date% - %time% >> %logfile%
echo. >> %logfile%
wbadmin start backup -backuptarget:%target% -include:C: -vssfull -allCritical -quiet >> %logfile%
set backuperrorlevel=%errorlevel%
if "%backuperrorlevel%"=="0" (goto end) else (goto fehler)

:fehler
echo. >> %logfile%
echo. >> %logfile%
echo ______________________________ >> %logfile%
echo ****************************** >> %logfile%
echo ****************************** >> %logfile%
echo  Ein Fehler ist aufgetreten!!  >> %logfile%
echo ****************************** >> %logfile%
echo ****************************** >> %logfile%
echo Errorlevel: %backuperrorlevel% >> %logfile%
echo. >> %logfile%
echo. >> %logfile%
:: Batch Mailer
:: http://hannes-schurig.de/23/06/2011/batch-mailer-email-aus-batch-script-schicken/
:: sendet eine Mail an und meldet fehlgeschlagenes Backup
start "iexplore" "https://stuff.it-stack.de/mailer.php?******&contactname=.%IPb4% %computername%&subject=Backup fehlgeschlagen &email=***@***.***&message=Das woechentliche automatische Backup auf: .%IPb4% "%computername%" ist fehlgeschlagen || Errorlevel: %backuperrorlevel%&mailto=%mailto%"
::20 Sekunden warten und Internet Explorer Fenster schließen
ping 127.0.0.1 -n 20
taskkill /im "iexplore.exe"
ping 127.0.0.1 -n 5

:end
echo. >> %logfile%
echo ########################## %computername%: %date% - %time% >> %logfile%
echo ########################### Errorlevel: %backuperrorlevel% >> %logfile%
echo. >> %logfile%
exit

To-Do: Logdatei beim Fehler als E-Mail Anhang mitschicken. Keine Ahnung, wie ich das mache. Ideen?

66 Kommentare

  1. Bin jetzt auch nicht DER Server Experte, zugegebenermaßen. So seh ich das:
    Also wie geschrieben, Serverbetriebssysteme sind auf höchste Last und höchste Redundanz getrimmt. Wenn man einen professionellen Server betreibt dann wird normalerweise erwartet, dass dieser MINDESTENS täglich gesichert wird. Wer kauft schon ein 2000€ Betriebssystem und möchte dann nicht täglich sichern?
    So sehe ich das zumindest. Wir haben bei uns aber einfach nicht die Veranlassung tägliche Sicherung zu überwachen, kontrollieren und den Überblick zu behalten. Selbst wöchentliche Sicherungen reichen und vollkommen.
    Daher mein Workaround da ich spontan keine bessere Planung eines Server Backups im seltenen Zeitraum gefunden habe.

    Wenn du also einen Weg findest, das „normal“ zu machen bitte ich um einen kurzen Wink 😉

    Danke fürs Lesen/Überfliegen 🙂

  2. hi,

    backup mit dem asistenen für sicherungszeitplan
    und dann in die tastkverwaltung und den task auf
    wöchenltlich stellen, sollte funktionieren…

    probiere das z.z. an einem 2008 server

    ben

  3. also ich kann morgen bescheid sagen ob das funktioniert,
    bzw. spätestens am sonntag, weil da das wöchentliche backup läuft

    im windows backup-server steht zwar noch drin,
    dass es täglich sichern will, aber da der task dahinter hängt,
    würde ich mal meinen, dass die übergabe einfach mal nicht hinhaut

    auch sehr interessant ist ja, dass das backup nach
    einem verschieben nicht mehr durchsuchbar ist
    (musste ich feststellen, als mal ein ordner wiederhergestellt werden sollte)

    da ist mir die time-machine lösung von apple dann doch lieber 😀

    ben

  4. Genau nach sowas habe ich gesucht. Endlich kann die Sicherung automatisch auf eine Netzwerkfreigabe gespeichert werden. Über die GUI war das ja leider nicht möglich gewesen. Aber mit dem Script gehts.

    PRIMA, DANKE

  5. Die Benutzerkontensteuerung ist beim Administrator aktiviert, danach wird es eher nicht liegen.

    Hast du den Befehl korrekt angepasst?

    wbadmin start backup -backuptarget:F: -include:C:,D:

    mit den korrekten Buchstaben versehen und ausreichend Speicherplatz auf dem Zielmedien?

  6. Ja – nur die Laufwerksbuchstaben entsprechend angepasst. Ich gebe

    wbadmin.msc start backup -backuptarget:E: -include:C: -vssfull

    unter start-ausführen ein.

    Der Server-Manager startet – ich muss bestätigen, dass ich den Vorgang fortsetzen will (UAC). Danach ist das fenster für die Windows-Server-Sicherung offen. Aber das war es dann auch schon. Es wird nichts gestartet.

    (SBS 2008 SP2)

  7. erstmal vielen dank fuer die bereitstellung deines batch files. ich war bisher noch nicht mit solchen dingen betraut sichere aber nun via task alle 2 tage voll automatisch sogar mit log auf eine externe NAS!

    frage, wie kann ich denn z.b. nach der ersten voll nur noch inkrementell sichern, gibt es da auch ein batch moeglichkeit?

    andernfalls waers mirr echt wenn er fuer jede sicehrung nen ordner mit timestamp erstellt – ist sowas ohne großen aufwand moeglich?

  8. Guck dir mal die Befehlsreferenz von wbadmin an, entweder mit

    wbadmin.msc /?

    oder hier. Es sieht so aus als wäre ein inkrementelles Backup Standard, wenn man nicht -vssFull als Parameter angibt.
    Testen musst du das aber selbst.

    Was den Timestamp Ordner angeht kannst du doch einfach den Befehl leicht abändern:

    wbadmin start backup -backuptarget:F:%date% -include:C:,D:

    Oder?
    Batch wandelt Date in das Datum um und bei jedem Backup landet es dann in einem neuen Ordner.

  9. Interessant – das Tool scheint wohl nur im Command-Fenster zu laufen. Wenn ich das als Administrator laufen lasse, funktioniert es.
    Sobald ich aber den Befehl direkt eingebe (z.Bsp. über Start-Ausführen) öffnet sich die GUI und dann passiert nichts weiter.

    Meine alte Sicherung (die ich über direkt über die GUI gestartet hatte) scheint aber überschrieben worden zu sein. Ist das normal?

  10. @DT: Als Ergänzung, gerade eben als Update auch in den Artikel eingepflegt:
    Für die Ausführung von Backups via Kommandozeile, wie im Artikel beschrieben, müssen entsprechende Serverfeatures installiert sein.
    Siehe Artikelupdate, gleich am Anfang.
    Vielleicht sind/waren die bei dir nicht installiert und deswegen hat das Script nicht funktioniert?

  11. Hallo zusammen

    Vielen Dank für die Beschreibung, war sehr nützlich, habe das Script um ein paar Befehle erweitert. Hier ein paar Anregungen:

    Ich persönlich würde folgende Parameter zusätzlich angeben:

    -allCritical (Erstellt zu den bereits angegebenen Volumes eine Sicherung aller Volumes, die Systemdaten enthalten.)
    -systemState (Erstellt eine Sicherung von Systemdaten, fragt mich nicht was genau aber ev. wichtig für eine Wiederherstellung im Ernstfall)

    Also wenn man das Backup über das GUI einrichtet, kann auch eine Inkrementelle Sicherung durchgeführt werden. Dabei werden nur neuere Systemdaten gesichert und so lange wie möglich behalten. (Werden meines Wissens erst dann gelöscht, wenn der Platz knapp wird.)
    Wie es mit dem angegebenen CMD-Befehl verhält kann ich noch nicht sagen.

    Grz
    Cr

    P.S.
    Einige Punkte sind wichtig bei der Einrichtung über die Aufgabenplanung:

    Folgende Punkte sollten aus meiner Sicht gewählt werden:
    „Allgemein“
    –> „Unabhängig von der Benutzeranmeldung ausführen“
    –> „Mit höchsten Privilegien ausführen“

    „Bedingungen“
    –> (Hacken entfernen!) „Beenden, wenn Computer in den Akkubetrieb wechselt“
    –> „Computer zum Ausführen der Aufgabe reaktivieren“

    „Einstellungen“
    (dem Bedarf entsprechend anpassen, die Backups sollten sich nicht überschneiden können!)

    Beim drücken von „OK“ sollte man nun auch aufgefordert werden, Benutzerdaten einzugeben, mit denen die Aufgabe ausgeführt werden soll. (Administrator oder anderen benutzer mit genügend hohen Rechten wählen!)

  12. Danke für die Hinweise.

    Mittlerweile habe ich mein Script auch stark überarbeitet.
    Enthalten sind jetzt auch die 2 erwähnten Parameter, eine Fehlerbehandlung mit Administratoren Mailbenachrichtigung und flexiblerer Sicherungszielwahl (mit Ausweichziel).
    Hier ist mein jetziges Script: Link
    Ich schreibe das nochmal in ein Updatepost. Oder update es hier.

    edit: Habe ein Post Update gemacht.

  13. Seh ich das richtig: es gibt den Befehl

    -systemState

    nicht mehr?!
    Zumindest bricht seit 2, 3 Wochen das Backup ab,

    -systemState

    sei kein gültiger Parameter. In der

    wbadmin start backup -?

    Hilfe steht der Parameter auch nicht mehr drin.

  14. Hy
    absolut toll was du da gemacht hast – bezüglich mail hab ich

    das gemacht

    c:\Sicherung\mail-as-batch.exe -smtp xxx.xxx.com -from Sicherung@xxx.com -to xxx@xxx.com -S „Sicherung Fehlgeschlagen“ -body backuplog.txt

    wenn ich das im cmd starte funktioniert das einwandfrei – ich weis leider nicht wie ich das in deinem Script richtig einbinden soll – toll wäre es wenn ich das mail-as-batch einmal ausführt wenn die Sicherung funktioniert hat und eben wenn ein Fehler ist und nach jedem Mail soll der die log löschen

    könnt ihr mir da helfen denn damit decken wir alle Probleme ab 🙂

  15. Na du musst doch nur die eine Zeile von dir anstatt meiner „start iexplore“ Zeile einsetzen und nochmal beim erfolgreichen Backup.
    Also ich nehm mal mein Script von oben ab Zeile 32:

    [... :fehler]
    echo. >> %logfile%
    echo. >> %logfile%
    c:Sicherungmail-as-batch.exe -smtp xxx.xxx.com -from Sicherung@xxx.com -to xxx@xxx.com -S “Sicherung Fehlgeschlagen” -body backuplog.txt
     
    :end
    echo. >> %logfile%
    echo ########################## %computername%: %date% - %time% >> %logfile%
    echo ########################### Errorlevel: %backuperrorlevel% >> %logfile%
    echo. >> %logfile%
    c:Sicherungmail-as-batch.exe -smtp %smtp% -from %from% -to %to% -S “Sicherung auf Server %computername% %IPb4% erfolgreich” -body backuplog.txt
    exit
    

    Das wars. Du kannst natürlich die Absender- und Empfängeradresse sowie SMTP in Variablen speichern und dann die Variablen im Aufruf nutzen. Sollten sich diese Daten mal ändern hast du das Script schnell angepasst.
    Ich habe das beispielsweise mal in der vorletzten Zeile gemacht.

    So würde ich die Zeile gestalten, ist halt auch kürzer mit Variablen.
    Die %IPb4% Variable steht für das 4. Byte der IP, also bei 113.120.45.100 gibt es 100 zurück. Wie du die Variable ausliest steht hier: einzelne Teile der IPv4/v6 auslesen

  16. Hy,

    Die Patch Datei finde ich super.
    Wäre es auch möglich Virtuelle Maschinen so zu sichern?
    Grund meiner Frage ist: Habe drei NAS zum Backup und würde gerne MoMiFr, DiDoSa und So auf unterschiedliche NAS sichern.
    Jedoch handelt es sich um virtuelle Maschinen.

    VSS Writer schon installiert und die std. Windows Server Sicherung funktioniert auch.

    LG Andreas

  17. Du kannst virtuelle Maschinen nur grob sicher. Das heißt: du kannst die .vhd und .vram Dateien sichern und könntest im Notfall versuchen die VM mit diesen Dateien wiederzubeleben.
    Das solltest du vorher aber mal getestet haben ob/wie das dann geht.
    Die Batch würde also statt (oder zusätzlich zu) der wbadmin Schnittstelle einen normalen xcopy Befehl auf die VM Dateien absetzen und diese sichern. Es wäre noch fraglich, ob das beim Betrieb der VM geht, ob xcopy benutzte Dateien kopieren kann. Wenn ja wäre die nächste Frage welcher Stand dann gesichert ist. Der Live Zustand im Zeitpunkt der Kopieraktion oder ein älterer Stand, der in die Dateien geschrieben wurde.

    Mehr als diese Gedankenabstöße kann ich leider nicht liefern, habe das bisher noch nicht gemacht. Aber das sollte reichen um paar Tests zu fahren.

  18. Hallo,
    vielen Dank für Deinen Beitrag. Es ist genau, das was ich gesucht habe.
    Ich sichere hier einen SBS und hatte das Problem, dass ich mit der integrierten Sicherung nicht auf ein NAS sichern konnte.
    Nun stellt sich folgende Frage:
    wenn ich mit wbadmin _täglich_ sichere, dann läuft mir irgendwann mal das NAS über.
    Gibt es eine Möglichkeit, z.B. aktuell nur 10 Sicherungen vorzuhalten, so dass dann die 11. Sicherung die ältstes überschreibt bzw. löscht?
    Tausend Dank!
    Erich

  19. Hallo Erich.
    Eine Realisierung von 10 Backups ist sicherlich einfach per Batch möglich. So würde ich es spontan machen: vor der Sicherung die Anzahl der Ordner des Sicherungsordners zählen lassen. Wenn mehr als 10; ältesten Ordner löschen.

    Habe dazu gerade mal ein wenig rumprogrammiert und einen Beitrag geschrieben; praktisch nur für dich ^^
    http://hannes-schurig.de/09/09/2012/batch-ordner-und-dateien-zaehlen/

    Dann musst du also nur noch den ältesten Ordner löschen wenn die Anzahl an Ordner größer als 10 ist, das sollte ja machbar sein 😉
    Wenn nicht sagste nochmal Bescheid.

    Bezüglich der Parameter: siehe Kommentar 16, wbadmin /? oder
    hier. So richtig erkundet habe ich das noch nicht. Ich vermutete damals vsscopy = inkrementell. Jemand der wirklich Ahnung hat darf hier gerne Klarheit schaffen 😉

    Liebe Grüße

  20. Hallo Hannes,
    die Idee mit so einer Batch-Datei ist mir auch schon gekommen, aber Du hast das wirklich perfektioniert!!

    Ich habe auch noch eine Frage:
    Wir haben eine SQL-Datenbank, die vor der Sicherung gestoppt werden soll, und nach der Sicherung wieder gestartet werden soll.
    Wenn ich den Befehl „net stop …“ vor dem Aufruf der Sicherung platziere wird der ja noch ausgeführt, aber wenn ich in die Zeile nach dem „wbadmin …“-Aufruf den Befehl zum starten des SQL-Dienstes „net start …“ schreibe, startet der den SQL-Dienst bereits während die Sicherung läuft, weil das script nur die Datensicherung aufruft, und danach sofort im script weitermacht!
    Gibt es irgendeine Möglichkeit zu warten bis die Server-Sicherung fertig ist, und direkt danach den SQL-Dienst zu starten?
    Das wäre sehr wichtig für uns und wahrscheinlich auch für viele andere Admins!

    Gruß
    Heiko

  21. Ja so etwas gibt es und es ist ziemlich easy:

    start /wait programm.exe

    ist schon alles.
    Du änderst also die

    wbadmin [bla]

    Zeile in

    start /wait wbadmin [bla]

    um und dann sollten kommende Befehle abwarten bis wbadmin geschlossen wird.
    Zumindest würde ich das jetzt so vermuten, getestet hab ich das mit wbadmin noch nicht.
    Gib bitte ne Rückmeldung wie es lief 🙂

  22. Ganz so einfach ist das leider nicht…
    Der Befehl „wbadmin …“ startet bloss das Windows Server-Sicherungstool. Für ihn ist die Aufgabe mit dem Start des Tools erledigt.
    Mit „start /wait “ hatte ich nämlich auch schon rumprobiert, aber nach dem Start der Sicherung geht es schon in der Batchdatei weiter.
    Die Sicherung ist zu dem Zeitpunkt aber noch nicht abgeschlossen!
    Wnn man dann den SQL-Server schon wieder starten würde, würde der während der eigentlichen Sicherung laufen und den Zugriff auf die Daten verweigern.

    Man müsste also irgendein Feedback von der Server-Sicherung erhalten, damit man weiß, wann diese fertig ist…

  23. Hallo Heiko,
    ich mache das ähnlich wie Hannes (danke auch für die Infos bzgl. Mail).
    Du kannst die einzelnen Aktionen in verscheidene Batch-Dateien auslagern und diese aus der „Haupt“-Batch mit CALL aufrufen, dann wird auf das Ergebnis gewartet.
    Das funktioniert bei meinen Kunden bestens mit Server 2008 R2 und SBS 2011.
    Viele Grüße
    Hartmut

  24. Hallo Hartmut,
    kannst du ein solches Beispielscript hier mal posten? Den betreffenden Teil mit dem Auslagern zumindest?
    Ich grübel gerade ein wenig über die mögliche Realisierung mit dieser Taktik.

    LG

    @Heiko: mich wundert es übrigens, dass bei dir nach dem wbadmin Befehl direkt alle folgenden Befehle ausgeführt werden.
    Nach meinem wbadmin Befehl (siehe Script oben) wird der errorlevel abgefangen. Allein deswegen muss das Script ja warten, bis wbadmin durch ist; erst dann kann der nächste Befehl auch das errorlevel verarbeiten.
    Und das passiert bei mir auch, denn mit dem errorlevel wird danach ja viel hantiert.
    Also ggf. in deinem Script einfach mal ein errorlevel danach abfangen, selbst wenn du ihn nicht brauchst müsste das Script die Verarbeitung solange pausieren.

  25. Hallo Hannes,

    gerne!

    Hier mein Standard-Skript für meinen Notebook, beim Server muss man die PowerConfigs und das Herunterfahren natürlich weglassen ; )

    Vorneweg sei noch gesagt, dass ich „WakeupOnStandBy“ von Dennis Babkin benutze, um meinen Notebook aus dem Ruhezustand zu wecken für das Backup.

    REM Energieoptionenen (Win7) auf "volle Pulle"
    call PowerConfig_Backup_Before.bat
    
    REM Wochentag als Zahl für die Ordner und das Logfile
    call Wochentag.bat
    
    REM Backup System mit wbadmin wie du es auch machst
    call Backup_Voll_System.bat
    
    REM Backup Daten mit ROBOCOPY
    call Backup_Voll_Daten.bat
    
    REM Archive-Attribut auf "-" setzen, damit danach das inkrementelle Backup funktioniert (leider macht das RoboCopy nicht allein)
    call Set_Attributes.bat
    
    REM Alte Energieoptionen wiederherstellen
    call PowerConfig_Backup_After.bat
    
    REM Notebook runterfahren
    call Herunterfahren.bat
    

    Das ganze mit Parametern (2 ext. Platten) und ab in die Aufgabenplanung!

    Das habe ich mir gebastelt, als meine Kauf-Version eines namhaften Herstellers nicht mehr richtig wollte und dieser keine Abhilfe schaffen konnte.

    Das ist relativ einfach, aber sehr robust und läuft bei mir und allen meinen Kunden.

    Bei Bedarf poste ich auch gerne den Inhalt der Batch-Dateien!

    Beste Grüße

    Hartmut

  26. Der Inhalt der Batch Dateien würde mich durchaus interessieren, vielleicht finde ich ein paar neue Tricks 😉
    Kannst du mir diese per Mail zuschicken? Hier 7 Scripte zu posten ist vielleicht etwas zu übertrieben; wer sie ebenfalls haben möchte kann dich ja kontaktieren.

    LG

  27. Hallo Hannes,
    ich habe meinen Fehler lokalisiert.
    Ich hatte vorher eine Server-Sicherung über das Sicherungstool erstellt. Dabei wurde in den Aufgabenplaner ein Aufruf „wbadmin start backup…“ gesetzt, der dann eine kryptische Zahlenkombination enthielt.
    Diese Zeile habe ich in meiner Batchdatei verwendet. Anscheinend wird mit diesem Befehl die Sicherung wirklich nur angestoßen, denn es geht danach sofort mit der Batchdatei weiter. Wenn ich den wbadmin-Befehl vollständig ausschreibe, wartet er in der Batchdatei wirklich bis zum Ende der Sicherung.

    🙂

    Mich würde noch folgendes Interessieren:
    Du beschreibst oben das Szenario, dass man die Anzahl von Dateien in einem Ordner zählen kann und hast auch ein script dazu eingestellt.
    Wie kann man jetzt aber z.B. die älteste Datei in diesem Ordner löschen, wenn die Anzahl der Dateien über 10 ist?

    Gruß
    Heiko

  28. Lösungsvorschläge für zuvor angesprochene Problematik Löschen älteste Dateien/Ordner mit DOS Console bzw. hier Batch Schnipsel

    for /f „skip=5“ %%i in (‚dir /b /o-D /a d /tc „H:\??.??.????“‚) do (rd /s /q „h:\%%i“)
    Identifiziere und lösche alle ORDNER mit der Syntax xx.xx.xxxx (deutsches Datumsformat z.B. 14.06.2013) und überspringe dabei die 5 jüngsten …. Ergebnis die jüngsten fünf Sicherungsordner bleiben erhalten, alle älteren werden gelöscht

    for /f „skip=5“ %%i in (‚dir /b /o-D /a-d /tc „H:\BACKup_*.bkf“‚) do (del /f /s /q „h:\%%i“)
    Identifiziere und lösche alle Dateien mit der Syntax BACKup_irgendwas.bkf (altes NT BackUp Format, geht natürlich auch mit jeglichem anderen Dateityp) und überspringe dabei die 5 jüngsten …. Ergebnis die jüngsten fünf NT BackUpSicherungen bleiben erhalten, alle älteren werden gelöscht

    Grüße, Matze

    1. Hi matze!
      Stimmt, das „alte Ordner löschen “ Problem wollte ich ja auch noch angehen.
      Aber besser als deine Lösung wäre meine nicht geworden! Sogar mit datumsformaterkennung, nice.
      Kann ich mit deinem code einen neuen Artikel zu dem Thema schmücken?

      1. Hallo Matze, hallo Hannes,

        ich erhalte immer die Fehlermeldung „5“ %%i in (‚dir /b /o-D /a d /tc „h:??.??.???“‚) do (rd /s /q „h:\%%i“)“ kann syntaktisch an dieser STelle nicht verarbeitet werden.

        Was läuft da bei mir schief??

        1. Hallo Heiko,
          hast du den Laufwerksbuchstaben des Befehls angepasst?
          Im Befehl werden die Ordner in der Root von H:\ untersucht; ist das bei euch auch H:\?

          Wenn ja, kannst du mal auf H:\ den dir Befehl schmeißen, danach diese Scriptzeile ausführen und ein Screenshot davon machen?
          Schick mir einfach per Mail, ich schau mir das mal an.

  29. Hallo,

    Hat jemand schon mal die Erfahrung gemacht das Windows alle alten Backups einfach löscht, ohne Warnung? Ist mir jetzt schön öfters passiert. Z.b. 100 Backups gemacht mit Script dann kommt ein Tag da hat man nur noch eine, die letzte Sicherung. Problem kommt auch wenn man kein Script verwendet. Warum und wieso weiß ich nicht.
    Das Vertrauen in Windows Backup Server 2008 R2 ist etwas gestört. Ich würde es gerne weiter verwenden aber nicht so.
    Es war genug Speicher frei auf dem Ziellaufwerk. Vielen Dank!

  30. Hallo Wolfgang. Das Problem ist mir nicht bekannt, klingt auch echt komisch.
    Merksatz: Sicherungen sollten NIE nur an 1 Ort liegen. Vor allem nicht bei über 100 Sicherungen. Vor allem nicht bei den heutigen Festplattenpreisen.
    Mein Tipp: die Sicherungen sichern/duplizieren. Heißt: Nach einem erfolgreichen Backup mit wbadmin liegt die Sicherung auf einer Festplatte X. Dann hast du noch eine Festplatte Y, auf die das fertige Backup anschließend kopiert wird. Also am Ende des Scripts auf Errorlevel 0 testen und dann die Daten mit xcopy auf die zweite Platte kopieren.
    Alle Backups existieren also redundant auf 2 Festplatten. Sollten die Backups auf der direkt angeschlossenen Platte X gelöscht werden hast du trotzdem alles noch auf Platte Y verfügbar.
    Um die Sicherheit noch weiter zu erhöhen sollten beide Instanzen statt einfacher Festplatten eher NAS sein, beide vielleicht mit 4 Platten im RAID 0, jeweils 2 aktive Platten mit Spiegelung.
    Noch mehr Sicherheit gibt es, wenn das zweite RAID, auf dem die Sicherungen nachträglich kopiert werden, in einem anderen Raum/Haus stehen.
    Noch sicherer wird das ganze, wenn du diese 2. Festplatteninstanz auch noch jeden Monat auf ein Bandlaufwerk sicherst. Und noch sicherer ist es natürlich wenn diese Bänder ebenfalls in einem anderen Raum/Haus oder sogar in einem (feuer-, wasser- und drucksicheren) Tresor gelagert werden.
    Na gut, die letzten 2 Punkte mit Band und Tresor sind für Systembackups eher unüblich und preislich nicht sinnvoll 😉
    Aber wer Datensicherheit lebt, wird das mögen 😉

  31. Hallo,
    es ist es mittlerweile bei der Sicherung auf ein Netzlaufwerk möglich, dass er inkrementelle Sicherungen anlegt?
    und ist es außerdem möglich, dass er immer nur eine gewisse Anzahl von Versionen aufhebt?
    Danke

  32. Hallo Alex, zu beiden Themen gibt es hier schon reichlich Diskussionen. Such in den Kommentaren einfach mal nach „inkrementell“, da wurde viel geraten ^^ Es gilt also hier vor allem selber zu testen und, wenn du erfolgreiche Tests gemacht hast, das hier natürlich mitzuteilen.
    Das Löschen von älteren Sicherungen und Beibehalten der aktuellsten X Sicherungen steht ebenfalls ein paar Kommentare weiter oben (hauptsächlich Nr. 49).

  33. Hallöchen
    ersteinmal ein großen Dank für deine Batchdatei und die Arbeit die dahiner steckt.
    Ich habe folgendes Problem
    Die Sicherungen sollen auf extrne USB Platten die bei bedarf gewechselt werden laufen, jedoch versteht WBadmin – den parameter -backupTarget nicht ?
    Er bringt immer die Meldung das er den parameter nicht kennt.
    Das Serverbetriebssystem ist SBS2011 Std.
    Danke für eure Hilfe.

    mfg
    Udo

  34. Komisch, der Parameter backupTarget ist aber 100%ig richtig:

    C:\Users\Hannes>wbadmin start backup
    wbadmin 1.0 – Sicherungs-Befehlszeilentool
    (C) Copyright 2004 Microsoft Corp.

    Syntax: WBADMIN START BACKUP
    [-backupTarget:{ | }]
    [-include:]
    [-allCritical]
    [-user:]
    [-password:]
    [-noInheritAcl]
    [-noVerify]
    [-vssFull | -vssCopy]
    [-quiet]

    Parameter:
    -backupTarget Gibt den Speicherort für die Sicherung an.
    […]

    Dann scheinst du ihn vielleicht falsch einzusetzen.
    Mach mal bitte ein Screenshot von dem Script und von der Ausführung, wenn der Fehler angezeigt wird, dann schauen wir mal.

    1. Hallo Udo,

      du nutzt auch einen ganz anderen Befehl als ich.
      Du nutzt:

      wbadmin enable backup

      Ich nutze:

      wbadmin start backup

      Die Befehle haben unterschiedliche Anwendungszwecke und unterschiedliche Parameter.

      wbadmin start backup

      startet sofort ein Backup.

      wbadmin enable backup

      erstellt neue Backup Pläne odert ändert sie.

      Ich nutze

      wbadmin start backup

      in einem Script, das ich wiederum in der Windows Aufgabenplanung einrichte, damit das Backup wiederholt ausgeführt wird. Aber das steht ja im Detail im Artikel.

      LG

  35. Hallo Hannes,
    Dein Artikel und die Kommentare haben mir sehr geholfen, vielen Dank.
    Mein Problem bezieht sich auf das inkrementelle Backup. Ich habe eine Batch erstellt, die mit dem Windows Server 2008 R2 einwandfrei funktioniert.

    „WBADMIN START BACKUP -backupTarget:\smb.hidrive.strato.comrootusersdrive-xxxx -include:c: -user:drive-xxxx -password:xxxxx -allCritical -vssFull -quiet“

    Das Backup wird auf eine Strato HiDrive Netzwerk Verbindung gesichert, funktioniert auch ganz gut.

    Was ich nicht verstehe ist, warum wird das Laufwerk C: vollständig gesichert, aber Laufwerk D: inkrementell?
    Eigentlich sollte auch C: nach einer Vollsicherung nur noch inkrementell gesichert werden, das geht aber wohl nicht mit wbadmin.
    Hast Du eine Idee wie es anders realisiert werden könnte?

    Das ganze soll als Desaster Recovery dienen, damit, falls die Hütte abbrennt, eine komplett wieder herstellbare Kopie unserer Server zur Verfügung steht.

    LG
    Markus

  36. Hi zusammen,

    ursprünglich habe ich vor langer Zeit auch mit dem Skript aus diesem Thread begonnen, die Windows-Serversicherung skriptgesteuert und über die Aufgabenplanung einzusetzen.

    Als kleines Dankeschön habe ich hier mal eine durch zusätzliche Codeschnipsel aus anderen Quellen weiterentwickelte, sehr komfortable Form dieses Skripts angehängt:

    Skript für WBADMIN unter Windows Server 2008 – 2012 (R2) zur Vollsicherung des lokalen Servers
    SERVER1 (SERVER1) in zwei Pfade WocheG / WocheU (je nach KW gerade oder ungerade), Wochentag (hier Montags) steuert dabei volle oder inkrementelle Sicherung.
    Mailversand mittels BLAT – Dieses Skript und den BLAT-Ordner dafür in das Verzeichnis C:SCRIPTING platzieren.
    Mailserver erlaubt hier für SERVER1 anonymes SENDEN
    Bei Vollsicherung erfolgt vorab eine Löschung aller Altsicherungen im Zielpfad.
    Der manuelle Aufruf einer Vollsicherung ist mit „FULL“ als Befehlszeilenparameter möglich.
    Die Mailfunktion kann mit „TESTMAIL“ als Befehlszeilenparameter getestet werden, ohne tatsächlich ein Backup auszuführen.

    @echo off &setlocal
    :: Skript für WBADMIN unter Windows Server 2008 - 2012 (R2) zur Vollsicherung des lokalen Servers
    :: SERVER1 (SERVER1) in zwei Pfade je nach KW gerade oder ungerade, Wochentag (hier Montags) steuert dabei volle oder inkrementelle Sicherung.
    :: Mailversand mittels BLAT - Dieses Skript und den BLAT-Ordner in das Verzeichnis C:SCRIPTING platzieren.
    :: Mailserver erlaubt hier für SERVER1 anonymes SENDEN
    :: Bei Vollsicherung vorab Löschung aller Altsicherungen im Zielpfad
    :: Manueller Aufruf einer Vollsicherung mit "FULL" als Befehlszeilenparameter
    :: Die Mailfunktion kann mit "TESTMAIL" als Befehlszeilenparameter getestet werden, ohne ein Backup auszuführen.
    :: BITTE IM FOLGENDEN SET-BLOCK DIE NOTWEDIGEN VARIABLEN FESTLEGEN, IM SKRIPT SIND i.d.R. KEINE ÄNDERUNGEN NÖTIG!!! 
     
    set backupserver=NAS.TESTDOMAIN.LOCAL
    set freigabe=backupsservers
    set quellserver=SERVER1
    set benutzer=BENUTZER
    set pwd=PASSWORT
    set eMail="systool.bkupserver1@testdomain.local"
    set mailTo=EMPFÄNGER@TESTDOMAIN.LOCAL
    set server=-server IP-ADRESSE
    set einschluss=c:,d:,e:
     
    rem ###   ANFANG   ### Parameter für Voll- od. Inkrementalsicherung nach Wochentag setzen oder übernehmen #######
     
    if %1!==! goto aftercond1 
    if %1==FULL goto setfull
    :aftercond1
     
    set DOW=
    for /f %%g in ('wmic path win32_localtime get dayofweek^|findstr /v /r "^$"') do (
    set DOW=%%g
    )
    if %DOW%==1 set DOW=Mo
    if %DOW%==2 set DOW=Di
    if %DOW%==3 set DOW=Mi
    if %DOW%==4 set DOW=Do
    if %DOW%==5 set DOW=Fr
    if %DOW%==6 set DOW=Sa
    if %DOW%==7 set DOW=So
    set WTName=%DOW%
     
    rem ###   WICHTIG   ### in nächster Zeile den gwünschten Wochentag für die Vollsicherung angeben #######
    if %WTName%==Mo (
      set VSSPar=-vssfull
    ) else (
      set VSSPar=
    )
    goto aftersetfull
     
    :setfull
    set VSSPar=-vssfull
     
    :aftersetfull
    rem ###    ENDE    ### Parameter für Voll- od. Inkrementalsicherung nach Wochentag setzen oder übernehmen #######
     
    rem ###   ANFANG   ### Zeitstempel für Benennung der Logdatei zusammensetzen #######
     
    set jahr=%date:~-4%
    set monat=%date:~-7,2%
    set tag=%date:~-10,2%
    set stunde=%TIME:~-11,2%
    set stunde=%stunde: =0%
    set minute=%TIME:~-8,2%
    set sekunde=%TIME:~-5,2%
    set datum=%jahr%%monat%%tag%
    set zeit=%stunde%%minute%%sekunde%
    set timest=%datum%%zeit%
     
    rem ###    ENDE    ### Zeitstempel für Benennung der Logdatei zusammensetzen #######
    set logfile=c:%computername%%timest%.txt
    rem ###   ANFANG   ### Gerade / Ungerade Woche nach ISO 8601 feststellen #######
     
    for /f "tokens=1-3 delims=." %%a in ("%date:* =%") do (set "dd=%%a" &set "mm=%%b" &set "yy=%%c")
    if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
    set /a dd=100%dd%%%100,mm=100%mm%%%100
    set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,Jd=153*m+2
    set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
    set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
    set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
    set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
    set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
    if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
    set /a diff=Jd-Jr,cw=diff/7+1,odd=cw%%2
    if %odd%==1 (
      set woche=WocheU
    ) else (
      set woche=WocheG
    )
     
    if %1!==! goto aftercond2
    if %1==TESTMAIL goto fehler
    :aftercond2
     
    rem ###    ENDE    ### Gerade / Ungerade Woche nach ISO 8601 feststellen #######
     
    for /f "skip=1 tokens=2 delims=[]" %%* in ('ping.exe -n 1 -4 %computername%') Do (set "IP=%%*")
    for /f "tokens=1,2,3,4 delims=." %%a in ("%IP%") do set IPb1=%%a&set IPb2=%%b&set IPb3=%%c&set IPb4=%%d
    echo ----------------- >> %logfile%
     
    rem ###    START    ### Nur vor Vollbackup alte Backups löschen #######
     
    if %VSSPar%!==! goto aftercond3
    if %VSSPar%==-vssfull (
      echo Backup löscht vorherige Backups: %DATE% um %TIME% Uhr > %logfile%
      echo. >> %logfile%
      wbadmin delete backup -backuptarget:"%backupserver%%freigabe%%woche%%quellserver%" -user:%benutzer% -password:%pwd% -keepversions:0 >> %logfile%
    ) else (
      echo Keine Löschung vorheriger Backups nötig > %logfile%
      echo. >> %logfile%
    )
    :aftercond3
     
    rem ###    ENDE     ### Nur vor Vollbackup alte Backups komplett löschen #######
     
    echo Backup-Start: %DATE% um %TIME% Uhr > %logfile%
    echo. >> %logfile%
    wbadmin start backup -backuptarget:"%backupserver%%freigabe%%woche%%quellserver%" -user:%benutzer% -password:%pwd% -include:%einschluss% %VSSPar% -allCritical -quiet >> %logfile%
    set backuperrorlevel=%errorlevel%
    if "%backuperrorlevel%"=="0" (goto erfolg) else (goto fehler)
     
    :erfolg
    echo. >> %logfile%
    echo ************************** %computername%: %date% - %time% >> %logfile%
    echo ************************** Errorlevel: %backuperrorlevel% >> %logfile%
    echo. >> %logfile%
    echo Backup-Ende:  %computername%: %date% - %time% >> %logfile%
    echo ************************** >> %logfile%
    setlocal
    set path=c:scriptingblat;%path%
    set filename=%~n0
    set attach=-attacht
    set appendLOG=%logfile% 2^>^&1
    set subj=-s "HINWEIS: %computername% Backup erfolgreich."
    set x=-x "X-Header-Test: Automatischer Hinweis..."
    set debug=-debug -log c:blat.log -timestamp 
    set BODY=-body "AUTOMATISCHER HINWEIS -BACKUP ERFOLGREICH-  %date% %time%. "
    blat  "%~1" -to %mailTo% -f %eMail% %subj% %server% %debug% %x% %BODY% %attach% %appendLOG%
    ping 127.0.0.1 -n 10
     
    goto end
     
    :fehler
     
    echo. >> %logfile%
    echo. >> %logfile%
    echo ############################## >> %logfile%
    echo ############################## >> %logfile%
    echo Ein Fehler ist aufgetreten!!  >> %logfile%
    echo Errorlevel: %backuperrorlevel% >> %logfile%
    echo ############################## >> %logfile%
    echo ############################## >> %logfile%
    echo. >> %logfile%
    echo Backup-Ende:  %computername%: %date% - %time% >> %logfile%
    echo ############################## >> %logfile%
    setlocal
    set path=c:scriptingblat;%path%
    set filename=%~n0
    set attach=-attacht
    set appendLOG=%logfile% 2^>^&1
    set subj=-s "ACHTUNG: %computername% Backup fehlgeschlagen."
    set x=-x "X-Header-Test: Automatischer Alarm..."
    set debug=-debug -log c:blat.log -timestamp 
    set BODY=-body "AUTOMATISCHER ALARM -BACKUP FEHLER-  %date% %time%. "
    blat  "%~1" -to %mailTo% -f %eMail% %subj% %server% %debug% %x% %BODY% %attach% %appendLOG%
    ping 127.0.0.1 -n 10
     
    goto end
     
    :end
    del /f /q %logfile%
     
    exit
    

    Leider wirft die Serversicherung manchmal einen Errorlevel von 9009 und man erhält die Benachrichtigung als Fehlermeldung, obwohl das Backup laut Logdatei erfolgreich war.

    Weiß jemand von Euch, was dahinter steckt?

    Schreibt mal Eure Meinungen zu der Weiterentwicklung.
    Viel Spaß und Erfolg damit.

    Matthias

  37. Hallo Matze,

    danke für Deine Hilfe.

    Dann scheint der das beim SBS zu ignorieren, denn dort habe ich das gleiche Script laufen und da macht er das inkrementell.

    So wie ich das verstanden habe, werden mit AllCritical auch alle
    Systemkritische Daten gesichert. Dazu hätte ich noch Fragen:
    Würden die dann nicht fehlen bei der Wiederherstellung des Systems?
    Was passiert wenn diese Datein z.B. vom WindowsUpdate verändert werden?
    Wenn ich jetzt das AllCritical herausnehme, wird er das bisherige Backup für weitere inkrementelle Sicherungen nutzen?
    Muss ich für ein BareMetal überhaupt die AllCritical Option verwenden?

    VG
    Markus

  38. Hallo Markus!

    Meine Antwort hat wohl mehr verwirrt als geholfen, da sie nicht korrekt war… Sorry dafür!

    -allCritical schreibt ein ‚Bare Matel Image‘ inklusive dem ‚Systeme State‘ fürs Desaster Recovery…
    Das Vollbackup hat was mit der Einschränkung zu tun, die Microsoft für die Netzwerk Freigabe angibt (bis 2008 R2 und Win 7)…

    „If you save a backup to a remote shared folder, that backup will be overwritten if you use the same folder to back up the same computer again.“
    Siehe: https://technet.microsoft.com/de-DE/library/cc742083.aspx

    C (System) wird vollständig gesichert, D nur Systemrelevantes

    Interessantes zum Thema und ner möglichen Versionierung findest Du auch hier…
    https://social.technet.microsoft.com/Forums/windowsserver/en-US/3aed5ebe-7ad8-4b03-a948-ef064237db08/incremental-and-full-backups-using-wbadmin-and-task-scheduler-in-server-2008-r2?forum=windowsbackup

    Also, erst richtig lesen, dann lange nachdenken und am Ende erst Posten! Ich versuch das zukünftig mal zu beherzigen (^_-)… Sorry noch mal für die gestiftete Verwirrung!

    PS @Hannes… kannst Du meinen vorigen Eintrag mal als falsch markieren oder gar entfernen? Danke!

  39. Hab es jetzt nochmal getestet. Auch ohne AllCritical wird ein vollständiges Backup durchgeführt und nicht inkrementell.
    Ich verstehe immer noch nicht, warum das auf dem SBS funktioniert, aber auf dem Server R2 Enterprise nicht.

    VG
    Markus

Schreibe einen Kommentar