Назад | Перейти на главную страницу

Двойные подсети для сайта (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 сообщество, я хотел попытать счастья здесь. Если это противоречит правилам, я удалю свой вопрос.

Во-первых, наличие двух отдельных списков с соответствующими парами ключ-> значение не так уж и хорошо, но давайте с этим поработаем.

Текущая условная логика вашего скрипта никогда не обнаружит существующие подсети. $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

ЗАЧЕМ?!?! Какой в ​​этом смысл? Как сказал Зоредаш, это не работает. У вас не может быть двух сайтов с одинаковым именем.

Вот я пытаюсь добавить сайт под названием Arlington, когда у меня уже есть сайт под названием Arlington:

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