Kopia zapasowa wybranych komputerów (stacji roboczych) domeny przy użyciu narzędzia Robocopy.

Wstęp

Zabezpieczanie danych w przedsiębiorstwie, które nie posiada profesjonalnych systemów kopii zapasowych jest zadaniem bardzo trudnym i wymagającym dużego nakładu pracy "traconego" przez osoby odpowiedzialne za wykonanie tego zadania. W celu ułatwienia wykonywania tego zadania polecam użycie skryptów powłoki i narzędzia Microsoft Robocopy. Oczywiście wykonywanie w ten sposób kopii wszystkich komputerów w przedsiębiorstwie wiązałoby się z pewnymi nakładami finansowymi, których zwykle małe przedsiębiorstwa unikają, jednak jeśli organizacja posiada pewne niewykorzystane zasoby, można znacznie ułatwić zadanie wykonywania kopii zapasowej. W artykule opisano jeden z wielu możliwych sposobów rozwiązania problemu kopii zapasowej w małym przedsiębiorstwie.

Założenia projektu

Plan działania

  1. wybranie serwera, który będzie pełnił rolę systemu do wykonywania kopii zapasowej (w moim przypadku Windows 2003 Server z narzędziem NTBACKUP i skonfigurowaną usługą zaplanowanych zadań)
  2. wybranie stacji roboczych, które powinny mieć wykonywaną kopię zapasową danych, zebranie informacji o lokalizacji cennych danych (najlepiej ustalić politykę odnoszącą się do umiejscowienia ważnych danych i na każdym komputerze tak skonfigurować aplikacje by korzystały danych zawartych w odpowiednich folderach)
  3. przygotowanie stacji roboczych do wspierania technologii Wake-On-Lan (większość aktualnie produkowanego sprzętu komputerowego wspiera tą technologię, w razie problemów należy sprawdzić czy sprzęt obsługuje WOL),
  4. przygotowanie skryptów wykonujących kopię zapasową,
  5. skonfigurowanie zaplanowanego zadania kopii zapasowej.

Konfiguracja BIOSU stacji roboczej obsługującej WOL

Aby możliwe było korzystanie z funkcjonalności WOL należy uaktywnić odpowiednie opcje w BIOSIE. Poniżej przykładowe ustawienia dla stacji roboczych różnych producentów

Dell OptiPlex 210L

Należy uaktywnić następujące opcje:
"On Bard devices" / "Integrated NIC" / "On w/PXE"
"Power Management" / "Remote Wake Up" / "ON"

Intel D865GLC

Należy uaktywnić następujące opcje:
"Power" / "Wake On PCI PME"
"Power" / "ACPI" / "Wake on LAN From S5"

Maxdata (ASUS P4S800-MX)

Należy uaktywnić następujące opcje:
"Power" / "APM Configurator" / "Power On By Internal MAC LAN"

Darmowe narzędzie "Wake On Lan Command Line"

Narzędzie należy pobrać ze strony producenta i skopiować na serwer http://www.depicus.com/wake-on-lan/wake-on-lan-cmd.aspx
Po skopiowaniu narządzie można przetestować jego działanie, przykład użycia:
wolcmd [mac address] [ipaddress] [subnet mask] [port number]
wolcmd xxxxxxxxxxxx 255.255.255.0 255.255.255.0 7
Na stronie http://www.depicus.com dostępne jest też narzędzie z GUI.

Konfiguracja zasad grupy w domenie

Aby możliwe było wykorzystanie zaproponowanego rozwiązania należy skonfigurować stacje robocze w domenie tak, aby serwer odpowiedzialny za wykonanie kopii zapasowych miał dostęp do odpowiednich zasobów stacji roboczych (udostępnione foldery lub dyski stacji roboczych).

Konfiguracja zapory sieciowej dla wybranego OU

