Двойные подсети для сайта (AD)
Я пытаюсь создать подсети на существующих сайтах, загруженных из файла.txt. Мой код выглядит так:
<#Add subnets to matching sites#>
$i=0
foreach($_ in $subnetList){
$currentSites = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites
if($currentSites.Subnets -match $_){
continue
}else{
New-ADReplicationSubnet -Name $_ -Site $siteList[$i]
$i++
}
}
$subnetList и $siteList иметь следующий контент:
$subnetList =
10.0.0.0/21
10.0.5.0/21
10.0.9.0/24
10.0.11.0/24
10.0.14.0/24
10.0.19.0/24
<#SITENAME1 has 2 occurences.#>
$siteList =
SITENAME1
SITENAME1
SITENAME2
SITENAME3
SITENAME4
SITENAME5
Проблема, с которой я сталкиваюсь, состоит в том, что, когда SITENAME1 добавляет первую подсеть, он возвращает ошибку со второй попытки:
New-ADReplicationSubnet : An attempt was made to add an object to the directory
with a name that is already in use
Есть ли способ добавить дополнительную подсеть на этот сайт? Technet рассказывает о -Instance переключатель. Я не уверен, как реализовать это, я боюсь.
РЕДАКТИРОВАТЬ: Я также задавал этот же вопрос на StackOverflow безрезультатно. Видя, что это, возможно, скорее сообщество, ориентированное на Active Directory, я хотел попытать счастья здесь. Если это противоречит правилам, я удалю свой вопрос.
2 ответа
Прежде всего, наличие двух отдельных списков с соответствующими парами ключ -> значение не так уж и привлекательно, но давайте с этим поработаем.
Текущая условная логика вашего скрипта никогда не обнаружит существующие подсети. $currentSites всегда будет набор сайтов, а не один объект сайта. Коллекция не имеет Subnets Параметр и инструкция всегда будут возвращать false, так как всегда $null и один всегда является строкой.
Получение полного списка сайтов на каждой итерации занимает много времени и не нужно, давайте попробуем поработать с данными, которые у нас уже есть
С индексом n в $siteList массив всегда соответствует индексу n в $subnetList массив, давайте использовать обычный цикл for с общим счетчиком $n:
for ($n = 0; $n -lt $subnetList.Count; $n++)
{
// Let's see if the subnet exists, and what site it's assigned to
$existingSubnet = Get-ADReplicationSubnet $subnetList[$n] -Properties Site -ErrorAction SilentlyContinue
if(-not($existingSubnet))
{
// None exist already, go ahead
New-ADReplicationSubnet $subnetList[$n] -Site $siteList[$n]
}
else
{
if(($existingSubnet.Site).ToString() -ne $siteList[$n])
{
// It exists but not in the right site
Set-ADReplicationSubnet $subnetList[$n] -Site $siteList[$n]
}
}
}
Сделайте себе одолжение, объедините два файла в один файл CSV. Тогда вы можете использовать foreach все, что ты хочешь:-)
Пример CSV через точку с запятой (SitesNSubnets.csv):
Subnet;SiteName
10.0.0.0/21;SITENAME1
10.0.5.0/21;SITENAME1
10.0.9.0/24;SITENAME2
10.0.11.0/24;SITENAME3
10.0.14.0/24;SITENAME4
10.0.19.0/24;SITENAME5
А потом использовать Import-CSV импортировать это:
$data = Import-CSV -Path .\SitesNSubnets.csv -Delimiter ";"
foreach ($entry in $data)
{
Write-Host "This is the subnet: " + $entry.Subnet + " and this is the corresponding site: " $entry.SiteName
}
Объект подсети, когда он связан с объектом сайта, сообщает как Active Directory, так и рядовому серверу, к какому сайту принадлежит членский сервер домена.
Вы не можете добавить дубликаты объектов подсети в Active Directory.
Вы не можете связать объект подсети с несколькими сайтами.
Вы можете использовать объекты подсети, которые содержат перекрывающееся адресное пространство.
Если ваши серверы не используют какую-либо форму квантовой физики ИТ, о которой я не знаю, то нет смысла для сервера одновременно принадлежать как сайту "Майами", так и сайту "Далласа", не так ли?
Что вы можете сделать, это определить более мелкие, более конкретные подсети в большей подсети для разных сайтов. Например, вы можете назначить подсеть 10.0.0.0/8 для Далласа, а затем вы можете назначить 10.2.0.0/16 для Майами. Active Directory будет иметь приоритет для более конкретной подсети. Вы даже можете добавить объект подсети /32 в Active Directory, если хотите заставить один конкретный хост проходить аутентификацию на определенном сайте.
<#SITENAME1 has 2 occurences.#>
$siteList =
SITENAME1
SITENAME1
ЗАЧЕМ?!?! Какой смысл это имеет? Как сказал Зоредаче, это сломано. У вас не может быть двух сайтов с одинаковым именем.
Вот я пытаюсь добавить сайт с именем Арлингтон, когда у меня уже есть сайт с именем Арлингтон:

Здесь я определяю несколько объектов подсети, все они связаны с одним сайтом, из которых как подсеть 10.1.2.64/26, так и сеть 10.0.0.0/24 помещаются в 10.0.0.0/8 'supernet:'
