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
Namein
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
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
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
The only approach I was able to find was to use the Win32_PnPEntity class to get the DeviceName for the network adapter, then convert it into the InstanceName. This allows you to find a key value that you can use on other WMI tables (I used InterfaceIndex, but there are other choices in the Win32_NetworkAdapter class.
So at a high level:
- Get an instance of Win32_NetworkAdapter
- Use one of the two below WMI WQL queries to get the PnpEntity
- Convert the Win32_PNPEntity.Name into the InstanceName by replacing:
- ( with [
- ) with ]
- # \ / all with _
- Use that InstanceName to query the
Win32_PerfFormattedData_Tcpip_NetworkInterface
class
It is pretty convoluted, but since InstanceName is derrived from the PnPEntity Name, that is the only way I could find to get accurate mappings.
Here are the two ways I was able to get the PnPEntity instance for a 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'