Restauration de Windows Azure Pack : Sites web

 

S’applique à : Windows Azure Pack

Il est fortement recommande de restaurer les serveurs avec les mêmes noms et comptes d'administrateur qu'au moment de la sauvegarde. Pour que la restauration réussisse, le serveur de fichiers et le SQL Server doivent être exactement les mêmes en termes de configuration, utilisateurs et autorisations qu'au moment de la sauvegarde. Lorsque vous restaurez votre service Sites Web, suivez l'ordre suivant :

1. Restaurer des bases de données SQL Server

2. Restaurer le serveur de fichiers

3. Restaurer le contrôleur de sites web

4. Exécuter une réparation sur tous les rôles

Vous pouvez utiliser des scripts pour effectuer les opérations de sauvegarde. Les étapes sont détaillées ci-dessous.

1. Restaurer des bases de données SQL Server

Restaurez l'hébergement SQL Server, le contrôle des ressources et les bases de données master. Le serveur SQL doit avoir le même nom qu'au moment de la sauvegarde.

Exemple de script de restauration SQL

L'exemple de script qui suit est fourni à titre d'illustration uniquement et n'est pas pris en charge. Le script que vous créez doit être exécuté avec des privilèges d'administrateur.

Notes

Ce script n'est pas pris en charge par 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. Restaurer le serveur de fichiers

Le serveur de fichiers doit avoir le même nom qu'au moment de la sauvegarde. Vous devez restaurer les composants du serveur de fichiers dans l'ordre suivant :

  1. Restaurez le partage de certificats.

  2. Restaurez le partage de sites Web.

  3. Réappliquez les listes de contrôle d'accès si nécessaire.

  4. Réappliquez les quotas FSRM sur le partage de sites Web.

Deux exemples de script sont fournis : un pour les étapes a à c ci-dessus, et un pour réappliquer les quotas FSRM sur le partage de sites Web.

Exemple de script de restauration de serveur de fichiers

L'exemple de script suivant inclut les étapes a à c ci-dessus (il ne restaure pas les quotas FSRM). Le script est fourni à titre d'illustration uniquement et n'est pas pris en charge. Le script que vous créez doit être exécuté avec des privilèges d'administrateur.

Notes

Ce script n'est pas pris en charge par 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

Exemple de script pour restaurer les quotas FSRM

L'exemple de script suivant restaure les quotas FSRM. Le script est fourni à titre d'illustration uniquement et n'est pas pris en charge. Le script que vous créez doit être exécuté avec des privilèges d'administrateur.

Notes

Ce script n'est pas pris en charge par 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. Restaurer le contrôleur de sites web

Pour restaurer le contrôleur de sites Web, vous pouvez utiliser le script PowerShell Restore.ps1 présenté dans cette section.

Copiez le script Restore.ps1 dans le contrôleur de sites Web, puis exécutez la commande suivante avec des privilèges d'administrateur :

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

Notes

L'indicateur $encryptionKey n'est requis que si vous l'avez utilisé pendant la sauvegarde.

Le script Restore.ps1 suit.

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

Restaurer sur des serveurs autres que des serveurs de fichiers avec des noms ou des comptes d'administration différents

Si vous devez restaurer un serveur (qui n'est pas un serveur de fichiers ou SQL Server) sur un ou des serveurs dont les noms ou les comptes d'administrateur sont différents de ceux d'origine, vous devez :

  1. Importer le module WebSites

  2. Mettez à jour les informations d’identification

  3. Supprimer les anciens noms de serveur de la batterie

  4. Ajouter de nouveaux serveurs à la batterie appropriée

  1. Tout d'abord, avant l'exécution de toute commande, importez le module WebSites :

    Import-Module WebSites
    

    Exécutez ensuite les commandes 2 à 4 sur le contrôleur, en tant qu'administrateur.

  2. Si les informations d’identification du roleType<> ont changé, exécutez les informations d’identification suivantes pour chaque information d’identification modifiée :

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

    Notes

    Les valeurs possibles pour <RoleType> dans la commande Set-WebSitesConfig sont : ManagementServer, FileServer, FrontEnd, Publisher et Worker.

  3. Pour chaque ancien nom <de serveur OldName> qui n’est plus utilisé, exécutez :

    Remove-WebSitesServer -Name <OldName>
    
  4. Pour chaque nouveau nom <de serveur NewName> de roleType<>, exécutez ceci :

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

    Notes

    Les valeurs possibles pour <RoleType> dans la commande New-WebSitesServer sont : ManagementServer, FileServer, LoadBalancer, Publisher et WebWorker.

Exemple

À supposer que le nom de l'ancien rôle de traitement Web est « OldWorker » et que le nouveau nom du rôle de traitement Web est « NewWorker », et que vous avez mis à jour les informations d'identification de WebWorker avec « WebWorkerAdmin », vous devez exécuter :

Import-Module WebSites

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

Remove-WebSitesServer -Name OldWorker

New-WebSitesServer -Name NewWorker -ServerType WebWorker

4. Exécuter une réparation sur tous les rôles

Une fois la restauration terminée, exécutez une réparation sur tous les rôles et surveillez-les pour vérifier que leur restauration a réussi.

Voir aussi

Sauvegarde de Windows Azure Pack : Sites web
Déployer Windows Azure Pack : Sites web