我找到了Determining the network connection link speed 现在我试图关联 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`,但它们看起来仍然不同。
e.g。
名称:英特尔(R)PRO / 1000 PL网络 连接
VS
名称:Intel [R] PRO_1000 PL网络 连接
任何提示?
提前谢谢你,
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
答案 0 :(得分:4)
行。感谢您发布短脚本。当你正在研究这个问题时,我正在使用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
答案 1 :(得分:3)
我只是用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"
我希望,我理解你的问题,这可能有所帮助?!
BR - mabra
答案 2 :(得分:1)
我能找到的唯一方法是使用Win32_PnPEntity类获取网络适配器的DeviceName,然后将其转换为InstanceName。这允许您找到可以在其他WMI表上使用的键值(我使用了InterfaceIndex,但Win32_NetworkAdapter类中还有其他选项。
所以在高层:
Win32_PerfFormattedData_Tcpip_NetworkInterface
类它非常复杂,但由于InstanceName来自PnPEntity名称,这是我能找到获得准确映射的唯一方法。
以下是我能够获得NetworkAdapter的PnPEntity实例的两种方法:
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'