Wiederherstellen von Windows Azure Pack: Websites

 

Gilt für: Windows Azure Pack

Es wird empfohlen, dass Sie eine Wiederherstellung auf Servern durchführen, die dieselben Namen und Administratorkonten wie während der Sicherung tragen. Damit die Wiederherstellung erfolgreich sein kann, muss der Dateiserver und SQL Server im Hinblick auf Konfiguration, Benutzer und Berechtigungen identisch wie während der Sicherung sein. Wenn Sie den Websitedienst wiederherstellen, verwenden Sie die folgende Reihenfolge:

1. Wiederherstellen SQL Server Datenbanken

2. Wiederherstellen des Dateiservers

3. Wiederherstellen des Websitecontrollers

4. Führen Sie eine Reparatur auf allen Rollen aus.

Sie können Skripts verwenden, um die Wiederherstellungsvorgänge auszuführen. Die Schritte sind nachfolgend detailliert beschrieben.

1. Wiederherstellen SQL Server Datenbanken

Stellen Sie SQL-Server-Hosting, Ressourcenmessung und Masterdatenbanken wieder her. Der SQL Server muss den gleichen Namen haben wie bei der Sicherung.

Beispielwiederherstellungsskript für SQL

Das folgende Beispielskript wird nur zu Illustrationszwecken bereitgestellt und wird nicht unterstützt. Das Skript, das Sie erstellen, muss mit Administratorrechten ausgeführt werden.

Hinweis

Dieses Skript wird nicht von Microsoft unterstützt.

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. Wiederherstellen des Dateiservers

Der Dateiserver muss denselben Namen haben, den er hatte, als er gesichert wurde. Sie sollten die Dateiserverkomponenten in der folgenden Reihenfolge wiederherstellen:

  1. Stellen Sie die Zertifikatfreigabe wieder her

  2. Stellen Sie die Websitefreigabe wieder her

  3. Wenden Sie ACLs ggf. erneut an

  4. Wenden Sie FSRM-Kontingente auf der Websitefreigabe erneut an

Zwei Beispielskripts werden bereitgestellt: eins für Schritte a bis c oben, und eins, um die FSRM-Kontingente auf der Websitefreigabe erneut anzuwenden.

Beispielwiederherstellungsskript für Dateiserver

Das folgende Beispielskript enthält Schritte a bis c oben (es werden nicht die FSRM-Kontingente wiederhergestellt). Das Skript wird nur zu Illustrationszwecken bereitgestellt und wird nicht unterstützt. Das Skript, das Sie erstellen, muss mit Administratorrechten ausgeführt werden.

Hinweis

Dieses Skript wird nicht von Microsoft unterstützt.

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

Beispielskript, um die FSRM-Kontingente wiederherzustellen

Das folgende Beispielskript stellt die FSRM-Kontingente wieder her. Das Skript wird nur zu Illustrationszwecken bereitgestellt und wird nicht unterstützt. Das Skript, das Sie erstellen, muss mit Administratorrechten ausgeführt werden.

Hinweis

Dieses Skript wird nicht von Microsoft unterstützt.

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. Wiederherstellen des Websitecontrollers

Um den Websitecontroller wiederherzustellen, können Sie das Restore.ps1-PowerShell-Skript verwenden, das in diesem Abschnitt dargestellt wird.

Kopieren Sie das Skript Restore.ps1 auf den Websitecontroller, und führen Sie dann den folgenden Befehl mit Administratorrechten aus:

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

Hinweis

Das $encryptionKey-Flag wird nur benötigt, wenn Sie es während der Sicherung verwendet haben.

Das Skript Restore.ps1 folgt.

##  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

Wiederherstellen zu Nicht-Dateiservern mit unterschiedlichen Namen oder Administratorkonten

Wenn Sie einen Server (der kein Dateiserver oder SQL Server ist), auf einem Server oder Servern mit Servernamen oder Administratorkonten wiederherstellen müssen, die sich von der Vorlage unterscheiden, müssen Sie Folgendes tun:

  1. Importieren des Websitemoduls

  2. Aktualisieren Sie die Anmeldeinformationen.

  3. Entfernen der alten Servernamen aus der Farm

  4. Hinzufügen der neuen Server zu den richtigen Farmen

  1. Bevor Sie einen der anderen Befehle ausführen, importieren Sie zunächst das Websitemodul:

    Import-Module WebSites
    

    Führen Sie nun die Befehle 2-4 auf dem Controller als Administrator aus.

  2. Wenn die Anmeldeinformationen für die Rolle< RoleType> geändert wurden, führen Sie die folgenden Schritte für jede geänderte Anmeldeinformationen aus:

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

    Hinweis

    Mögliche Werte für <RoleType> im befehl Set-WebSitesConfig sind: ManagementServer, FileServer, FrontEnd, Publisher und Worker.

  3. Führen Sie für jeden alten Servernamen <OldName> , der nicht mehr verwendet wird, folgendes aus:

    Remove-WebSitesServer -Name <OldName>
    
  4. Führen Sie für jeden neuen Servernamen <NewName> of roleType<> folgendes aus:

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

    Hinweis

    Mögliche Werte für <RoleType> im New-WebSitesServer Befehl sind: ManagementServer, FileServer, LoadBalancer, Publisher und WebWorker.

Beispiel

Wenn Sie eine ältere Web-Worker-Rolle namens "OldWorker" und eine neue Web-Worker-Rolle "NewWorker" hatten, und die WebWorker-Anmeldeinformationen auf "WebWorkerAdmin" aktualisiert haben, würden Sie Folgendes ausführen:

Import-Module WebSites

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

Remove-WebSitesServer -Name OldWorker

New-WebSitesServer -Name NewWorker -ServerType WebWorker

4. Führen Sie eine Reparatur auf allen Rollen aus.

Nachdem Sie die Wiederherstellung abgeschlossen haben, können Sie eine Reparatur für alle Rollen ausführen und diese überprüfen, um sicherzustellen, dass sie fehlerfrei wieder da sind.

Weitere Informationen

Sichern von Windows Azure Pack: Websites
Bereitstellen von Windows Azure Pack: Websites