Jaa


Используем 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

 

Оригинал

Перевод: Илья Лушников