Подготовка Windows Server к установке Exchange 2010 Client Access Array + NLB.

Exchange-Server-PowerShellВ этой заметке я расскажу как подготовить чистый сервер к установке на него дополнительного экземпляра Exchange Server 2010 с ролями Client Access и Hub Transport, а также опишу шаги по дальнейшей настройке массива CAS (создание массива CAS, выпуск сертификата, настройка организации Exchange на работу через массив CAS).

 

При планировании развёртывания массива CAS-серверов у нас в компании мне часто приходилось в тестовой среде проходить все шаги установки, от чистой системы до работоспособной среды CAS Array + NLB, выявляя различные особенности и «подводные камни». В результате появилось желание автоматизировать хоть какие-то участки развёртывания. Сначала появился небольшой скрипт по установке всех необходимых ролей и компонентов Windows, затем он был доработан до графической оболочки, куда вводятся начальные данные и запускается подготовка системы к развёртыванию Exchange.

Общая схема будет выглядеть примерно так:

topology

Ниже представлен финальный вариант скрипта — этап подготовки сервера. Для его успешного выполнения необходимо:
1. Установить Windows Server и все обновления.
2. Установить дополнительный сетевой адаптер, который будет использоваться NLB-кластером.
3. Спланировать ip-адреса сетевых адаптеров (Management и NLB), ip-адрес кластера (виртуальный).
4. Создать А-запись на DNS-сервере для кластера NLB.
5. Необходимо также скачать дистрибутив Office2010FilterPacks (x64) http://www.microsoft.com/en-US/download/details.aspx?id=17062

Файл установщика FilterPack64bit.exe должен быть разблокирован через свойства файла
filterpack

Скрипт готовит сервер к установке дополнительного экземпляра Exchange Server 2010 с ролью CAS, создаёт кластер NLB, прописывает правила портов кластера. При желании его можно легко адаптировать под свои нужды изменив или удалив некоторые участки.

