Win32_NetworkAdapter.Index和Win32_IP4RouteTable.InterfaceIndex不匹配

时间:2017-12-08 06:23:18

标签: powershell wmi powershell-v2.0

我正在编写一个脚本,用于更新Windows 7计算机上的DNS服务器列表,以获取为默认路由传递流量的接口。

我选择了

的路线表条目
$defaultgw_routes = Get-WMIObject Win32_IP4RouteTable | 
    Where-Object {$_.Destination -eq "0.0.0.0"}

并假设使用Win32_NetworkAdapterConfiguration获得的接口列表位于$interfaces变量中,定义为

$interfaces = Get-WmiObject Win32_NetworkAdapterConfiguration

我希望在$route.InterfaceIndex -eq $interface.Index条件下加入这两个列表。但是我注意到索引不匹配。

路由表具有以下接口定义:

C:\Users\user01>route print if 11
===========================================================================
Interface list
  ....
 13...08 00 27 8d 7e 19 ......Intel(R) PRO/1000 MT #2
 11...08 00 27 a4 16 ad ......Intel(R) PRO/1000 MT
 12...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
  ...

但是$interface列表有

ServiceName      : E1G60
Description      : Intel(R) PRO/1000 MT
Index            : 7

ServiceName      : tunnel
Description      : Tunnel adapter Microsoft Teredo
Index            : 11

ServiceName      : E1G60
Description      : Intel(R) PRO/1000 MT #2
Index            : 13

在两个列表Intel(R) PRO/1000 MT #2中都有索引13,但Intel(R) PRO/1000 MT在一个列表中为11,在另一个列表中为7。这种“七一一”差异可能是什么原因?

InterfaceIndex属性的description我预计索引应该匹配。

  

InterfaceIndex

     

此路由的下一跳的IP地址。此属性中的值与InterfaceIndex属性中的值相同   Win32_NetworkAdapter和。的实例   表示网络接口的Win32_NetworkAdapterConfiguration   该路线的下一跳。

2 个答案:

答案 0 :(得分:2)

以下代码段显示了使用-in comparison operator加入两个列表的可能方法。

$filterDest = "Destination = '0.0.0.0'" 
$defaultgw_routes = Get-WMIObject Win32_IP4RouteTable -Filter $filterDest
$filterIPA  = "IPEnabled = True"
$interfaces = Get-WmiObject Win32_NetworkAdapterConfiguration -Filter $filterIPA

'### interfaces ###'
$interfaces | 
    Where-Object {$_.InterfaceIndex -in $defaultgw_routes.Interfaceindex } |
       Select-Object [a-z]* -ExcludeProperty PSComputerName, Scope, Path, Options, 
           ClassPath, Properties, SystemProperties, Qualifiers, Site, Container
'### routes ###'
$defaultgw_routes | 
    Where-Object {$_.InterfaceIndex -in $interfaces.Interfaceindex } | 
       Select-Object [a-z]* -ExcludeProperty PSComputerName, Scope, Path, Options, 
           ClassPath, Properties, SystemProperties, Qualifiers, Site, Container

请注意

  • 使用适当的Where-Object参数替换-Filter的管道,以指定用作过滤器的 Where子句。使用WMI Query Language (WQL)
  • 的语法 添加
  • 管道到Select-Object只是为了避免重复输出众所周知的属性。

答案 1 :(得分:1)

我认为您现在应该检查一下以了解它们之间的区别:

$interfaces = Get-WmiObject Win32_NetworkAdapterConfiguration | select InterfaceIndex, Index
$defaultgw_routes = Get-WMIObject Win32_IP4RouteTable |?{$_.Destination -eq "0.0.0.0"} | Select InterfaceIndex,Index

$interfaces 
$defaultgw_routes