Scenario: You want a script to install the Prerequisites for Exchange 2016 on Windows Server 2016. Here is a few of the PowerShell commands we ran remotely for each server.
Gather your Servers
#Collect Servers into a Variable
$strOU = "OU=Exchange2016,DC=XYZ,DC=COM"
$servers = get-adcomputer -searchbase $strOU -properties Name -Filter *| where {$_.name -like "Ex16-*"} | Select -ExpandProperty Name
Turn off the Windows Firewall (We kept our Firewall turned on with multiple rules, but incase you need to disable it this is how you do it)
#turn off Windows Firewall
$servers | %{"Turning Windows Firewall off on $_";Invoke-Command -Computer $_ -ScriptBlock {Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False}}
Place all Installer Files (C:sharesoftware) into a folder and copy them to each server under C:Software.
#MD
$servers | %{MD \$_c$software}
#Copy Files to a Server - Put all Setup files you wish to install in this directory and copy to the server.
$servers | %{"Copying files to $_";Copy-Item C:sharesoftware* \$_C$software}
Disable User Account Control
#Disable UserAccountControl on a Server
$servers | %{"Disable UserAccountControl on $_"; Invoke-Command -Computer $_ -ScriptBlock {New-ItemProperty -Path HKLM:SoftwareMicrosoftWindowsCurrentVersionpoliciessystem -Name EnableLUA -PropertyType DWord -Value 0 -Force}}
Install Windows Features
#Install Windows Features
$servers | Sort | %{"Installing Windows Features on $_"; Invoke-Command -Computer $_ -ScriptBlock {Install-WindowsFeature NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation,RSAT-ADDS}}
Set the Page File Size to 32GB
#Setting Page File Size on Servers
$servers | %{"Setting Page File Size on $_"; Invoke-Command -Computer $_ -ScriptBlock {
[int]$InitialSize = 32778
[int]$MaximumSize = 32778
$ComputerSystem = $null
$CurrentPageFile = $null
$modify = $false
$ComputerSystem = Get-WmiObject -Class Win32_ComputerSystem -EnableAllPrivileges
if ($ComputerSystem.AutomaticManagedPagefile) {$ComputerSystem.AutomaticManagedPagefile = $false; $ComputerSystem.Put()}
$CurrentPageFile = Get-WmiObject -Class Win32_PageFileSetting
if ($CurrentPageFile.InitialSize -ne $InitialSize) {$CurrentPageFile.InitialSize = $InitialSize;$modify = $true}
if ($CurrentPageFile.MaximumSize -ne $MaximumSize) {$CurrentPageFile.MaximumSize = $MaximumSize;$modify = $true}
if ($modify) { $CurrentPageFile.Put()}
}}
Install Unified Communications Managed API Runtime. The installer was renamed to UCMA.exe.
#Install Unified Communications Managed API Runtime silently
$servers | %{"Installing UCMA on $_"; Invoke-Command -Computer $_ -ScriptBlock {
#Set Variables
$file = "C:softwareUcma.exe"
#check to see if its installed
if (Get-ItemProperty "HKLM:SoftwareMicrosoftWindowsCurrentVersionUninstallUCMA4" -ErrorAction SilentlyContinue) {
Write-host "Unified Communications Managed API 4.0 Runtime is already installed." -ForegroundColor Cyan
} else {
#testing
If (Test-Path $file){
Write-host "The installer file exists:$file" -ForegroundColor Green
#Installing
Write-Host "Installing Microsoft UM API..." -ForegroundColor yellow
$arg = "/quiet /norestart"
$status = (Start-Process $file -ArgumentList $arg -Wait -PassThru).ExitCode
if ($status -eq 0) { write-host "Successfully installed $file" -ForegroundColor Green }
if ($status -ne 0) { write-host "Failed!" -ForegroundColor Red }
} else {Write-host "$file does not exist" -ForegroundColor red}
}}}
Restart your Servers
#Restart Servers
$servers | %{"Restarting $_";Restart-computer $_ -force}