views:

421

answers:

2

Hi,

I found Determining the network connection link speed and now I am trying to correlate the data from Win32_PerfRawData_Tcpip_NetworkInterface with Win32_NetworkAdapter (or Win32_NetworkAdapterConfiguration).

On the class Win32_PerfRawData_Tcpip_NetworkInterface I don't see any index or unique key that I can use to reference Win32_NetworkAdapterConfiguration or Win32_NetworkAdapter. I tried to use the Name in Win32_PerfRawData_Tcpip_NetworkInterface and Win32_NetworkAdapter`, but still they look different.

e.g.

Name: Intel(R) PRO/1000 PL Network Connection

vs

Name: Intel[R] PRO_1000 PL Network Connection

Any hints?

Thank you in advance,

Milde

===

Maybe that piece of code will help you to help me guys :)

# 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
+1  A: 

OK. Thanks for posting the short script. While you were working on that, I was following a different track using DBD::WMI and digging through the docs to see if you had missed anything.

I could not find a better way (there must be one) than canonicalizing the names:

#!/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;
    }
}

Output:

=== 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
Sinan Ünür
@Milde I know, there **must** be a better way.
Sinan Ünür
thank you Sinan. Your code will work as long as ($canonperfname =~ /^$canonname/) is true :) .Unfortunately, I wont be able to use "DBD::WMI", but that's not the problem. This "simple" task drives me crazy...Hoping for more suggestions.
Milde
@Milde Looking at the pages returned by http://www.google.com/search?q=Win32_PerfRawData_Tcpip_NetworkInterface I see that this is a commonly recurring issue and *some* kind of canonicalization of the name seems to be the only solution. You could use some character that is unlikely to occur as part of the name such as `chr(254)` instead of `_` when canonicalizing and strip off the ` - Packet Scheduler Miniport` so that you can use `eq`.
Sinan Ünür
The `DBD::WMI` part is not necessary. I just used it to get off the ground because I wanted to minimize the amount of docs I needed to lookup (your sample code was not available when I started working on this).
Sinan Ünür
@Sinan: I recalculated your reputation, as requested. It actually went up a few points! Don't see that often. :)
Bill the Lizard
@Bill the Lizard: Thanks. I had thought it would have gone down as well.
Sinan Ünür
A: 

Hi !

I just looked to my machine withe the WMI-Tools, because I thought, it must be easy ... ;-)
but it's not ...

But what I found on my machine was, the a concatenantion of the "Win32_NetworkAdapter.Name" + " __" + "Win32_NetworkAdapter.InterfaceIndex" results in the "Win32_PerfFormattedData_Tcpip_NetworkInterface.Name="NVIDIA nForce Networking Controller _2" [Regard the space too!].

Example from my machine:

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"

I hope, I've understood your question right and this may help?!

br--mabra

mabra