Скорость соединения - Win32_PerfRawData_Tcpip_NetworkInterface - PullRequest
6 голосов
/ 02 декабря 2009

Я нашел Определение скорости соединения с сетью и теперь я пытаюсь сопоставить данные Win32_PerfRawData_Tcpip_NetworkInterface с Win32_NetworkAdapter (или Win32_NetworkAdapterConfiguration ).

В классе Win32_PerfRawData_Tcpip_NetworkInterface Я не вижу ни одного индекс или уникальный ключ, который я могу использовать для ссылки Win32_NetworkAdapterConfiguration или Win32_NetworkAdapter. I tried to use the Имя in Win32_PerfRawData_Tcpip_NetworkInterface and Win32_NetworkAdapter`, но все равно они выглядят по-разному.

, например

Название: Intel (R) PRO / 1000 PL Network Подключение

против

Название: Intel [R] PRO_1000 PL Network Подключение

Есть подсказки?

Заранее спасибо,

Milde

===

Может быть, этот кусок кода поможет вам, ребята, мне помочь:)

# I got the DeviceID of a NIC and use it to get the "NetConnection ID":

$objWMIService = Win32::OLE->GetObject("winmgmts:\\\\$computer\\root\\CIMV2") or die "Exit: WMI connection failed. \n";
$colNicSetts = $objWMIService->ExecQuery(
              "SELECT * FROM Win32_NetworkAdapter Where DeviceID = '$ID'", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly);

foreach my $objItem (in $colNicSetts){
    $NetConnID = $objItem->{NetConnectionID};    
}

# => $NetConnID stores "Intel(R) PRO/1000 PL Network Connection".
# Now I tried to get the Link Speed with sth. like that:

$collItems = $objWMIService->ExecQuery(
             "SELECT * FROM Win32_PerfRawData_Tcpip_NetworkInterface Where Name = '$NetConnID'", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly);
foreach my $objItem (in $collItems){
    $LinkSpeed = $objItem->{CurrentBandwidth};
}
# "Win32_PerfRawData_Tcpip_NetworkInterface" contains "Intel[R] PRO_1000 PL Network" Connection
# "Intel(R) PRO/1000 PL Network Connection" != Intel[R] PRO_1000 PL Network Connection
# => $LinkSpeed empty

Ответы [ 3 ]

4 голосов
/ 02 декабря 2009

OK. Спасибо за публикацию короткого сценария. Пока вы работали над этим, я следовал по другой дорожке, используя DBD :: WMI и копая документы, чтобы увидеть, пропустили ли вы что-нибудь.

Я не мог найти лучший способ (должен быть), чем канонизировать имена:

#!/usr/bin/perl

use strict; use warnings;

use DBI;
use Data::Dumper;

my $computer = '.';
($computer) = @ARGV if @ARGV;

my $dbh = DBI->connect("dbi:WMI:$computer", undef, undef,
    { RaiseError => 1},
);

print "=== From Win32_NetworkAdapter ===\n";

my $name = $dbh->selectall_arrayref(
    'SELECT * FROM Win32_NetworkAdapter WHERE DeviceID = 11'
)->[0]->[0]->{Name};

(my $canonname = $name) =~ s/[^A-Za-z0-9]/_/g;

print "Name: $name\nCanonical name: $canonname\n\n";

my $sth = $dbh->prepare(
    'SELECT * FROM Win32_PerfRawData_Tcpip_NetworkInterface'
);

$sth->execute;

print "=== From Win32_PerfRawData_Tcpip_NetworkInterface ===\n";

while (defined (my $adapter = $sth->fetchrow_arrayref )) {
    my $conf = $adapter->[0];
    my $perfname = $conf->{Name};
    (my $canonperfname = $perfname) =~ s/[^A-Za-z0-9]/_/g;
    if ( $canonperfname =~ /^$canonname/ ) {
        print "Name: $perfname\nCanonical name: $canonperfname\n";
        print $conf->{CurrentBandwidth}, "\n\n";
        last;
    }
}

Выход:

=== From Win32_NetworkAdapter ===
Name: Intel(R) PRO/Wireless 3945ABG Network Connection
Canonical name: Intel_R__PRO_Wireless_3945ABG_Network_Connection

=== From Win32_PerfRawData_Tcpip_NetworkInterface ===
Name: Intel[R] PRO_Wireless 3945ABG Network Connection - Packet Scheduler Miniport
Canonical name: Intel_R__PRO_Wireless_3945ABG_Network_Connection___Packet_Scheduler_Miniport
54000000
3 голосов
/ 19 декабря 2009

Я только что посмотрел на свою машину с WMI-Tools, потому что я думал, что это должно быть легко ...; -)
но это не так ...

Но то, что я нашел на своей машине, было объединением "Win32_NetworkAdapter.Name" + "__" + "Win32_NetworkAdapter.InterfaceIndex" приводит к "Win32_PerfFormattedData_Tcpip_NetworkInterface.Name =" Сетевой контроллер NVIDIA nForce _2 "[Относительно места тоже!].

Пример с моей машины:

Win32_NetworkAdapter.DeviceID="13"
Win32_NetworkAdapter.NetConnectionID="Local Area Connection 2"
Win32_NetworkAdapter.InterfaceIndex="2"
Win32_NetworkAdapter.Name="NVIDIA nForce Networking Controller"
Win32_PerfFormattedData_Tcpip_NetworkInterface="NVIDIA nForce Networking Controller _2"

Надеюсь, я правильно понял ваш вопрос, и это может помочь?!

ш - mabra

1 голос
/ 14 ноября 2014

Единственный подход, который мне удалось найти, - это использовать класс Win32_PnPEntity для получения DeviceName для сетевого адаптера, а затем преобразовать его в InstanceName . Это позволяет вам найти значение ключа, которое вы можете использовать в других таблицах WMI (я использовал InterfaceIndex, но есть другие варианты в Win32_NetworkAdapter классе.

Итак, на высоком уровне:

  1. Получить экземпляр Win32_NetworkAdapter
  2. Используйте один из двух приведенных ниже WMI WQL-запросов , чтобы получить PnpEntity
  3. Преобразуйте Win32_PNPEntity.Name в InstanceName, заменив:
    1. (с [
    2. ) с]
    3. # \ / все с _
  4. Используйте это имя экземпляра для запроса Win32_PerfFormattedData_Tcpip_NetworkInterface класса

Это довольно запутанно, но поскольку InstanceName получено из имени PnPEntity, это единственный способ найти точные сопоставления.

Вот два способа получить экземпляр PnPEntity для NetworkAdapter:

ASSOCIATORS OF {Win32_NetworkAdapter.DeviceID='12'} WHERE ResultClass=Win32_PnPEntity

SELECT * FROM Win32_PNPEntity where DeviceID='PCI\\VEN_14E4&DEV_1684&SUBSYS_1309103C&REV_10\\4&11050A08&0&00E5'
...