如您所知,我们可以通过
在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
在这里是强制性的,但我希望操作系统自己解决这个问题(就像在第一个命令中一样)。我怎么能这样做?
答案 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)。