Я хотел бы использовать инструмент командной строки для вывода списка настроенных вторичных серверов (основной) зоны, если таковые имеются.
Dnscmd близок к:
dnscmd server /ZoneResetSecondaries:[list of secondaries]
Но я не хочу портить текущие настройки, я просто хочу их просмотреть. PowerShell (даже на Server 2012), похоже, не помогает.
Спасибо.
Просто чтобы оставить альтернативу и без того отличному ответу Матиаса, вот однострочник, который работает с любой версией Powershell:
PS C:\> Get-WmiObject MicrosoftDNS_Zone -Namespace Root\MicrosoftDNS `
-ComputerName DC01 | Where ZoneType -EQ 1 | `
Select ContainerName, SecondaryServers
(Значения ZoneType для справки: http://msdn.microsoft.com/en-us/library/cc448936.aspx)
Изменить: Да, если вы используете более старую версию PS <3, измените второй элемент в конвейере на
| Where { $_.ZoneType -EQ 1 } |
Вы наиболее правы в том, что можете:
Я раньше написано о разборе dnscmd
вывод с помощью PowerShell, и это должно выполнить шаг 1:
function Get-DNSZones
{
param(
[String]$ComputerName = "."
)
$enumZonesExpression = "dnscmd $ComputerName /enumzones"
$dnscmdOut = Invoke-Expression $enumZonesExpression
if(-not($dnscmdOut[$dnscmdOut.Count - 2] -match "Command completed successfully."))
{
Write-Error "Failed to enumerate zones"
return $false
}
else
{
# The output header can be found on the fifth line:
$zoneHeader = $dnscmdOut[4]
# Let's define the the index, or starting point, of each attribute:
$d1 = $zoneHeader.IndexOf("Zone name")
$d2 = $zoneHeader.IndexOf("Type")
$d3 = $zoneHeader.IndexOf("Storage")
$d4 = $zoneHeader.IndexOf("Properties")
# Finally, let's put all the rows in a new array:
$zoneList = $dnscmdOut[6..($dnscmdOut.Count - 5)]
# This will store the zone objects when we are done:
$zones = @()
# Let's go through all the rows and extrapolate the information we need:
foreach($zoneString in $zoneList)
{
$zoneInfo = @{
Name = $zoneString.SubString($d1,$d2-$d1).Trim();
ZoneType = $zoneString.SubString($d2,$d3-$d2).Trim();
Storage = $zoneString.SubString($d3,$d4-$d3).Trim();
Properties = @($zoneString.SubString($d4).Trim() -split " ")
}
$zoneObject = New-Object PSObject -Property $zoneInfo
$zones += $zoneObject
}
return $zones
}
}
Теперь вы можете перечислить все основные зоны с помощью:
Get-DNSZones|Where-Object {$_.ZoneType -eq 'Primary'}
Затем вы можете использовать массив Zone для автоматизации поиска всех основных зон:
$PrimaryZones = Get-DNSZones|Where-Object {$_.ZoneType -eq 'Primary'}
$PrimaryZones |% {$out = iex "dnscmd . /ZoneInfo $($_.ZoneName) |find `"Zone Secondaries`" "; "$($_.ZoneName) = $out"}