Olav Aukan Getting information off the Internet is like taking a drink from a fire hydrant…

30Mar/11

How To Backup And Restore IIS 7 Metabase With PowerShell

As I mentioned in my last blog post I've been playing around with PowerShell for SharePoint automation for a while now. One of the problems with SharePoint is it's complicated architecture that makes a seemingly simple task - backing up the system - incredibly complicated. The complexity often comes from the fact that there are so many options to choose from. There are SQL backups of the content databases, Stsadm.exe backups of whole or parts of the farm, VMWare snapshots of the server (which by the way is not supported by Microsoft), file backups of the 12 hive, solution file backups, web.config backups, IIS backups, third party backup solutions that do some or all of these things etc. etc. etc.

This blog post is not going to solve those issues for you, but it will at least give you one part of the puzzle: how to backup and restore the IIS metabase with PowerShell.

# This function performs a backup of the IIS Metabase
function SP-Backup-IIS {

	param (
		[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)]
		[string]
		$BackupFolder		
	)
	
	process {
	
		UI-PrintAction "Attempting to backup the Internet Information Services Metabase"
		
		Write-Host "Checking IIS version..."
		Write-Host
		
		$IISVersion = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\InetStp | select SetupString, *Version*)
		
		Write-Host "IIS Version:"
		$IISVersion
		Write-Host
		
		$ComputerName = Get-Content Env:Computername
		$Time = [DateTime]::Now.ToString().Replace(":",".").Replace(" ","_")
		$BackupName = "IIS-Metadata-$ComputerName-$Time"
		$BackupFileName = "$BackupName.zip"
		
	    switch ($IISVersion.MajorVersion) 
		{
			# IIS 7
			7 {
				$BackupFilePath = Join-Path -Path $BackupFolder -ChildPath $BackupFileName

				Write-Host "Starting backup of IIS metadata."
				Write-Host
				
				#Perform backup
				& $env:windir\system32\inetsrv\appcmd.exe add backup $BackupName				
				
				#Zip and copy backup to destination
				$IISRootBackupFolder = Get-Item $env:windir\system32\inetsrv\backup
				$IISBackupFolder = Join-Path -Path $IISRootBackupFolder -ChildPath $BackupName								
				Zip-Compress-Folder $IISBackupFolder $BackupFilePath
												
				Write-Host "Backup Complete"
			}
			
			# Other version of IIS
			default { Write-Host "This version of IIS is not supported in this script." -ForegroundColor Yellow }
		}
		Write-Host
	}
}

# This function restores a backup of the IIS Metabase
function SP-Restore-IIS {

	param (
		[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)]
		[string]
		$BackupName		
	)
	
	process {
	
		UI-PrintAction "Attempting to restore the Internet Information Services Metabase"
		
		Write-Host "Checking IIS version..."
		Write-Host
		
		$IISVersion = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\InetStp | select SetupString, *Version*)
		
		Write-Host "IIS Version:"
		$IISVersion
		Write-Host
				
	    switch ($IISVersion.MajorVersion) 
		{
			# IIS 7
			7 {

				Write-Host "Starting restore of IIS metadata."
				Write-Host
				
				#Perform restore
				& $env:windir\system32\inetsrv\appcmd.exe restore backup $BackupName				
								
				Write-Host
				Write-Host "Restore Complete"
			}
			
			#Other version of IIS
			default { Write-Host "This version of IIS is not supported in this script." -ForegroundColor Yellow }
		}
		Write-Host
	}
}


# This function zips the contents of a folder
function Zip-Compress-Folder { 

	param (
		[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)]
		[string]
		$SourceFolder,		

		[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=1)]
		[string]
		$ZipFileName		
	)
	
	process {
		
		Write-Host
		Write-Host "Creating new zip file."
		Write-Host
		Write-Host "Source: $SourceFolder"
		Write-Host "Destination: $ZipFileName"
		Write-Host
		
		$ParentFolder = (Get-Item $SourceFolder).Parent.FullName
		
		# Check if file exists
		if (test-path $ZipFileName) { 
		  Write-Host "The file $ZipFileName already exists." -ForegroundColor Yellow
		  return
		} 
		
		# Create zip file		
		Set-Content $ZipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
		(Dir $ZipFileName).IsReadOnly = $false 
		$ZipFile = (New-Object -com shell.application).NameSpace($ZipFileName) 
		
		Write-Host "Adding $SourceFolder to the zip file."
		Write-Host
				
		$ZipFile.CopyHere((Get-Item $SourceFolder).FullName)
		
		Write-Host "Zip file created."
		Write-Host
	}
}

SP-Backup-IIS will backup the IIS metabase, zip the backup folder and copy it to the location you specify in the $BackupFolder parameter. The SP-Restore-IIS will restore the IIS metabase from the backup you specify in the $BackupName parameter. This parameter corresponds to the name of the backup folder in 'C:\Windows\System32\inetsrv\backup'. You could expand on this by having the restore script first get your zip file and extract it to the backup folder. Happy scripting!

Filed under: Uncategorized 30 Comments