#Генерируется форма интерфейса
function GenerateForm {
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#Генерируем объекты формы
$form1 = New-Object System.Windows.Forms.Form
$richTextBox1 = New-Object System.Windows.Forms.RichTextBox
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
$button1 = New-Object System.Windows.Forms.Button
$label8 = New-Object System.Windows.Forms.Label
$radioButton2 = New-Object System.Windows.Forms.RadioButton
$radioButton1 = New-Object System.Windows.Forms.RadioButton
$label7 = New-Object System.Windows.Forms.Label
$textBox7 = New-Object System.Windows.Forms.TextBox
$label6 = New-Object System.Windows.Forms.Label
$label5 = New-Object System.Windows.Forms.Label
$label4 = New-Object System.Windows.Forms.Label
$textBox6 = New-Object System.Windows.Forms.TextBox
$textBox5 = New-Object System.Windows.Forms.TextBox
$textBox4 = New-Object System.Windows.Forms.TextBox
$textBox3 = New-Object System.Windows.Forms.TextBox
$label3 = New-Object System.Windows.Forms.Label
$textBox2 = New-Object System.Windows.Forms.TextBox
$label2 = New-Object System.Windows.Forms.Label
$label1 = New-Object System.Windows.Forms.Label
$textBox1 = New-Object System.Windows.Forms.TextBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#Здесь указываем все действия, которые будут выполняться при нажатии на кнопку
$button1_OnClick= 
{
$cl_ip = $textBox1.text
$cl_name = $textBox2.text
$cl_host = $textBox3.text
$int_name = $textBox4.text
$int_addr = $textBox5.text
$int_mask = $textBox6.text
$distr_path = $textBox7.text
if ($radioButton1.Checked -eq $true) {$mode="unicast"}
if ($radioButton2.Checked -eq $true) {$mode="multicast"}
"Импортируем модуль ServerManager" | Out-Host
Import-Module ServerManager
$progressBar1.Value = 10
"Устанавливаем роль NLB и средства управления кластером" | Out-Host
Get-Date | Out-Host
Add-WindowsFeature NLB,RSAT-NLB
Get-WindowsFeature | Where {$_.Name -match "NLB"} | Out-Host
$progressBar1.Value = 20
"Устанавливаем NET.Framework" | Out-Host
Get-Date | Out-Host
Add-WindowsFeature NET-Framework
Get-WindowsFeature | Where {$_.Name -match "NET"} | Out-Host
$progressBar1.Value = 35
"Устанавливаем параметры NLB-интерфейса" | Out-Host
Get-Date | Out-Host
netsh interface ipv4 set address name="$int_name" source=static addr=$int_addr mask=$int_mask gateway=none
netsh interface ipv4 set interface $int_name forwarding=enable
netsh interface ipv4 show interface $int_name level=verbose | Out-Host
Set-Service NetTcpPortSharing -StartupType Automatic
$progressBar1.Value = 45
"Создаём NLB кластер" | Out-Host
Get-Date | Out-Host
Import-Module NetworkLoadBalancingClusters
New-NLBCluster -Hostname $cl_host -InterfaceName $int_name -ClusterPrimaryIP $cl_ip -ClusterName $cl_name -OperationMode $mode
Set-NLBClusterNode -Hostname $cl_host -InterfaceName $int_name -InitialHostState started
$progressBar1.Value = 60
"Прописываем правила портов" | Out-Host
Get-Date | Out-Host
Add-NLBClusterPortRule -StartPort 80 -EndPort 80 -InterfaceName $int_name -Affinity single -IP $cl_ip -Protocol tcp
Add-NLBClusterPortRule -StartPort 110 -EndPort 110 -InterfaceName $int_name -Affinity single -IP $cl_ip -Protocol tcp
Add-NLBClusterPortRule -StartPort 135 -EndPort 135 -InterfaceName $int_name -Affinity single -IP $cl_ip -Protocol tcp
Add-NLBClusterPortRule -StartPort 143 -EndPort 143 -InterfaceName $int_name -Affinity single -IP $cl_ip -Protocol tcp
Add-NLBClusterPortRule -StartPort 443 -EndPort 443 -InterfaceName $int_name -Affinity single -IP $cl_ip -Protocol tcp
Add-NLBClusterPortRule -StartPort 993 -EndPort 993 -InterfaceName $int_name -Affinity single -IP $cl_ip -Protocol tcp
Add-NLBClusterPortRule -StartPort 995 -EndPort 995 -InterfaceName $int_name -Affinity single -IP $cl_ip -Protocol tcp
Add-NLBClusterPortRule -StartPort 1024 -EndPort 65535 -InterfaceName $int_name -Affinity single -IP $cl_ip -Protocol tcp
$progressBar1.Value = 75
"Удаляем правило по умолчанию" | Out-Host
Get-Date | Out-Host
Get-NlbClusterPortRule -Port 0 | Remove-NlbClusterPortRule -Force
$progressBar1.Value = 85
"Устанавливаем FilterPack" | Out-Host
Get-Date | Out-Host
Start-Process -FilePath "$distr_path\FilterPack64bit.exe" -ArgumentList "/passive","/norestart"
$progressBar1.Value = 90
Start-Sleep -Seconds 3
"Устанавливаем необходимые для Exchange 2010 компоненты" | Out-Host
Get-Date | Out-Host
Add-WindowsFeature Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-WMI,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Asp-Net,Web-ISAPI-Filter,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy
$d = Get-Date
$progressBar1.Value = 100
"Operations completed at $d"
"Disable unused services on NLB interface $int_name and Reboot your server." | Out-Host
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
 $form1.WindowState = $InitialFormWindowState
}
#Здесь задаются параметры объектов формы
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 421
$System_Drawing_Size.Width = 502
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"
$form1.Text = "ExchangePrep"
$richTextBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 280
$System_Drawing_Point.Y = 30
$richTextBox1.Location = $System_Drawing_Point
$richTextBox1.Name = "richTextBox1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 294
$System_Drawing_Size.Width = 200
$richTextBox1.Size = $System_Drawing_Size
$richTextBox1.TabIndex = 19
$richTextBox1.Text = "#Скрипт готовит сервер к установке дополнительного экземпляра Exchange Server 2010 с ролью CAS, 
создаёт кластер NLB.
#До использования необходимо скачать дистрибутив Office2010FilterPacks (x64) 
http://www.microsoft.com/en-US/download/details.aspx?id=17062
#Файл установщика FilterPack64bit.exe должен быть 
разблокирован через свойства файла
#Для запуска любых скриптов на выполнение необходимо выставить политику запуска скриптов Set-ExecutionPolicy Unrestricted Все поля должны быть заполнены!"
$form1.Controls.Add($richTextBox1)
$progressBar1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 280
$System_Drawing_Point.Y = 371
$progressBar1.Location = $System_Drawing_Point
$progressBar1.Name = "progressBar1"
$progressBar1.Maximum = 100
$progressBar1.Minimum = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 200
$progressBar1.Size = $System_Drawing_Size
$progressBar1.TabIndex = 18
$form1.Controls.Add($progressBar1)
$button1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 280
$System_Drawing_Point.Y = 330
$button1.Location = $System_Drawing_Point
$button1.Name = "button1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 200
$button1.Size = $System_Drawing_Size
$button1.TabIndex = 17
$button1.Text = "Prepare System for Exchange CAS"
$button1.UseVisualStyleBackColor = $True
$button1.add_Click($button1_OnClick)
$form1.Controls.Add($button1)
$label8.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 371
$label8.Location = $System_Drawing_Point
$label8.Name = "label8"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 15
$System_Drawing_Size.Width = 200
$label8.Size = $System_Drawing_Size
$label8.TabIndex = 16
$label8.Text = "Cluster operational mode"
$form1.Controls.Add($label8)
$radioButton2.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 109
$System_Drawing_Point.Y = 389
$radioButton2.Location = $System_Drawing_Point
$radioButton2.Name = "radioButton2"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 24
$System_Drawing_Size.Width = 104
$radioButton2.Size = $System_Drawing_Size
$radioButton2.TabIndex = 15
$radioButton2.TabStop = $True
$radioButton2.Text = "Multicast"
$radioButton2.UseVisualStyleBackColor = $True
$form1.Controls.Add($radioButton2)
$radioButton1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 389
$radioButton1.Location = $System_Drawing_Point
$radioButton1.Name = "radioButton1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 24
$System_Drawing_Size.Width = 80
$radioButton1.Size = $System_Drawing_Size
$radioButton1.TabIndex = 14
$radioButton1.TabStop = $True
$radioButton1.Text = "Unicast"
$radioButton1.UseVisualStyleBackColor = $True
$radioButton1.add_CheckedChanged($handler_radioButton1_CheckedChanged)
$form1.Controls.Add($radioButton1)
$label7.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 313
$label7.Location = $System_Drawing_Point
$label7.Name = "label7"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 15
$System_Drawing_Size.Width = 250
$label7.Size = $System_Drawing_Size
$label7.TabIndex = 13
$label7.Text = "Enter path to FilterPack64bit.exe (ie C:\Filter)"
$form1.Controls.Add($label7)
$textBox7.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 330
$textBox7.Location = $System_Drawing_Point
$textBox7.Name = "textBox7"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 200
$textBox7.Size = $System_Drawing_Size
$textBox7.TabIndex = 12
$form1.Controls.Add($textBox7)
$label6.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 263
$label6.Location = $System_Drawing_Point
$label6.Name = "label6"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 15
$System_Drawing_Size.Width = 200
$label6.Size = $System_Drawing_Size
$label6.TabIndex = 11
$label6.Text = "Enter NLB interface Subnet Mask"
$form1.Controls.Add($label6)
$label5.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 213
$label5.Location = $System_Drawing_Point
$label5.Name = "label5"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 15
$System_Drawing_Size.Width = 200
$label5.Size = $System_Drawing_Size
$label5.TabIndex = 10
$label5.Text = "Enter NLB interface IP address"
$form1.Controls.Add($label5)
$label4.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 163
$label4.Location = $System_Drawing_Point
$label4.Name = "label4"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 15
$System_Drawing_Size.Width = 200
$label4.Size = $System_Drawing_Size
$label4.TabIndex = 9
$label4.Text = "Enter NLB interface Name"
$form1.Controls.Add($label4)
$textBox6.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 280
$textBox6.Location = $System_Drawing_Point
$textBox6.Name = "textBox6"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 200
$textBox6.Size = $System_Drawing_Size
$textBox6.TabIndex = 8
$form1.Controls.Add($textBox6)
$textBox5.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 230
$textBox5.Location = $System_Drawing_Point
$textBox5.Name = "textBox5"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 200
$textBox5.Size = $System_Drawing_Size
$textBox5.TabIndex = 7
$form1.Controls.Add($textBox5)
$textBox4.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 180
$textBox4.Location = $System_Drawing_Point
$textBox4.Name = "textBox4"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 200
$textBox4.Size = $System_Drawing_Size
$textBox4.TabIndex = 6
$form1.Controls.Add($textBox4)
$textBox3.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 130
$textBox3.Location = $System_Drawing_Point
$textBox3.Name = "textBox3"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 200
$textBox3.Size = $System_Drawing_Size
$textBox3.TabIndex = 5
$form1.Controls.Add($textBox3)
$label3.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 113
$label3.Location = $System_Drawing_Point
$label3.Name = "label3"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 15
$System_Drawing_Size.Width = 200
$label3.Size = $System_Drawing_Size
$label3.TabIndex = 4
$label3.Text = "Enter cluster first node hostname"
$form1.Controls.Add($label3)
$textBox2.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 80
$textBox2.Location = $System_Drawing_Point
$textBox2.Name = "textBox2"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 200
$textBox2.Size = $System_Drawing_Size
$textBox2.TabIndex = 3
$form1.Controls.Add($textBox2)
$label2.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 63
$label2.Location = $System_Drawing_Point
$label2.Name = "label2"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 15
$System_Drawing_Size.Width = 200
$label2.Size = $System_Drawing_Size
$label2.TabIndex = 2
$label2.Text = "Enter cluster name"
$form1.Controls.Add($label2)
$label1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 13
$label1.Location = $System_Drawing_Point
$label1.Name = "label1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 15
$System_Drawing_Size.Width = 200
$label1.Size = $System_Drawing_Size
$label1.TabIndex = 1
$label1.Text = "Enter cluster primary(virtual) ip address"
$form1.Controls.Add($label1)
$textBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 30
$textBox1.Location = $System_Drawing_Point
$textBox1.Name = "textBox1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 200
$textBox1.Size = $System_Drawing_Size
$textBox1.TabIndex = 0
$form1.Controls.Add($textBox1)
$InitialFormWindowState = $form1.WindowState
$form1.add_Load($OnLoadForm_StateCorrection)
$form1.ShowDialog()| Out-Null
}
GenarateForm

