Udostępnij za pośrednictwem


Przywracanie Windows Azure Pack: witryny sieci Web

 

Dotyczy: Windows Azure Pack

Zdecydowanie zaleca się przywrócenie do serwerów, które mają takie same nazwy i konta administracyjne, jak podczas tworzenia kopii zapasowej. Aby przywracanie zakończyło się pomyślnie, serwer plików i SQL Server muszą być dokładnie takie same w zakresie konfiguracji, użytkowników i uprawnień, jak podczas tworzenia kopii zapasowej. Podczas przywracania usługi witryny sieci Web użyj następującej kolejności:

1. Przywracanie SQL Server baz danych

2. Przywracanie serwera plików

3. Przywracanie kontrolera witryn sieci Web

4. Uruchamianie naprawy we wszystkich rolach

Skrypty umożliwiają wykonywanie operacji przywracania. Kroki zostały szczegółowo opisane poniżej.

1. Przywracanie SQL Server baz danych

Przywróć SQL serwer hostingu, pomiary zasobów i główne bazy danych. Serwer SQL musi mieć taką samą nazwę jak podczas tworzenia kopii zapasowej.

Przykładowy skrypt przywracania SQL

Poniższy przykładowy skrypt jest udostępniany tylko do celów ilustracyjnych i nie jest obsługiwany. Utworzony skrypt musi być uruchamiany z uprawnieniami administracyjnymi.

Uwaga

Ten skrypt nie jest obsługiwany przez firmę Microsoft.

param ([string] $backupUser = "Administrator", $backupPassword, $sqlServer, $sqlUser = "sa", $sqlPassword, $backupLocation = "\\backupMachine\c$\backup" )
net use $backupLocation /user:$backupUser $backupPassword
xcopy /Y /q \\$backupMachine\c$\$backupLocation\Hosting.bak C:\HostingOfflineFeed\
xcopy /Y /q \\$backupMachine\c$\$backupLocation\ResourceMetering.bak C:\HostingOfflineFeed\
xcopy /Y /q $backupLocation\master.bak C:\HostingOfflineFeed\
net start "SQL Server (MSSQLSERVER)" /f
sqlcmd -S $sqlServer -U $sqlUser -P $sqlPassword -Q "RESTORE DATABASE [master] FROM DISK='C:\HostingOfflineFeed\master.bak' WITH REPLACE"
net stop "SQL Server (MSSQLSERVER)"
net start "SQL Server (MSSQLSERVER)"
sqlcmd -S $sqlServer -U $sqlUser -P $sqlPassword -Q "RESTORE DATABASE [Hosting] FROM DISK='C:\HostingOfflineFeed\Hosting.bak' WITH REPLACE"
sqlcmd -S $sqlServer -U $sqlUser -P $sqlPassword -Q "RESTORE DATABASE [ResourceMetering] FROM DISK='C:\HostingOfflineFeed\ResourceMetering.bak' WITH REPLACE"
del C:\HostingOfflineFeed\Hosting.bak
del C:\HostingOfflineFeed\ResourceMetering.bak
del C:\HostingOfflineFeed\master.bak

2. Przywracanie serwera plików

Serwer plików musi mieć taką samą nazwę, jaką miał podczas tworzenia kopii zapasowej. Należy przywrócić składniki serwera plików w następującej kolejności:

  1. Przywracanie udziału certyfikatów

  2. Przywracanie udziału witryn sieci Web

  3. W razie potrzeby ponownie zastosuj listy ACL

  4. Ponownie zastosuj limity przydziału fsRM w udziale witryn sieci Web

Podano dwa przykładowe skrypty: jeden dla kroków opisanych powyżej przez c i jeden, aby ponownie zastosować przydziały fsRM w udziale webSites.

Przykładowy skrypt przywracania serwera plików

Poniższy przykładowy skrypt zawiera kroki a-c powyżej (nie przywraca przydziałów fsRM). Skrypt jest udostępniany tylko do celów ilustracyjnych i nie jest obsługiwany. Utworzony skrypt musi być uruchamiany z uprawnieniami administracyjnymi.

Uwaga

Ten skrypt nie jest obsługiwany przez firmę Microsoft.

