Windows Azure Pack herstellen: websites

 

Van toepassing op: Windows Azure Pack

Het wordt ten zeerste aanbevolen om te herstellen naar servers met dezelfde namen en beheerdersaccounts als tijdens de back-up. Voor een geslaagde herstelbewerking moeten de bestandsserver en SQL Server exact hetzelfde zijn in termen van configuratie, gebruikers en machtigingen als tijdens de back-up. Gebruik de volgende volgorde bij het herstellen van uw websiteservice:

1. SQL Server databases herstellen

2. De bestandsserver herstellen

3. De controller voor websites herstellen

4. Voer een reparatie uit op alle rollen

U kunt scripts gebruiken om de herstelbewerkingen uit te voeren. De stappen worden hieronder uitgebreid beschreven.

1. SQL Server databases herstellen

Herstel de SQL-serverhosting, resourcemeter en hoofddatabases. De SQL-server moet dezelfde naam hebben als toen er een back-up van werd gemaakt.

Voorbeeldscript voor SQL herstellen

Het volgende voorbeeldscript is alleen bedoeld ter illustratie en wordt niet ondersteund. Het script dat u maakt, moet worden uitgevoerd met beheerdersbevoegdheden.

Notitie

Dit script wordt niet ondersteund door 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. De bestandsserver herstellen

De bestandsserver moet dezelfde naam hebben als toen er een back-up van werd gemaakt. U moet de bestandsserveronderdelen in de volgende volgorde herstellen:

  1. De certificaatshare herstellen

  2. De websitesshare herstellen

  3. ACL's indien nodig opnieuw gebruiken

  4. FSRM-quota opnieuw gebruiken op de share WebSites

Er zijn twee voorbeeldscripts beschikbaar: één voor stappen tot en met c hierboven en één om de FSRM-quota opnieuw toe te passen op de websitesshare.

Voorbeeldscript voor bestandsserverherstel

Het volgende voorbeeldscript bevat stappen a-c hierboven (hiermee worden de FSRM-quota niet hersteld). Het script wordt alleen ter illustratie verstrekt en wordt niet ondersteund. Het script dat u maakt, moet worden uitgevoerd met beheerdersbevoegdheden.

Notitie

Dit script wordt niet ondersteund door 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

Voorbeeldscript voor het herstellen van FSRM-quota

Met het volgende voorbeeldscript worden de FSRM-quota hersteld. Het script wordt alleen ter illustratie verstrekt en wordt niet ondersteund. Het script dat u maakt, moet worden uitgevoerd met beheerdersbevoegdheden.

Notitie

Dit script wordt niet ondersteund door 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. De controller voor websites herstellen

Als u de controller voor websites wilt herstellen, kunt u het Restore.ps1 PowerShell-script gebruiken dat in deze sectie wordt weergegeven.

Kopieer het Restore.ps1-script naar de controller voor websites en voer vervolgens de volgende opdracht uit met beheerdersbevoegdheden:

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

Notitie

De $encryptionKey vlag is alleen nodig als u deze tijdens de back-up hebt gebruikt.

Het Restore.ps1 script volgt.

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

Herstellen naar niet-bestandsservers met verschillende namen of beheerdersaccounts

Als u een server (dat geen Filer-server of SQL Server) moet herstellen naar een server of servers met servernamen of beheerdersaccounts die afwijken van die van het origineel, moet u het volgende doen:

  1. De module Websites importeren

  2. Werk de referenties bij.

  3. De oude servernamen uit de farm verwijderen

  4. De nieuwe servers toevoegen aan de juiste farms

  1. Importeer eerst de module WebSites voordat u een van de andere opdrachten uitvoert:

    Import-Module WebSites
    

    Voer nu de opdrachten 2-4 uit op de controller als beheerder.

  2. Als de referenties voor het roleType<> zijn gewijzigd, voert u het volgende uit voor elke gewijzigde referentie:

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

    Notitie

    Mogelijke waarden voor <RoleType> in de opdracht Set-WebSitesConfig zijn: ManagementServer, FileServer, FrontEnd, Publisher en Worker.

  3. Voer voor elke oude servernaam <OldName> uit die niet meer wordt gebruikt:

    Remove-WebSitesServer -Name <OldName>
    
  4. Voer voor elke nieuwe servernaam <NewName> of role< RoleType> dit uit:

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

    Notitie

    Mogelijke waarden voor <RoleType> in de opdracht New-WebSitesServer zijn: ManagementServer, FileServer, LoadBalancer, Publisher en WebWorker.

Voorbeeld

Als u een oude webwerkrol met de naam 'OldWorker' en een nieuwe webwerkrol met de naam 'NewWorker' had en u de WebWorker-referenties had bijgewerkt naar 'WebWorkerAdmin', zou u het volgende uitvoeren:

Import-Module WebSites

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

Remove-WebSitesServer -Name OldWorker

New-WebSitesServer -Name NewWorker -ServerType WebWorker

4. Voer een reparatie uit op alle rollen

Nadat u het herstel hebt voltooid, voert u een herstel uit op alle rollen en controleert u deze om te controleren of ze weer in orde zijn.

Zie ook

Back-ups maken van Windows Azure Pack: websites
Windows Azure Pack implementeren: websites