Сама форма создана при помощи программы Primal Forms Comunity Edition компании SAPIEN.

После запуска скрипта на исполнение появится графическая форма. Необходимо заполнить все поля, затем нажать кнопку «Prepare System for Exchange CAS».

interface

Enter cluster primary(virtual) ip address — виртуальный ip-адрес NLB кластера, для которого мы создавали DNS-запись.
Enter cluster name — имя создаваемого NLB-кластера (то, как он будет отображаться в оснастке управления кластером).
Enter cluster first node hostname — имя первого сервера, на котором создаётся NLB-кластер.
Enter NLB interface Name — имя сетевого интерфейса, который будет обслуживать NLB-кластер.
Enter NLB interface IP address/Subnet Mask — ip-адрес и маска подсети интерфейса, который будет обслуживать NLB-кластер.
Enter path to FilterPack64bit.exe — путь к файлу FilterPack64bit.exe.
Cluster operational mode — необходимо выбрать режим функционирования NLB-кластера. Если вы разворачиваете Exchange 2010 серверы в виртуальной среде, то при работе NLB могут возникнуть проблемы, поэтому, если вы разворачиваете узлы кластера на платформе виртуализации VMware ESX Server, то вам придется использовать режим Multicast. Если же вы работаете с Microsoft Hyper-V, то лучше включить режим Unicast, но при этом внести некоторые изменения в настройки виртуального сетевого адаптера, а именно – настроить Статический МАС-адрес и включить функцию спуфинга МАС адресов.