W zasadach grupy należy utworzyć nową zasadę dotyczącą udostępniania plików i drukarek dla OU (jednostki organizacyjnej), w której znajdują się stacje robocze, dla których będzie wykonywana kopia zapasowa.

Rysunek 1 Nowa zasada grupy - udostępnianie plików

Rysunek 1 Nowa zasada grupy - udostępnianie plików

Następnie należy zdefiniować w tej zasadzie wyjątek zapory sieciowej, który będzie definiował dostęp poprzez udostępnione foldery tylko dla wybranych komputerów (serwerów wykonujących kopię zapasową). Wykonuje się to w opcji: "Konfiguracja komputera" / "Szablony administracyjne" / "Sieć" / "Połączenia sieciowe" / "Zapora systemu windows" / "Profil domenowy" / "Zapora systemu Windows Zezwalaj na wyjątek udostępniania plików i drukarek". Należy przypisać adresy IP komputerów, które mają mieć dostęp do udostępnionych folderów na komputerach w wybranym OU.

Rysunek 2 Udostępnione pliki dla komputerów o określonych adresach IP

Rysunek 2 Udostępnione pliki dla komputerów o określonych adresach IP

W związku z tym, że często w małych przedsiębiorstwach nie ma potrzeby udostępniania zasobów stacji roboczych dla innych użytkowników, polecam udostępnianie danych komputerów tylko dla wybranych stacji roboczych lub serwerów.

Przygotowanie folderów na kopię zapasową

Na serwerze, na którym będą przechowywane dane kopii zapasowej (i który będzie kopiował te dane na nośniki wymienne) należy utworzyć folder, który będzie zawierał podfoldery dla każdej kopiowanej stacji roboczej. Należy założyć tylko folder główny. Skrypt wykonujący kopię zapasową będzie sam automatycznie zakładał katalogi dla kopiowanych stacji roboczych. Przykładowo:

P:\Kopie_Zapasowe

Instalacja Robocopy

Robocopy można pobrać ze strony:
http://www.microsoft.com/technet/technetmag/issues/2006/11/UtilitySpotlight/
lub:
http://www.microsoft.com/downloads/details.aspx?FamilyID=9D467A69-57FF-4AE7-96EE-B18C4790CFFD&displaylang=en
jako część pakietu Windows Server 2003 Resource Kit Tools.
Instalacja narzędzia (narzędzi) nie sprawia problemów, kolejne ekrany kreatora opisują dokładnie proces instalacyjny. Nie ma potrzeby konfiguracji narzędzia robocopy. Konfiguracja odbywa się poprzez odpowiednie podanie parametrów przy uruchamianiu narzędzia. Na potrzeby opisywanego problemu wykonywania kopii zapasowej, narzędzie robocopy będzie używane jako część skryptu PowerShell (PS). Przykładowe polecenie uruchamiające narzędzie to:
robocopy "katalog_źródłowy" "miejsce_przeznaczania" /MIR /R:3 /W:5 /XD "folder wyłączony z kopiowania" /LOG:Log_kopiowania_danych

Skrypty i zaplanowane zadania

Komputery w przedsiębiorstwie wyłączając komputery używane przy produkcji (nie potrzebna kopia zapasowa) są każdej nocy wyłączane. Kopia zapasowa tych komputerów będzie wykonywana w czasie weekendów (nie ma potrzeby wykonywania kopii codziennie). Robocopy umożliwia wykonanie kopii różnicowej, dzięki czemu wykonanie następnych kopii będzie trwało krócej. Po wykonaniu kopii komputerów należy wykonać kopię zapasową danych na nośniku wymiennym. Schemat działania skryptu:

Rysunek 3 Schemat działania skryptu wykonującego kopię zapasową.

Rysunek 3 Schemat działania skryptu wykonującego kopię zapasową.

Skrypt PS