param ([string] $backupUser = "Administrator", $backupPassword, $certificateFolder = "C:\Certificates", $websiteFolder = "C:\websites", $backupLocation = "\\backupMachine\c$\backup" )
net use $backupLocation /user:$backupUser $backupPassword
mkdir $certificateFolder
mkdir $websiteFolder
xcopy /Y /q /E $backupLocation\ $certificateFolder
xcopy /Y /q /E $backupLocation\ $websiteFolder

Przykładowy skrypt umożliwiający przywrócenie przydziałów fsRM

Poniższy przykładowy skrypt przywraca przydziały fsRM. Skrypt jest udostępniany tylko do celów ilustracyjnych i nie jest obsługiwany. Utworzony skrypt musi być uruchamiany z uprawnieniami administracyjnymi.

Uwaga

Ten skrypt nie jest obsługiwany przez firmę Microsoft.

param ([string] $backupUser = "Administrator", $backupPassword, $backupLocation = "\\backupMachine\c$\backup" )
net use $backupLocation /user:$backupUser $backupPassword
xcopy /Y /q $backupLocation\templates.xml C:\templates.xml
dirquota template import /File:C:\templates.xml
net stop srmReports
net stop srmSvc
net stop quota
net stop Datascrn
robocopy $backupLocation\SRM "C:\System Volume Information\SRM" /E /ZB /R:3 /W:5
net start Datascrn
net start quota
net start srmSvc
net start srmReports

3. Przywracanie kontrolera witryn sieci Web

Aby przywrócić kontroler witryn sieci Web, możesz użyć skryptu programu PowerShellRestore.ps1przedstawionego w tej sekcji.

Skopiuj skrypt Restore.ps1 do kontrolera witryn sieci Web, a następnie uruchom następujące polecenie z uprawnieniami administratora:

net use /Y $backupLocation /user:$backupMachineAdmin $backupMachinePassword
.\Restore.ps1 $backupLocation $encryptionKey

Uwaga

Flaga $encryptionKey jest wymagana tylko wtedy, gdy była używana podczas tworzenia kopii zapasowej.

Poniższy skrypt Restore.ps1.

##  Re-install and restore the controller from a backup

param ($backupPath,$password)

function ShowHelp
{
    Write-Host '===================== RESTORE.PS1 HELP ====================='
    Write-Host 'This is a script that restores based on a backup from the Hosting VSS writer'
    Write-Host 'Invoke it using .\Restore.ps1'
    Write-Host 'It can also be invoked as follows:'
    Write-Host '.\Restore.ps1 <backup path (e.g. \\backupmachine\C$\backuplocation)> <password for keys file>' 
    Write-Host ("Note: before running this script you may need to run:`r`n" + ' "net use /Y <backup path> /user:<username> <password>"')
    Write-Host '============================================================'
}

function CreateFeedWebAppIfNeeded ([string] $localFeedLocation)
{
    import-module WebAdministration
    $app = Get-WebApplication -Name HostingOfflineFeed 
    if ($app -eq $null) 
    {
        New-WebApplication -Name HostingOfflineFeed -Site 'Default Web Site' -PhysicalPath $localFeedLocation -ApplicationPool DefaultAppPool -Force
    }
    # Add mime types needed for downloading .msp files for offline installations
    $msp = Get-WebConfiguration //staticContent/* | where {$_.fileExtension -eq '.msp'}
    if ($msp -eq $null) 
    {
        Add-WebConfiguration //staticContent -Value @{fileExtension=".msp";mimeType="application/octet-stream"}
    }

    # Add mime types needed for downloading .msu files for offline installations
    $msu = Get-WebConfiguration //staticContent/* | where {$_.fileExtension -eq '.msu'}
    if ($msu -eq $null) 
    {
        Add-WebConfiguration //staticContent -Value @{fileExtension=".msu";mimeType="application/octet-stream"}
    }
}

