Маршруты связанные с nics - PullRequest
       3

Маршруты связанные с nics

0 голосов
/ 23 апреля 2020

Я использую

Get-WmiObject Win32_IP4PersistedRouteTable

для получения постоянных записей маршрута, мне нужно связать эти записи маршрута с интерфейсом, с которым они связаны, любой способ вернуть NI C для каждого корреспондента постоянный маршрут?

Спасибо.

1 Ответ

0 голосов
/ 24 апреля 2020

Это не проблема или ограничение кода PowerShell. Это ограничение. Net. В этом классе нет свойства, позволяющего идентифицировать связанный интерфейс NI C.

Win32_IP4PersistedRouteTable

Операционная система сохраняет постоянные маршруты в реестре ... Этот класс применим только к IPv4 и не возвращает данные IPX или IPv6.

[dynamic, provider("RouteProvider"), UUID("{2CAF4666-AC9B-45AB-00A6-AF8C537794C2}"), SupportsCreate, CreateBy("PutInstance"), SupportsDelete, DeleteBy("DeleteInstance"), AMENDMENT]
class Win32_IP4PersistedRouteTable : CIM_LogicalElement
{
  string   Caption; # This property is inherited from CIM_ManagedSystemElement.
  string   Description;
  string   Destination;
  datetime InstallDate;
  string   Mask;
  sint32   Metric1;
  string   Name;
  string   NextHop;
  string   Status;
};

Обновление по нашей ветке ниже

Итак, ваш запрос ...

'в любом случае, чтобы вернуться NI C для каждого сохраняемого маршрута корреспондента? '

... ответ, как я уже сказал, мне неизвестен, используя только то, что вы показываете. Вы должны получить эти данные и сравнить их с другими результатами других сетевых командлетов.

IPv6 и IPv4 Поддержка в WMI

WMI IP Route Provider и сеть классы предоставляют данные для адресов IPv4. Начиная с Windows Vista, WMI также предоставляет ограниченную поддержку сетевых возможностей IPv6.

Данные IP WMI Следующие классы предоставляют только данные IPv4:

  • Win32_IP4RouteTable

  • Win32_IP4PersistedRouteTable

  • Win32_IP4RouteTableEvent

  • Win32_ActiveRoute

  • Win32_NetworkAdapter

PowerShell, несмотря на это. Ключевые свойства доступны для чтения.

VBSCript

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_IP4PersistedRouteTable",,48)

Dim objItem 'as Win32_IP4PersistedRouteTable
For Each objItem in colItems
    WScript.Echo "Caption: " & objItem.Caption
    WScript.Echo "Description: " & objItem.Description
    WScript.Echo "Destination: " & objItem.Destination
    WScript.Echo "InstallDate: " & objItem.InstallDate
    WScript.Echo "Mask: " & objItem.Mask
    WScript.Echo "Metric1: " & objItem.Metric1
    WScript.Echo "Name: " & objItem.Name
    WScript.Echo "NextHop: " & objItem.NextHop
    WScript.Echo "Status: " & objItem.Status
    WScript.Echo ""
Next

Свойство Mask As string (только для чтения)

Свойство Mask содержит маску, используемую в этой постоянной записи , Маски должны иметь логическое AND с адресом назначения перед сравнением со значением в поле ipRouteDest.

Свойство NextHop As string (только для чтения)

Свойство NextHop содержит IP-адрес следующий прыжок этого постоянного маршрута. (В случае маршрута, привязанного к интерфейсу, который реализуется через широковещательную среду, значением этого поля является IP-адрес агента на этом интерфейсе.).

Инструменты в Windows (route, netsh, et c ...) используйте классы, чтобы делать то, что они делают.

Вы можете просто проанализировать команду печати маршрута, если в ней есть информация, которую вы ищете для:

Cmd.exe (DOS) инструментов для объекта PowerShell

$tmpRoute = (route print | ? { $_.trimstart() -like "0.0.0.0*" }).split() | ? { $_ }

$route = @{
            'Destination' = $tmpRoute[0];
            'Netmask'     = $tmpRoute[1];
            'Gateway'     = $tmpRoute[2];
            'Interface'   = $tmpRoute[3];
            'Metric'      = $tmpRoute[4];
          }

$route

WMI извлекает его непосредственно с компьютера (локального или удаленного):

$computer = 'localhost'
$wmi = get-wmiobject -namespace root\StandardCimv2 -computername 'localhost' -Query "Select * from MSFT_NetRoute"
$wmi | ? { $_.DestinationPrefix -eq '0.0.0.0/0' } | 
Select DestinationPrefix, InterfaceAlias, InterfaceIndex, InterfaceMetric, NextHop, RouteMetric

См. Этот скрипт ...

... показывая прямые вызовы WMI в это пространство имен ...

# WMI data
$wmi_routes = Get-WmiObject @WMIHast -Class win32_ip4RouteTable
$wmi_persistedroutes = Get-WmiObject @WMIHast -Class win32_IP4PersistedRouteTable
foreach ($iproute in $wmi_routes)
{
    $Persistant = $false
    foreach ($piproute in $wmi_persistedroutes)
    {
        if (($iproute.Destination -eq $piproute.Destination) -and
            ($iproute.Mask -eq $piproute.Mask) -and
            ($iproute.NextHop -eq $piproute.NextHop))
        {
            $Persistant = $true
        }
    }
    $RouteProperty = @{
        'InterfaceIndex' = $iproute.InterfaceIndex
        'Destination' = $iproute.Destination
        'Mask' = $iproute.Mask
        'NextHop' = $iproute.NextHop
        'Metric' = $iproute.Metric1
        'Persistent' = $Persistant
        'Type' = $RouteType[[int]$iproute.Type]
    }
    $Routes += New-Object -TypeName PSObject -Property $RouteProperty
}
...

Или даже используя этот класс для прямой установки постоянных маршрутов.

# Set objWMIClass = objWMIServices.Get (cWMIIPPersistedRouteClass)
$class = gwmi -list win32_ip4persistedroutetable -EnableAll -Computer remotehost1

#Set objWMIPersistentInstance = objWMIClass.SpawnInstance_
$newroute = $class.CreateInstance()

#objWMIPersistentInstance.Destination = strDestination
$newroute.Destination = $destination

#objWMIPersistentInstance.Mask = strMask
$newroute.Mask = $mask

#objWMIPersistentInstance.NextHop = strNextHop
$newroute.NextHop = $nexthop

#objWMIPersistentInstance.Metric1 = intMetric
$newroute.Metric1=$metric

$newroute.Put()

$newroute.Destination='10.10.10.101'
$newroute.Mask='255.255.255.0'
$newroute.NextHop='10.10.10.1'
$newroute.Metric1=30

$newroute.Put()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...