Poniżej zamieściłem skrypt PS, którym wykonuje zadanie kopii zapasowej. Skrypt ten jest uruchamiany prze plik robocopy.cmd, który został zaplanowany do uruchamiania poprzez "Zaplanowane Zadania" na serwerze odpowiedzialnym za kopię zapasową.
Pliki logów tworzone przez narzędzie robocopy są zapisywane w folderze c:\backup\log\ (uwaga folder do przechowywania plików log należy utworzyć przed uruchomieniem skryptu).

Skrypt PS (wykonywanie kopii zapasowej jednej stacji roboczej)

#Stałe skryptu
$rcInf='Information'
$rcWrn='Warning'
$rcErr='Error'

#Pobierz argumenty

$cmpName = $Args[0]
$cmpMAC = $Args[1]
$cmpProfilePartition = $Args[2]
$cmpDataPartition = $Args[3]
$cmpUser = $Args[4]
$cmpExcludeDir = $Args[5]

#Test Parametrów
if ( ($cmpName -eq $() ) -or ($cmpMAC -eq $()) -or ($cmpProfilePartition -eq $() ) -or ($cmpDataPartition -eq $())-or ($cmpUser -eq $()))
{
Write-Host "Nie podano wszystkich parametrów. Użycie skryptu:"
Write-Host "robocopy.ps1 cmpName cmpMac cmpProfilePartition cmpDataPartition cmpUser cmpExcludeDir"
} else {

#Wykonanie skryptu

#Przygotowanie dostępu do dziennika zdarzen systemu, błędy będą zapisywane w dzienniku PS_BackupComputers
if(![System.Diagnostics.EventLog]::SourceExists('PS_BackupComputers'))
{
[System.Diagnostics.EventLog]::CreateEventSource('PS_BackupComputers','PS_BackupComputers')
}
if(![System.Diagnostics.EventLog]::SourceExists($cmpName))
{
[System.Diagnostics.EventLog]::CreateEventSource($cmpName,'PS_BackupComputers')
}

$rcLog = New-Object System.Diagnostics.EventLog
$rcLog.set_log('PS_BackupComputers')
$rcLog.set_source($cmpName)
$rcLog.WriteEntry('Uruchamianie kopii stacji roboczej:'+$cmpName,$rcInf,0)

#Dane komputera

$cmpPartProfile = '\\'+$cmpName+'\'+$cmpProfilePartition+'$\Documents and Settings\'+$cmpUser
$cmpPartData = '\\'+$cmpName+'\'+$cmpDataPartition+'$'

#Sprawdzenie czy komputer jest uruchomiony
$testhost = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$cmpName'"
$statushost = $testhost.StatusCode

if ( $statushost -eq 0 ) {
#Jeśli działa wymuszenie restartu - upewnienie się, że wszytskie otwarte pliki zostaną zamknięte

$comp = gwmi win32_operatingsystem -computer $cmpName
$rst = $comp.Win32Shutdown(6)

#oczekiwanie na wyłączenie komputera
$cnt = 0
while (1)
{
$testhost = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$cmpName'"
$statushost = $testhost.StatusCode

if ($statushost -ne 0)
{
break;
}
$cnt = $cnt + 1
Write-Host Czekam-na-wyłaczenie-komputera - próba: $cnt
Start-Sleep –s 10

#Jesli komputer nie wylaczy sie w ciagu 5 minut przerywa wykonanie skryptu
if ( $cnt -gt 30 ) {
#Zapis informacji o błedzie do logu
$rcLog.WriteEntry('Komputer nie wyłączył się w przewidywanym czasie, kopia zapasowa nie została wykonana',$rcERR,1001)
exit
}
}
} else {
#urochomienie komputera WOL
c:\backup\wolcmd.exe $cmpMAC 255.255.255.0 255.255.255.0 7
}

#uruchomienie komputera
$cnt = 0
while (1)
{
$testhost = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$cmpName'"
$statushost = $testhost.StatusCode

if ($statushost -eq 0)
{
break
}
Start-Sleep –s 10
$cnt = $cnt + 1

Write-Host Czekam-na-właczenie-komputera - próba: $cnt

#Jesli komputer nie wlaczy sie w ciagu 5 minut przerywa wykonanie skryptu
if ( $cnt -gt 30 ) {
#Zapis informacji o błedzie do logu
$rcLog.WriteEntry('Komputer nie włączył się w przewidywanym czasie, kopia zapasowa nie została wykonana',$rcERR,1002)
exit
}
}

Write-Host Komputer-wlaczony

#utworzenie katalogów jesli nie byly utworzone wczesniej
$tstdir="o:\kopie_zapasowe\"+$cmpName
$dirinfo = new-object System.Io.DirectoryInfo $tstdir
if (! $dirinfo.exists ) { $dirinfo.create() }

$tstdir="o:\kopie_zapasowe\"+$cmpName+"\profile"
$dirinfo = new-object System.Io.DirectoryInfo $tstdir
if (! $dirinfo.exists ) { $dirinfo.create() }

$tstdir="o:\kopie_zapasowe\"+$cmpName+"\data"
$dirinfo = new-object System.Io.DirectoryInfo $tstdir
if (! $dirinfo.exists ) { $dirinfo.create() }

#wykonanie synchronizacji plików przy użyciu robocopy

$sync1 = '"\\'+$cmpName+'\'+$cmpProfilePartition+'$\Documents and Settings\'+$cmpUser+'" "O:\Kopie_zapasowe\'+$cmpName+'\profile" /MIR /R:3 /W:5 /XA:ST /XD "System Volume Information" "Temporary Internet Files" "RECYCLER" "TEMP" /LOG:C:\backup\log\'+$cmpName+'_1.txt'
robocopy.exe $sync1

if ($cmpExcludeDir -eq $() )
{
$sync2 = '"\\'+$cmpName+'\'+$cmpDataPartition+'$" "O:\Kopie_zapasowe\'+$cmpName+'\data" /MIR /R:3 /W:5 /XA:ST /XD "System Volume Information" "RECYCLER" "TEMP" /LOG:C:\backup\log\'+$cmpName+'_2.txt'
} else
{
$sync2 = '"\\'+$cmpName+'\'+$cmpDataPartition+'$" "O:\Kopie_zapasowe\'+$cmpName+'\data" /MIR /R:3 /W:5 /XA:ST /XD "System Volume Information" "RECYCLER" "TEMP" "'+$cmpExcludeDir+'" /LOG:C:\backup\log\'+$cmpName+'_2.txt'
}

robocopy.exe $sync2

#Zapis informacji do logu
$rcLog.WriteEntry('Kopia została wykonana. Dokładne informacje znajdują się w plikach C:\backup\Log\'+$cmpName+'_1.txt i c:\backup\log\'+$cmpName+'_2.txt',$rcInf,0)

#Wyłączenie komputera
$comp = gwmi win32_operatingsystem -computer $cmpName
$rst = $comp.Win32Shutdown(5)
}

Skrypt CMD do zaplanowanych zadań - kopia wybranych stacji roboczych

powershell.exe c:\backup\robocopy.ps1 OPER-167 xx-xx-xx-xx-xx-xx C E testuser
powershell.exe c:\backup\robocopy.ps1 OPER-100 xx-xx-xx-xx-xx-xx C D testuser2

Podsumowanie

Artykuł przedstawia jedną z wielu możliwości wykonania kopii wybranych komputerów w przedsiębiorstwie. Przy wykorzystaniu narzędzi Robocopy i PowerShell można wykonać dużo bardziej zaawansowane zadania, jednak ze względu na brak czasu w artykule przestawiłem tylko przykład możliwości wyżej wymienionych narzędzi. W przyszłości zamierzam poprawić skrypt tak by wymagał tylko podania nazwy komputera a cała reszta operacji zostanie wykonana automatycznie.
Jeśli mają Państwo pytania lub uwagi proszę o maila lub komentarz do artykułu.