function InstallController ([string]$offlineFeedUrl, [string]$customFeed) 
{
    $WebPiCmd = ([System.Environment]::ExpandEnvironmentVariables("%ProgramW6432%\Microsoft\Web Platform Installer\WebpiCmd.exe"))    
    if (!(Test-Path $WebPiCmd))
    {
        $WebPiCmd = Join-Path -Path $localFeedLocation -ChildPath "bin\WebpiCmd.exe"
    }
    Invoke-Command -ScriptBlock { & $WebPiCmd /Install /Products:HostingController /AcceptEula /XML:$offlineFeedUrl /SuppressReboot /Log:HostingController.log }

    if ($lastexitcode -ne $null -And $lastexitcode -ne 0) 
    {
        Write-Host "ERROR: There was a problem installing using WebPI!"
        exit $lastexitcode
    }
}

function DecodeBase64($string)
{
    return [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($string))
}

function DecryptString($EncryptedFile, $Passphrase, $salt, $init) 
{ 
    $encryptedStrings = (Get-Content $EncryptedFile)
    $ret = @()
    foreach ($Encrypted in $encryptedStrings)
    {
        # If the value in the Encrypted is a string, convert it to Base64 
        if($Encrypted -is [string])
        { 
            $Encrypted = [Convert]::FromBase64String($Encrypted) 
        } 
        # Create a COM Object for RijndaelManaged Cryptography 
        $r = new-Object System.Security.Cryptography.RijndaelManaged 
        # Convert the Passphrase to UTF8 Bytes 
        $pass = [Text.Encoding]::UTF8.GetBytes($Passphrase) 
        # Convert the Salt to UTF Bytes 
        $salt = [Text.Encoding]::UTF8.GetBytes($salt) 
        # Create the Encryption Key using the passphrase, salt and SHA1 algorithm at 256 bits 
        $r.Key = (new-Object Security.Cryptography.PasswordDeriveBytes $pass, $salt, "SHA1", 5).GetBytes(32) #256/8 
        # Create the Intersecting Vector Cryptology Hash with the init 
        $r.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($init) )[0..15]
        # Create a new Decryptor 
        $d = $r.CreateDecryptor() 
        # Create a New memory stream with the encrypted value. 
        $ms = new-Object IO.MemoryStream @(,$Encrypted)
        # Read the new memory stream and read it in the cryptology stream 
        $cs = new-Object Security.Cryptography.CryptoStream $ms,$d,"Read" 
        # Read the new decrypted stream 
        $sr = new-Object IO.StreamReader $cs 
        # Return from the function the stream 
        $ret += $sr.ReadToEnd()
        # Stops the stream
        $sr.Close() 
        # Stops the crypology stream 
        $cs.Close() 
        # Stops the memory stream 
        $ms.Close() 
        # Clears the RijndaelManaged Cryptology IV and Key 
        $r.Clear() 
    }
    return $ret
}

if ($backupPath -and $backupPath.Contains('/?'))
{ 
    ShowHelp
    return
}

Write-Host 'Starting the hosting restore process. Run with /? to see help.'
Write-Host ("Note: before running this script you may need to run:`r`n" + ' "net use /Y <backupPath> /user:<username> <password>"')
# argument parsing
if (!$backupPath)
{
    $backupPath = Read-Host "Please enter the name of the backup path (e.g. \\backupmachine\C$\backuplocation)"
}
if (!$password)
{
    $password = Read-Host "Please enter the password of the keys file" -AsSecureString
    $password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
}

