Enumerar os atributos da Zona do Servidor DNS do Windows via shell

3

Gostaria de usar uma ferramenta de linha de comando para listar os servidores secundários configurados da zona (principal), se houver.

O Dnscmd chega perto de:

dnscmd server /ZoneResetSecondaries:[list of secondaries]

Mas, não quero estragar as configurações atuais, só quero revisá-las. O PowerShell (mesmo no Server 2012) não parece ajudar.

Obrigado.

    
por jcarpio 15.04.2014 / 18:03

2 respostas

4

Você está mais correto porque pode:

  1. Enumere as zonas e procure as "Primárias"
  2. Recuperar informações da zona para cada zona

Eu anteriormente escrevi sobre a análise de dnscmd de saída usando o PowerShell, e isso deve cumprir a etapa 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
    }
}

Agora você pode listar todas as zonas primárias com:

Get-DNSZones|Where-Object {$_.ZoneType -eq 'Primary'}

Você pode usar o array Zone para automatizar a pesquisa de todas as zonas primárias:

$PrimaryZones = Get-DNSZones|Where-Object {$_.ZoneType -eq 'Primary'}
$PrimaryZones |% {$out = iex "dnscmd . /ZoneInfo $($_.ZoneName) |find '"Zone Secondaries'" "; "$($_.ZoneName) = $out"}
    
por 15.04.2014 / 18:18
4

Só para deixar uma alternativa à já ótima resposta de Mathias, aqui está um verso que funciona com qualquer versão do Powershell:

PS C:\> Get-WmiObject MicrosoftDNS_Zone -Namespace Root\MicrosoftDNS '
          -ComputerName DC01 | Where ZoneType -EQ 1 | '
          Select ContainerName, SecondaryServers

(valores ZoneType para referência: link )

Edite: Duh, se estiver usando uma versão mais antiga do PS < 3, mude o segundo elemento no pipeline para

| Where { $_.ZoneType -EQ 1 } |

    
por 16.04.2014 / 02:32