6

我找到了确定网络连接链接速度 ,现在我正在尝试将Win32_PerfRawData_Tcpip_NetworkInterface中的数据与 Win32_NetworkAdapter(或Win32_NetworkAdapterConfiguration)相关联。

在课堂上,Win32_PerfRawData_Tcpip_NetworkInterface我看不到任何可用于引用 Win32_NetworkAdapterConfigurationWin32_NetworkAdapter. I tried to use the命名inWin32_PerfRawData_Tcpip_NetworkInterface andWin32_NetworkAdapter 的索引或唯一键,但它们看起来仍然不同。

例如

名称:Intel(R) PRO/1000 PL 网络连接

对比

名称:Intel[R] PRO_1000 PL 网络连接

有什么提示吗?

先感谢您,

温和的

===

也许那段代码会帮助你帮助我:)

# 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
4

3 回答 3

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;
    }
}

输出:

=== 来自 Win32_NetworkAdapter ===
名称:Intel(R) PRO/无线 3945ABG 网络连接
规范名称:Intel_R__PRO_Wireless_3945ABG_Network_Connection

=== 来自 Win32_PerfRawData_Tcpip_NetworkInterface ===
名称:Intel[R] PRO_Wireless 3945ABG 网络连接 - 数据包调度程序微型端口
规范名称:Intel_R__PRO_Wireless_3945ABG_Network_Connection___Packet_Scheduler_Miniport
54000000
于 2009-12-02T14:44:06.450 回答
3

我只是用 WMI 工具查看了我的机器,因为我认为,它一定很容易...... ;-)
但它不是......

但我在我的机器上发现的是,“Win32_NetworkAdapter.Name”+“__”+“Win32_NetworkAdapter.InterfaceIndex”的串联导致“Win32_PerfFormattedData_Tcpip_NetworkInterface.Name=”NVIDIA nForce Networking Controller _2”[也考虑空间! ]。

我机器上的例子:

Win32_NetworkAdapter.DeviceID="13"
Win32_NetworkAdapter.NetConnectionID="本地连接 2"
Win32_NetworkAdapter.InterfaceIndex="2"
Win32_NetworkAdapter.Name="NVIDIA nForce 网络控制器"
Win32_PerfFormattedData_Tcpip_NetworkInterface="NVIDIA nForce 网络控制器_2"

我希望,我已经正确理解了您的问题,这可能会有所帮助?!

br--马布拉

于 2009-12-19T14:51:29.333 回答
1

我能找到的唯一方法是使用Win32_PnPEntity类来获取网络适配器的 DeviceName ,然后将其转换为InstanceName。这使您可以找到可以在其他 WMI 表上使用的键值(我使用了 InterfaceIndex,但在Win32_NetworkAdapter类中还有其他选择。

所以在高层次上:

  1. 获取 Win32_NetworkAdapter 的实例
  2. 使用以下两个WMI WQL 查询之一来获取 PnpEntity
  3. 通过替换将 Win32_PNPEntity.Name 转换为 InstanceName:
    1. ( 和 [
    2. ) 和 ]
    3. # \ / 全部带 _
  4. 使用该 InstanceName 查询Win32_PerfFormattedData_Tcpip_NetworkInterface

这非常复杂,但由于 InstanceName 是从 PnPEntity Name 派生的,所以这是我能找到的获得准确映射的唯一方法。

以下是我能够获取 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'
于 2014-11-13T22:36:27.497 回答