Используем Active Directory PowerShell для управления сайтами – Часть 1 (New-XADSite)
На этот раз я хочу представить вам решение для управления сайтами в лесу Active Directory (AD), расширяя Active Directory PowerShell путем реализации функций, позволяющих создавать, искать, обновлять (изменять связь сайтов, переименовывать) и удалять сайты.
Прежде всего, необходимо понять, для чего создаются сайты AD. Можно сказать, что сайт AD представлен тремя объектами служб каталогов и ссылками в атрибутах других объектов (например, объекта Site Link – связь сайтов). Если точнее, сайт AD состоит из:
1. Объекта site (objectClass=site), который в иерархии расположен ниже объекта sites в разделе конфигурации.
2. Объекта NTDSsitesettings (objectClass=nTDSSiteSettings), который является дочерним объектом объекта site
3. Объекта servers containers (objectClass=serversContainer), который является дочерним объектом объекта site
4. Значения в многозначном атрибуте siteList объекта sitelink, представляющего связь сайтов.
В первую очередь, необходимо знать различительное имя (DN – distinguished name) контейнера sites. Этот объект имеет относительное различительное имя (RDN - relative distinguished name) Sites и расположен непосредственно ниже контекста именования конфигурации. Итак, получить DN контейнера sites можно следующим образом:
$configNCDN = (Get-ADRootDSE).ConfigurationNamingContext
$sitesContainerDN = ("CN=Sites," + $configNCDN)
Новый объект site станет объектом внутри контейнера sites:
$newSiteDN = ("CN=" + $newSiteName +"," + $sitesContainerDN)
Для создания объектов Site, NTDS Site Settings и Servers внутри контейнера Sites, можно использовать командлет New-ADObject:
New-ADObject -Name $newSiteName -Path $sitesContainerDN -Type site
New-ADObject -Name "NTDS Site Settings" -Path $newSiteDN -Type nTDSSiteSettings
New-ADObject -Name "Servers" -Path $newSiteDN -Type serversContainer
Далее, для добавления сайта в связь сайтов необходима ссылка на объект сайта. Ссылки на объект сайта (site link objects) расположены ниже объекта внутрисайтового транспорта (inter-site transport object) (IP или SMTP). Например, для связи сайтов DEFAULTIPSITELINK контейнер связей сайтов будет расположен так:
$siteLinkContainer = ("CN=DEFAULTIPSITELINK,CN=IP,CN=Inter-Site Transports,CN=Sites," + $configNCDN)
Последний шаг – это добавление сайта к связи сайтов путем включения имени сайта в атрибут siteList в соответствующем объекте связи сайтов. Для изменения атрибута siteList в объекте связи сайтов, необходимо сначала получить объект связи сайтов с атрибутом siteList с помощью командлета Get-ADObject (для создания экземпляра), а затем изменить его с помощью командлета Set-ADObject:
$siteLink = Get-ADObject $siteLinkContainer -Properties siteList
$siteLink.siteList.Add($newSiteDN)
Set-ADObject -Instance $siteLink
Вот так оно будет выглядеть.
Я создал функцию по имени New-XADSite, которая принимает имя сайта и имя объекта связи сайтов (поддерживается протокол IP, но для поддержки SMTP требуется совсем немного изменений). Она также содержит проверки особых случаев, которые обеспечивают более надежную работу для использования функции в лесах AD. В будущем, я покажу вам, как в AD PowerShell создать функции для получения имен сайтов в лесу, перемещения сайта в другую связь сайтов, переименования сайта и удаления сайта из леса AD. Обратите внимание, что скрипт использует функцию Test-XADObject, которая представлена в предыдущем посте.
1: function New-XADSite() {
2: [CmdletBinding(ConfirmImpact="Low")]
3: Param (
4: [Parameter(Mandatory=$true,
5: Position=0,
6: ValueFromPipeline=$true,
7: HelpMessage="Идентификатор создаваемого сайта. В этой версии скрипта, имя – единственный допустимый идентификатор сайта."
8: )]
9: [Object] $Identity,
10: [Parameter(Mandatory=$false,
11: Position=1,
12: ValueFromPipeline=$false,
13: HelpMessage="Имя объекта связи сайтов, к которому будет относиться сайт."
14: )]
15: [Object] $SiteLinkName
16: )
17:
18: BEGIN {
19:
20: }
21:
22: PROCESS {
23:
24: # В этой версии скрипта, имя сайта – единственный поддерживаемый идентификатор
25: # Измените строку ниже для поддержки других идентификаторов
26: $newSiteName = $Identity
27:
28: if ([String]::IsNullOrEmpty($newSiteName)) {
29: throw New-Object System.Management.Automation.PSArgumentException("Имя сайта не может быть пустым. Пожалуйста, укажите правильное имя сайта.")
30: }
31:
32: if ($SiteLinkName -eq $null) {
33: $SiteLinkName = "DEFAULTIPSITELINK"
34: }
35:
36: # Получаем DN раздела конфигурации, контейнера sites и создаем DN нового сайта
37: $configNCDN = (Get-ADRootDSE).ConfigurationNamingContext
38: $sitesContainerDN = ("CN=Sites," + $configNCDN)
39: $newSiteDN = ("CN=" + $newSiteName +"," + $sitesContainerDN)
40:
41: $siteLinkContainerDN = ("CN=" + $SiteLinkName + ",CN=IP,CN=Inter-Site Transports,CN=Sites," + $configNCDN)
42: # Проверяем, существует ли связь сайтов
43: $siteLinkExists = Test-XADObject -Identity $siteLinkContainerDN
44: if ($siteLinkExists -eq $false) {
45: throw New-Object System.Management.Automation.RuntimeException("Указанная связь сайтов не существует. Пожалуйста, укажите имя существующей связи сайтов.")
46: }
47:
48: # Проверяем, существует ли сайт
49: $siteExists = Test-XADObject -Identity $newSiteDN
50: if ($siteExists) {
51: throw New-Object System.Management.Automation.RuntimeException("Сайт с таким именем уже существует. Для создания нового сайта, укажите имя сайта, которое не используется.")
52: }
53: else {
54: $siteObjectCreated = $false
55:
56: trap [Exception] {
57: # Ошибки выводим в конвейер
58: Write-Host $_
59:
60: # Убираем объекты, созданные для совместимости
61: if ($siteObjectCreated -eq $true) {
62: Remove-ADObject -Identity $newSiteDN -Recursive -Confirm:$false
63: }
64:
65: # Выдаем новое исключение, куда включаем созданные исключения в качестве внутренних исключений
66: throw New-Object System.Management.Automation.RuntimeException("При создании сайта возникло исключение. Подробности см. во внутренних исключениях.", $_.Exception)
67: }
68:
69: # Создаем объекты сайта, Параметры NTDS и объекты серверов
70: New-ADObject -Name $newSiteName -Path $sitesContainerDN -Type site
71: $siteObjectCreated = $true
72: New-ADObject -Name "NTDS Site Settings" -Path $newSiteDN -Type nTDSSiteSettings
73: New-ADObject -Name "Servers" -Path $newSiteDN -Type serversContainer
74:
75: $siteLink = Get-ADObject $siteLinkContainerDN -Properties siteList
76: $numberOfSitesInSiteLink = $siteLink.siteList.Add($newSiteDN)
77: Set-ADObject -Instance $siteLink
78:
79: # Возвращает объекты службы каталогов, которые создают сайт AD
80: Get-ADObject -Identity $newSiteDN
81: Get-ADObject -Identity ("CN=NTDS Site Settings," + $newSiteDN)
82: Get-ADObject -Identity ("CN=Servers," + $newSiteDN)
83: }
84:
85: }
86:
87: END {
88:
89: }
90: }
Наслаждайтесь,
Джайро Кадена (Jairo Cadena)
Active Directory
Перевод: Илья Лушников