解析Windows 2008的DNSName

时间:2016-01-09 00:30:27

标签: powershell powershell-v2.0

我有一个适用于Windows 2012的脚本(PowerShell v4),但它也适用于Windows 2008(PowerShell v2),相当于cmdlet" Resolve-DNSName"对于Windows 2008?

Resolve-DnsName -Name client01 -Server server01

我知道nslookup的存在相同,这就是我想要的cmdlet(单行,我的部分无需输入)

nslookup
server server01
client01

以下适用于DNS解析,但缺少-server参数:

[Net.DNS]::GetHostEntry("MachineName")

由于

3 个答案:

答案 0 :(得分:2)

不幸的是,在Windows 8.1或Server 2012中的版本4之前的PowerShell中没有办法原生地执行此操作。但是有.NET方法:

https://stackoverflow.com/a/8227917/4292988

PowerShell中最简单的解决方案是调用nslookup,并清理输出

&nslookup.exe client01 server01

我从原始示例中删除了select-string,但是它更少用于

你发布的功能在我的后面运行得不是很好,并且永远不会在PowershellV2中工作,直到v3才支持[PSCustomObject]。此外,如果您发送通常返回单个地址的DNS查询,则不返回任何内容。对于具有别名的查询,它返回ipaddress应该位于的别名。测试Resolve-DnsName2008 -name www.stackoverflow.com -server 8.8.8.8

以下是一个应该按照你的要求做的功能,至少对于ipv4addresses:

function Resolve-DnsName2008
{
    Param
    (
        [Parameter(Mandatory=$true)]
        [string]$Name,
        [string]$Server = '127.0.0.1'
    )
    Try
    {
        $nslookup = &nslookup.exe $Name $Server
        $regexipv4 = "^(?:(?:0?0?\d|0?[1-9]\d|1\d\d|2[0-5][0-5]|2[0-4]\d)\.){3}(?:0?0?\d|0?[1-9]\d|1\d\d|2[0-5][0-5]|2[0-4]\d)$"

        $name = @($nslookup | Where-Object { ( $_ -match "^(?:Name:*)") }).replace('Name:','').trim()

        $deladdresstext = $nslookup -replace "^(?:^Address:|^Addresses:)",""
        $Addresses = $deladdresstext.trim() | Where-Object { ( $_ -match "$regexipv4" ) }

        $total = $Addresses.count
        $AddressList = @()
        for($i=1;$i -lt $total;$i++)
        {
            $AddressList += $Addresses[$i].trim()
        }

        $AddressList | %{

        new-object -typename psobject -Property @{
            Name = $name
            IPAddress = $_
            }
        }
    }
    catch 
    { }
}

答案 1 :(得分:0)

我使用此代码每行输入一个FQDN并输出相应的IP。

x.append(int(splitUp[0]))

答案 2 :(得分:-1)

问题在于,如果我使用:

&nslookup.exe client01 server01 | select-string "Name", "Addresses"

它只会显示第一条记录,在我的情况下,我找到了5条记录,只显示了一条记录。

我发现的解决方案非常有效:

function Resolve-DNSName2008
{
    Param
    (
        [string]$Name,
        [string]$Server
    )

    $nslookup = &nslookup.exe $Name $Server

    $name = [string]($nslookup | Select-String "Name")
    $nameClean = ([regex]::match($name,'(?<=:)(.*\n?)').value).Trim()

    $addresses = (([regex]::match($nslookup,'(?<=Addresses:)(.*\n?)').value).Trim()).Split(' ')
    $addressesClean = $addresses.Split('',[System.StringSplitOptions]::RemoveEmptyEntries) | Sort-Object

    $addressesClean | %{

        [PSCustomObject]@{
            Name = $nameClean
            IPAddress = $_
        }
    }

}

用法:

Resolve-DNSName2008 -Name server.domain.com -Server 10.0.0.0

输出:

Name            IPAddress      
----            ---------      
server.domain.com 10.0.0.1
server.domain.com 10.0.0.2    
server.domain.com 10.0.0.3  
server.domain.com 10.0.0.4
server.domain.com 10.0.0.5