Двойные подсети для сайта (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:'

введите описание здесь

Другие вопросы по тегам