После ввода всей необходимой информации можно нажимать единственную кнопку «Prepare System for Exchange CAS», откинуться на спинку кресла и наслаждаться зрелищем (с), ну или налить себе чашечку кофе =).

3

Далее необходимо зайти в настройки сетевых подключений ncpa.cpl, нажать кнопку Alt и вызвать «Advanced» — «Advanced settings». Затем во вкладке «Adapter bindings» в окне «Connections» установить очерёдность использования сетевых адаптеров для сетевых сервисов системы. Первым должен быть установлен management интерфейс, затем — NLB интерфейс.
В свойствах NLB интерфейса нужно снять галочку со всех компонентов, кроме Network Load Balancing и TCP/IPv4. Также в свойствах TCP/IPv4 нужно снять галочку Register this connection’s address in DNS и выставить Disable NetBIOS over TCP/IP.

После всех этих шагов нужно перезагрузить сервер и поставить из Windows Update обновления для NetFramework.
Далее устанавливаем Exchange Server и последний Rollup (на момент написания заметки это rollup7 http://support.microsoft.com/kb/2961522/).

Далее все скрипты выполняются в Exchange Management Shell!

Теперь настало время создать CAS-массив, для этого подойдёт следующий скрипт:

$CASArrayName = Read-Host "Enter CAS Array FQDN"
$SiteName = Read-Host "Enter AD Site Name"
"Создаём Client Access Array"
New-ClientAccessArray -Fqdn $CASArrayName -Site $SiteName -Name $CASArrayName
"Прописываем ссылки на созданный массив"
Get-ClientAccessServer | Set-ClientAccessServer -AutoDiscoverServiceInternalUri "https://$CASArrayName/Autodiscover/Autodiscover.xml"
Get-WebServicesVirtualDirectory | Set-WebServicesVirtualDirectory -InternalNLBBypassUrl "https://$CASArrayName/EWS/Exchange.asmx"
$CAAObj = Get-ClientAccessArray | Where {$_.Name -eq $CASArrayName}
$CAAHosts = $CAAObj.Members | Select Name
Foreach ($CASHost in $CAAHosts)
{
$OWADirObj = Get-OwaVirtualDirectory -Server $CASHost.Name
Set-OwaVirtualDirectory -Identity $OWADirObj.Identity -InternalUrl "https://$CASArrayName/owa"
$ECPDirObj = Get-EcpVirtualDirectory -Server $CASHost.Name
Set-EcpVirtualDirectory -Identity $ECPDirObj.Identity -InternalUrl "https://$CASArrayName/ecp"
$AScDirObj = Get-ActiveSyncVirtualDirectory -Server $CASHost.Name
Set-ActiveSyncVirtualDirectory -Identity $AScDirObj.Identity -InternalUrl "https://$CASArrayName/Microsoft-Server-ActiveSync"
$OABDirObj = Get-OabVirtualDirectory -Server $CASHost.Name
Set-OabVirtualDirectory -Identity $OABDirObj.Identity -InternalUrl "http://$CASArrayName/OAB"
$WebDirObj = Get-WebServicesVirtualDirectory -Server $CASHost.Name
Set-WebServicesVirtualDirectory -Identity $WebDirObj.Identity -InternalUrl "https://$CASArrayName/EWS/Exchange.asmx"
}
"Прикрепляем все базы к CAS"
Get-MailboxDatabase | Set-MailboxDatabase -RpcClientAccessServer $CASArrayName

Далее останется только выпустить сертификат для созданного массива.

#Создаём переменную, записываем туда запрос на новый сертификат
$Data = New-ExchangeCertificate -Server CAHostFQDN -SubjectName “CN=MailArray,DC=Your2Domain,DC=Your1Domain” -generaterequest -friendlyname “Mailarray Cert” -domainname CASArrayFQDN,autodiscover.YourDomain,CASHostsFQDN,CASHostsNetBIOSName -PrivateKeyExportable $true
#Записываем значение переменной в файл
Set-Content -path “C:\EXcertreq.txt” -Value $Data
#Запрашиваем выпуск сертификата из ЦС с помощью утилиты certreq
certreq -attrib “CertificateTemplate:WebServer” -attrib “Exportable:TRUE” -submit C:\EXcertreq.txt C:\EXcert.cer
#Импортируем сгенерированный сертификат на сервер
Import-ExchangeCertificate -Server CAHostFQDN -FileData ([Byte[]]$(Get-Content -Path C:\EXcert.cer -Encoding byte -ReadCount 0))
#Записываем значения сертификата (который не является самоподписанным) в переменную
$thumb = Get-ExchangeCertificate -Server CAHostFQDN | ? {$_.IsSelfSigned -eq 0}
#Привязываем сертификат к сервису IIS (Exchange)
Enable-ExchangeCertificate -Server CAHostFQDN -thumbprint $thumb.thumbprint -services “IIS”

Здесь необходимо заменить значения, выделенные фиолетовым, своими. Также последнюю команду нужно выполнять отдельно. Поле SubjectName — это certificate common name, т.е. для кого будет выпущен сертификат (в примере это Mailarray.Your2Domain.Your1Domain).

Оставьте комментарий