如何在不指定InterfaceIndex的情况下使用New-NetRoute?

时间:2015-07-07 13:20:19

标签: powershell

如您所知,我们可以通过

在Windows中设置路由
route add xxx.xxx.xxx.xxx mask yyy.yyy.yyy.yyy zzz.zzz.zzz.zzz

并且OS决定使用哪个接口。现在,我想在PowerShell中使用命令

执行此操作
New-NetRoute –DestinationPrefix "xxx.xxx.xxx.xxx/yy" –InterfaceIndex w –NextHop zzz.zzz.zzz.zzz

这里的问题是InterfaceIndex在这里是强制性的,但我希望操作系统自己解决这个问题(就像在第一个命令中一样)。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

我自己从未玩过它,但有一个cmdlet可以满足您的目的。它被称为Find-NetRoute,它找到最佳的本地IP地址和到达远程地址的最佳路由。该信息作为NetIPAddress对象和NetRoute对象返回。两者都应包含系统选择的索引。目前仅在Windows Server 2012 R2和Windows 8.1上支持此功能。

一个简单的用途是提供一个远程地址。以下代码会将interfaceindex返回到变量$bestIndex,然后您可以将其用于New-NetRoute

$bestIndex = Find-NetRoute -RemoteIPAddress "123.456.789.012" | select -first 1  -expandproperty interfaceindex

New-NetRoute –DestinationPrefix "xxx.xxx.xxx.xxx/yy" –InterfaceIndex $bestIndex –NextHop zzz.zzz.zzz.zzz

我建议您在我链接的TechNet页面上阅读更多内容。我通过阅读New-NetRoute的工作方式找到了它。

答案 1 :(得分:0)

您可以使用Get-NetIPAddress获取您的IP地址以及InterfaceIndex属性,然后您可以将其导入New-NetRoute。您将不得不查询(ip_address& subnet_mask)是否等于您的(z.z.z.zz& subnet_mask)。示例函数如下所示:

function Add-NetRouteByDestination {
    param ([String]$destinationPrefix,[System.Net.IPAddress][ValidateNotNullOrEmpty()] $nextHop)
    $isipv6=$nextHop.AddressFamily -eq "InterNetworkV6" # thanks to type conversion
    if ($isipv6) {
        $af="IPv6"
    } else {
        $af="IPv4"
    } # address family filter
    # destination is expected to be "blabla/prefix", get prefix
    $ips=Get-NetIPAddress -AddressFamily $af
    $nhbytes=$nexthop.GetAddressBytes()
    $ifindex=0
    foreach ($ip in $ips) {
        $ipbytes=$ip.GetAddressBytes()
        $tmlen=$ip.prefixlength
        $matched=$true
        $index=0
        while ($tmlen -gt 0 -and $matched) {
            $b1=$ipbytes[$index]
            $b2=$nhbytes[$index]
            if ($tmlen -lt 8) {
                $bytemask=[byte](0,128,192,224,240,248,252,254)[$tmlen]
                $b1 = [byte]($b1 -band $bytemask)
                $b2 = [byte]($b2 -band $bytemask)
            }
            $matched=$b1 -eq $b2
            $index+=1
            $tmlen-=8
        } # a very stupid bitwise comparation
        if ($matched} { 
            $ifindex=$ip.interfaceindex 
            New-NetRoute –DestinationPrefix $destinationPrefix –InterfaceIndex $ifindex –NextHop $nextHop -ea stop
        } # this one matches gateway vs ip&mask, setting route
    }
}

警告,代码未经过测试,可能包含拼写错误。如果没有Find-NetRoute cmdlet可用,则此代码应该可用(Windows 8.0,Windows Server 2012)。