我正在尝试在从 .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 的社区,我想在这里试试运气。如果这违反规则,我会删除我的问题。
答案1
首先,拥有 2 个带有相应键->值对的单独列表并不是那么好,但让我们使用它。
脚本的当前条件逻辑永远不会检测到现有子网。$currentSites
将始终是站点的集合,而不是单个站点对象。该集合没有Subnets
参数,语句将始终返回 false,因为 one 始终是$null
, one 始终是字符串。
每次迭代都检索整个站点列表既耗时又不必要,让我们尝试使用已有的数据
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
}
答案2
当子网对象链接到站点对象时,它会告诉 Active Directory 和成员服务器域成员服务器属于哪个站点。
您不能将重复的子网对象添加到 Active Directory。
您不能将子网对象链接到多个站点。
你能利用包含重叠地址空间的子网对象。
除非您的服务器使用我不知道的某种 IT 量子物理学,否则服务器同时属于“迈阿密”站点和“达拉斯”站点是没有意义的,不是吗?
您可以做的是将较大的子网中的较小、更具体的子网定义到不同的站点。例如,您可以将 10.0.0.0/8 子网分配给达拉斯,然后将 10.2.0.0/16 分配给迈阿密。Active Directory 将优先考虑更具体的子网。如果您想强制某个特定主机向特定站点进行身份验证,您甚至可以将 /32 子网对象添加到 Active Directory。
<#SITENAME1 has 2 occurences.#>
$siteList =
SITENAME1
SITENAME1
为什么?!?!这有什么意义?正如 Zoredache 所说,这有问题。你不能有两个同名的网站。
当我已经有一个名为 Arlington 的站点时,我尝试添加一个名为 Arlington 的站点:
这里我定义了几个子网对象,它们都链接到同一个站点,其中 10.1.2.64/26 子网和 10.0.0.0/24 网络都位于 10.0.0.0/8“超网”内: