Script Name: Exchange2010Prereqs.ps1
Script Author: Pat Richard, MVP
Log:
1.0 – Original script 11/27/09 based on the work of Anderson Patricio and Bhargav Shukla
1.1 – 04/09/2010 – added help; downloads of update rollups; cleanup of variables; added another option for typical install w/o RPC-Over-HTTP added RunOnce to delete download path on reboot
2.0 – 05/07/2010 – better detection of installed filter packs; uses Filter Pack 2; includes PDF iFilter pack; added disabling TCP/IP V6 option. Now uses BITS for file transfers; added unzip function to unzip the PDF iFilter pack download. Cleaned up some functions. Uses environmental variable “temp” for download location. Checks if things are already installed/downloaded/unzipped before trying to install/download/unzip them.
2.1 – 12/08/2011 – Added the new prerequisite introduced with the release of SP2, IIS 6 WMI Compatibility feature (Web-WMI). This is added to all options containing the CAS role
Code:
<# .SYNOPSIS Configures the necessary prerequisites to install Exchange 2010 on a Windows Server 2008 R2 server .DESCRIPTION Installs all required Windows 2008 R2 components, the filter pack, and configures service startup settings. Provides options for disabling TCP/IP v6, downloading latest Update Rollup, etc. .NOTES Version : 1.0 - 11/27/2009 - initial version : 1.1 - 04/09/2010 - added help; downloads of update rollups; cleanup of variables; added another option for typical install w/o RPC-Over-HTTP : added RunOnce to delete download path on reboot : 2.0 - 05/07/2010 - better detection of installed filter packs; uses Filter Pack 2; includes PDF iFilter pack; added disabling TCP/IP V6 option. : Now uses BITS for file transfers; added unzip function to unzip the PDF iFilter pack download. Cleaned up some functions. Uses environmental : variable "temp" for download location. Checks if things are already installed/downloaded/unzipped before trying to install/download/unzip them. Rights Required : Local Admin on server Sched Task Req'd : No Exchange Version : 2010 Author : Pat Richard, Exchange MVP Email / Blog : pat@innervation.com http://ucblogs.net/blogs/exchange Dedicated Blog : http://www.ucblogs.net/blogs/exchange/archive/2009/12/12/Automated-prerequisite-installation-via-PowerShell-for-Exchange-Server-2010-on-Windows-Server-2008-R2.aspx Disclaimer : You running this script means you won't blame me if this breaks your stuff. Info Stolen from : Anderson Patricio and Bhargav Shukla .LINK http://www.ucblogs.net/blogs/exchange/archive/2009/12/12/Automated-prerequisite-installation-via-PowerShell-for-Exchange-Server-2010-on-Windows-Server-2008-R2.aspx .LINK http://msmvps.com/blogs/andersonpatricio/archive/2009/11/13/installing-exchange-server-2010-pre-requisites-on-windows-server-2008-r2.aspx .LINK http://www.bhargavs.com/index.php/powershell/2009/11/script-to-install-exchange-2010-pre-requisites-for-windows-server-2008-r2/ .EXAMPLE .\Set-Exchange2010Prereqs.ps1 .INPUTS None. You cannot pipe objects to this script. #> #Requires -Version 2.0 # Detect correct OS here and exit if no match if (-not((Get-WMIObject win32_OperatingSystem).OSArchitecture -eq '64-bit') -and (Get-WMIObject win32_OperatingSystem).Version -eq '6.1.7600'){ Write-Host "`nThis script requires a 64bit version of Windows Server 2008 R2, which this is not. Exiting...`n" -ForegroundColor Red Exit } clear-host pushd [string] $targetfolder = "c:\Innervation" # [string] $targetfolder = (Get-Content Env:Temp) [bool] $wasinstalled = $false [bool] $RebootRequired = $false # determine if BitsTransfer is already installed if (Get-Module BitsTransfer){$wasinstalled = $true}else{$wasinstalled = $false} # this should probably get moved to a function... if ((Get-Module ServerManager) -eq $null){Import-Module ServerManager} [string] $opt = "None" [bool] $HasInternetAccess = ([Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]'{DCB00C01-570F-4A9B-8D69-199FDBA5723B}')).IsConnectedToInternet) [string] $menu = @' Exchange Server 2010 - Prerequisites script Please select an option from the list below.. 1) install Hub Transport prerequisites 2) install Client Access Server prerequisites 3) install Mailbox prerequisites 4) install Unified Messaging prerequisites 5) install Edge Transport prerequisites 6) install Typical (CAS/HUB/Mailbox) prerequisites 7) install Typical (CAS/HUB/Mailbox) prerequisites [NO RPC-OVER-HTTP] 8) install Client Access and Hub Transport prerequisites 9) Configure NetTCP Port Sharing service (Required for the Client Access Server role Automatically set for options 2,6,7,8, and 11) 10) Install 2010 Office System Converter: Microsoft Filter Pack 2.0 (Required if installing Hub Transport or Mailbox Server roles Automatically set for options 1,3,6,7,8, and 11) 11) install Typical (CAS/HUB/Mailbox) prerequisites [with .PDF ifilter] 12) Download Exchange Server 2010 Update Rollup 3 13) Disable TCP/IP V6 14) Restart the Server 15) Exit '@ function InstallFilterPack(){ # Office filter pack if ((Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{95140000-2000-0409-1000-0000000FF1CE}") -eq $false){ GetIt "http://download.microsoft.com/download/0/A/2/0A28BBFA-CBFA-4C03-A739-30CCA5E21659/FilterPack64bit.exe" Set-Location $targetfolder [string]$expression = ".\FilterPack64bit.exe /quiet /norestart /log:$targetfolder\FilterPack64bit.log" Write-Host "File: FilterPack64bit.exe installing..." -NoNewLine Invoke-Expression $expression Start-Sleep -Seconds 20 if ((Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{95140000-2000-0409-1000-0000000FF1CE}") -eq $true){Write-Host "`b`b`b`b`b`b`b`b`b`b`b`b`binstalled! " -Foregroundcolor Green}else{Write-Host "`b`b`b`b`b`b`b`b`b`b`b`b`bFAILED!" -Foregroundcolor Red} }else{ Write-Host "`nOffice filter pack already installed" -Foregroundcolor Green } }# end installing office filter pack function InstallPDFFilterPack(){ # adobe ifilter if ((Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{5EA12CF3-8162-47F6-ACAF-45AD03EFB08F}") -eq $false){ GetIt "http://download.adobe.com/pub/adobe/acrobat/win/9.x/PDFiFilter64installer.zip" UnZipIt "PDFiFilter64installer.zip" "PDFFilter64installer.msi" Set-Location $targetfolder [string]$expression = ".\PDFFilter64installer.msi /quiet /norestart /l* $targetfolder\PDFiFilter64Installer.log" Write-Host "File: PDFFilter64installer.msi installing..." -NoNewLine Invoke-Expression $expression Start-Sleep -Seconds 20 if ((Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{5EA12CF3-8162-47F6-ACAF-45AD03EFB08F}") -eq $true){Write-Host "`b`b`b`b`b`b`b`b`b`b`b`b`binstalled! " -Foregroundcolor Green}else{Write-Host "`b`b`b`b`b`b`b`b`b`b`b`b`bFAILED!" -Foregroundcolor Red} }else{ Write-Host "`nPDF filter pack already installed" -Foregroundcolor Green } } # end installing pdf filter pack function SetRunOnce(){ # Sets the NetTCPPortSharing service for automatic startup before the first reboot # by using the old RunOnce registry key (because the service doesn't yet exist, or we could # use 'Set-Service') $hostname = (hostname) $RunOnceCommand1 = "sc \\$hostname config NetTcpPortSharing start= auto" if (Get-ItemProperty -Name "NetTCPPortSharing" -path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce' -ErrorAction SilentlyContinue) { Write-host "Registry key HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce\NetTCPPortSharing already exists." -ForegroundColor yellow Set-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce" -Name "NetTCPPortSharing" -Value $RunOnceCommand1 | Out-Null } else { New-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce" -Name "NetTCPPortSharing" -Value $RunOnceCommand1 -PropertyType "String" | Out-Null } } # end SetRunOnce function GetIt ([string]$sourcefile) { if ($HasInternetAccess){ # check if BitsTransfer is installed if ((Get-Module BitsTransfer) -eq $null){ Write-Host "BitsTransfer: Installing..." -NoNewLine Import-Module BitsTransfer Write-Host "`b`b`b`b`b`b`b`b`b`b`b`b`binstalled! " -ForegroundColor Green } [string] $targetfile = $sourcefile.Substring($sourcefile.LastIndexOf("/") + 1) if (Test-Path $targetfolder){ Write-Host "Folder: $targetfolder exists." } else{ Write-Host "Folder: $targetfolder does not exist, creating..." -NoNewline New-Item $targetfolder -type Directory | Out-Null Write-Host "`b`b`b`b`b`b`b`b`b`b`bcreated! " -ForegroundColor Green } if (Test-Path "$targetfolder\$targetfile"){ Write-Host "File: $targetfile exists." }else{ Write-Host "File: $targetfile does not exist, downloading..." -NoNewLine Start-BitsTransfer -Source "$SourceFile" -Destination "$targetfolder\$targetfile" Write-Host "`b`b`b`b`b`b`b`b`b`b`b`b`b`bdownloaded! " -ForegroundColor Green } }else{ Write-Host "Internet Access not detected. Please resolve and try again." -foregroundcolor red } } #end GetIt function UnZipIt ([string]$source, [string]$target){ if (Test-Path "$targetfolder\$target"){ Write-Host "File: $target exists." }else{ Write-Host "File: $target doesn't exist, unzipping..." -NoNewLine $sh = new-object -com shell.application $zipfolder = $sh.namespace("$targetfolder\$source") $item = $zipfolder.parsename("$target") $targetfolder2 = $sh.namespace("$targetfolder") Set-Location $targetfolder $targetfolder2.copyhere($item) Write-Host "`b`b`b`b`b`b`b`b`b`b`b`bunzipped! " -ForegroundColor Green Remove-Item $source } } #end UnZipIt Do { if ($RebootRequired -eq $true){write-host "`t`t`t`t`t`t`t`t`t`n`t`t`t`tREBOOT REQUIRED!`t`t`t`n`t`t`t`t`t`t`t`t`t`n`t`tDO NOT INSTALL EXCHANGE BEFORE REBOOTING!`t`t`n`t`t`t`t`t`t`t`t`t" -backgroundcolor red -foregroundcolor black} if ($opt -ne "None") {write-host "Last command: "$opt -foregroundcolor Yellow} write-host $menu $opt = Read-Host "Select an option.. [1-15]? " switch ($opt) { 1 { InstallFilterPack; Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server; $RebootRequired = $true } 2 { SetRunOnce; Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy,Web-WMI; $RebootRequired = $true } 3 { InstallFilterPack; Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server; $RebootRequired = $true } 4 { Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Desktop-Experience; $RebootRequired = $true } 5 { Add-WindowsFeature NET-Framework,RSAT-ADDS,ADLDS; $RebootRequired = $true } 6 { SetRunOnce; InstallFilterPack; Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy,Web-WMI; $RebootRequired = $true } 7 { SetRunOnce; InstallFilterPack; Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,Web-WMI; $RebootRequired = $true } 8 { SetRunOnce; InstallFilterPack; Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy,Web-WMI; $RebootRequired = $true } 9 { Set-Service NetTcpPortSharing -StartupType Automatic;Write-Host "done!" -ForegroundColor Green } 10 { InstallFilterPack } 11 { SetRunOnce; InstallFilterPack; InstallPDFFilterPack; Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy,Web-WMI; $RebootRequired = $true } 12 { GetIt "http://download.microsoft.com/download/A/C/0/AC0E7C57-9FF2-488A-938D-FD65C39B9B00/Exchange2010-KB981401-x64-en.msp"} 13 { Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters DisabledComponents 0xffffffff -type dword; Write-Host "done!" -foregroundcolor green; $RebootRequired = $true} 14 { Restart-Computer } 15 { if (($wasinstalled -eq $false) -and (Get-Module BitsTransfer)){Write-Host "Removing BitsTransfer..." -NoNewLine;Remove-Module BitsTransfer;Write-Host "removed!" -ForegroundColor Green};popd;write-host "Exiting..."} default {write-host "You haven't selected any of the available options. "} } } while ($opt -ne 15)
[…] PowerShell Script: Pat Richard, MVP has created a script to automate the process of installing the prerequisites: https://msunified.net/exchange-downloads/script-exchange2010prereqs-ps1/ […]
[…] script is basically an improved version of the previous one and allow you to download updates as […]
Would it be beneficial to allow the user to decide which NIC to disable TCP/IP v6 on instead of disabling it on all NICs (say in disabling ip v6 only on Replication NIC)? And then, how about having a “Re-Enable TCP/IP v6 choice?
is there a download link for the scripts….copying and pasting doesnt work at that well
thanks
edward
Hi Edward, thanks for commenting. If you mouse over the script code you should get the option to copy the script to you clip borard or open the script correctly formated in notepad in the left corner. Let me know if that does not work for you.
I’ve tried this page with three browsers and I’m not seeing a simple way to use this version of the script either. There’s no option to copy the script to clipboard and no link to open it in notepade. Have tried two versions of IE8 and Chrome.
I have used IE8 myself from different computers and servers and it works every time. You dont have to install flash to be able to copy to clipboard. When you mouse over the PS script you should to see a view source button up to the right of the PS script area. Hope this helps.
[…] https://msunified.net/exchange-downloads/script-exchange2010prereqs-ps1/ […]
Line 182 which is used for option 6 has a missing comma at the end …. RPC-Over-HTTP-ProxyWeb-WMI…. should instead be …RPC-Over-HTTP-Proxy,Web-WMI…. as that causes the roles to not install properly otherwise.
Also with SP2 CAS role you also need to add thse 2 features
Web-ASP
Web-ISAPI-Filter
And finally you also need Web-ASP-NET for the CAS role
Love the script!
One small typo, though:
at line 182 it reads in part:
“RPC-Over-HTTP-ProxyWeb-WMI; ”
but it is missing a comma between the final two modules ‘RPC-Over-HTTP-Proxy’ and ‘Web-WMI’ :
“RPC-Over-HTTP-Proxy,Web-WMI; ”
Without this change there is an error that module “”RPC-Over-HTTP-ProxyWeb-WMI” can’t be found.
Thanks, corrected as requested :)
Please take a look at my new blog post for installing Exchange Server 2013 Preview prerequisites on Windows 2008 R2 SP1. I hope this new script is as useful as yours has been on my many Exchange 2010 installs. Thanks.
http://justaucguy.wordpress.com/2012/08/15/exchange-server-2013-preview-prerequisites-script-2008-r2-sp1/
[…] Anyone who’s done the deployments knows that based on the host operating system, certain prerequisites vary. Its a waste of time having to go and install the windows services, filter packs, etc on each server individually, when more than one server is involved in the process. Fortunately for us there’s a script available to facilitate this whole process. Pat Richard, Microsoft MVP created a script to make our lives a lot easier. This script can be found here. […]
[…] Grab the script from here https://msunified.net/exchange-downloads/script-exchange2010prereqs-ps1/ […]
I edited the script so it’s also capable of installing Service Pack 2 fo Exchange Server 2010.
Code:
function InstallServicePack2(){
# Exchange Service pack 2
if ((Test-Path “HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{4934D1EA-BE46-48B1-8847-F1AF20E892C1}”) -eq $false){
GetIt “http://download.microsoft.com/download/F/5/F/F5FADCEF-D96B-48C4-ADD9-067FDB1AEDB6/Exchange2010-SP2-x64.exe”
Set-Location $targetfolder
[string]$expression = “.\Exchange2010-SP2-x64.exe /x:$targetfolder\ExchSP2 /quiet”
Write-Host “File: Exchange 2010 SP2 extracting…” -NoNewLine
Invoke-Expression $expression
Start-Sleep -Seconds 20
Write-Host “Extracted!” -Foregroundcolor Green
[string]$expression2 = “.\ExchSP2\setup /m:upgrade /InstallWindowsComponents”
Write-Host “File: Exchange 2010 SP2 installing…” -NoNewLine
Invoke-Expression $expression2
Start-Sleep -Seconds 20
if ((Test-Path “HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{4934D1EA-BE46-48B1-8847-F1AF20E892C1}”) -eq $true){Write-Host “`b`b`b`b`b`b`b`b`b`b`b`b`binstalled! ” -Foregroundcolor Green}else{Write-Host “`b`b`b`b`b`b`b`b`b`b`b`b`bFAILED!” -Foregroundcolor Red}
}else{
Write-Host “`nExchange 2010 Service Pack 2 already installed” -Foregroundcolor Green
}
}# end installing Exchange 2010 Serice pack 2
Things could be a bit nicer or better, but this works for me!
[…] Grab the script from here https://msunified.net/exchange-downloads/script-exchange2010prereqs-ps1/ […]