$systemDrive = [System.Environment]::ExpandEnvironmentVariables('%systemdrive%\')
# Fetch restore data from remote machine
$localFeedLocation = ($systemDrive +'HostingOfflineFeed\')
$c = 0
do
{ 
    $c++
    "D" | xcopy /q /Y (Join-Path -Path $backupPath -ChildPath "HostingOfflineFeed") "$localFeedLocation" /E
} while ($c -lt 10 -and !$?)
# Install the IIS cmdlets
$dismLocation = Join-Path -Path $systemDrive -ChildPath 'Windows\System32\dism.exe'
& $dismLocation /online /enable-feature /featurename:IIS-ManagementScriptingTools /all
CreateFeedWebAppIfNeeded $localFeedLocation

Stop-Service ResourceMetering -ErrorAction SilentlyContinue
# install webpi
$wpi = (dir ($systemDrive + 'hostingofflinefeed\installers\HostingWebPlatformInstaller') -r -i 'wpi.msi').DirectoryName
if ($wpi.Count -gt 1)
{
    $wpi = $wpi[0]
}
$wpi = Join-Path -Path $wpi -ChildPath "wpi.msi"
msiexec /quiet /i $wpi
$offlineFeedUrl = 'https://localhost/HostingOfflineFeed/feeds/latest/WebSites0.9.0.xml'
InstallController $offlineFeedUrl
$keys = DecryptString (Join-Path -Path $backupPath -ChildPath 'encryptedkeys.txt') $password 'salt12345' 'init12345'
Stop-Service WebFarmService -ErrorAction SilentlyContinue
Add-PSSnapIn WebHostingSnapIn
# Restore the keys
# Keys are Base64 encoded
Set-ControllerConnectionString -ConnectionString (DecodeBase64($keys[0])) 3>$null
# Set-MeteringConnectionString -MeteringConnectionString (DecodeBase64($keys[1])) -ServerName (HostName)
Set-SymmetricKey -SymmetricKeyName SystemCore -SymmetricKey (DecodeBase64($keys[1])) 3>$null
Set-SymmetricKey -SymmetricKeyName SiteRuntime -SymmetricKey (DecodeBase64($keys[2])) 3>$null
Set-MeteringConnectionString -MeteringConnectionString ([Microsoft.Web.Hosting.SiteManager]::GetMeteringConnectionString()) -ServerName (HostName) 3>$null

Start-Service WebFarmService -ErrorAction SilentlyContinue

Przywracanie do serwerów innych niż pliki o różnych nazwach lub kontach administracyjnych

Jeśli musisz przywrócić serwer (który nie jest serwerem plików lub SQL Server) na serwerze lub serwerach z nazwami serwerów lub kontami administracyjnymi, które różnią się od tych oryginalnych, musisz:

  1. Importowanie modułu WebSites

  2. Zaktualizuj poświadczenia.

  3. Usuwanie starych nazw serwerów z farmy

  4. Dodawanie nowych serwerów do odpowiednich farm

  1. Najpierw przed uruchomieniem dowolnego z innych poleceń zaimportuj moduł WebSites:

    Import-Module WebSites
    

    Teraz uruchom polecenia 2-4 na kontrolerze jako administrator.

  2. Jeśli poświadczenia roli <RoleType> uległy zmianie, uruchom następujące polecenie dla każdego zmienionego poświadczenia:

    Set-WebSitesConfig Credential -CredentialName <RoleType> Credential -UserName <RoleAdminUser> -Password <RoleAdminPassword>
    

    Uwaga

    Możliwe wartości parametru <RoleType> w poleceniu Set-WebSitesConfig to: ManagementServer, FileServer, FrontEnd, Publisher i Worker.

  3. Dla każdej starej nazwy <serwera OldName> , która nie jest już używana, uruchom polecenie:

    Remove-WebSitesServer -Name <OldName>
    
  4. Dla każdej nowej nazwy <serwera NewName> roli <RoleType> uruchom następujące polecenie:

    New-WebSitesServer -Name <NewName> -ServerType <RoleType>
    

    Uwaga

    Możliwe wartości parametru <RoleType> w poleceniu New-WebSitesServer to: ManagementServer, FileServer, LoadBalancer, Publisher i WebWorker.

Przykład

Jeśli masz starą rolę internetowego procesu roboczego o nazwie "OldWorker" i nową rolę procesu roboczego sieci Web o nazwie "NewWorker", a poświadczenia składnika WebWorker zostały zaktualizowane do elementu "WebWorkerAdmin", uruchomisz następujące polecenie:

Import-Module WebSites

Set-WebSitesConfig Credential -CredentialName WorkerCredential -UserName WebWorkerAdmin -Password $WebWorkerPassword

Remove-WebSitesServer -Name OldWorker

New-WebSitesServer -Name NewWorker -ServerType WebWorker

4. Uruchamianie naprawy we wszystkich rolach

Po zakończeniu przywracania uruchom naprawę dla wszystkich ról i monitoruj je, aby sprawdzić, czy są one w dobrej kondycji.

Zobacz też

Tworzenie kopii zapasowej Windows azure Pack: witryny sieci Web
Wdrażanie Windows Azure Pack: witryny sieci Web