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:
De certificaatshare herstellen
De websitesshare herstellen
ACL's indien nodig opnieuw gebruiken
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:
De module Websites importeren
Werk de referenties bij.
De oude servernamen uit de farm verwijderen
De nieuwe servers toevoegen aan de juiste farms
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.
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.
Voer voor elke oude servernaam <OldName> uit die niet meer wordt gebruikt:
Remove-WebSitesServer -Name <OldName>
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