Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
На этот раз я хочу представить вам решение для управления сайтами в лесу 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
Перевод: Илья Лушников