2009-12-02 51 views
6

我发现Determining the network connection link speed ,现在我想将数据从Win32_PerfRawData_Tcpip_NetworkInterfaceWin32_NetworkAdapter(或Win32_NetworkAdapterConfiguration的)相关。获取链接速度 - Win32_PerfRawData_Tcpip_NetworkInterface

在课程Win32_PerfRawData_Tcpip_NetworkInterface我看不出有任何 索引或唯一的关键,我可以使用引用 Win32_NetworkAdapterConfigurationWin32_NetworkAdapter. I tried to use the名称in Win32_PerfRawData_Tcpip_NetworkInterface and Win32_NetworkAdapter`,但他们仍然看起来不同。

例如

名称:英特尔(R)PRO/1000 PL网络 连接

VS

名称:英特尔[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

你可以发布短Perl脚本,告诉您如何得到这些信息?事实上,在帮助那些不在同一问题上工作的人开始工作时,你的帖子中很少有用的信息。您甚至不会告诉我们哪个适配器字符串来自哪个来源等等。您可以尝试通过将所有非单词字符转换为'_'来对字符串进行规范化,但这是最后的手段。 – 2009-12-02 13:33:51

+0

添加了一些代码,希望它有帮助。我也想过通配符,但对我来说似乎有点不安全。 – Milde 2009-12-02 14:26:48

+0

我相信,这有点晚...但是有关于命名约定的一些注意事项,请参见http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.instancename(v = vs.110 ).aspx - “如果实例名称是自动生成的并且可能包含字符”(“,”)“,”#“,”\“或”/“,请使用下表中的字符映射。但是,这无助于映射像isatap,{GUID}或索引后缀这样的疯狂名称。 – mikalai 2014-09-30 21:43:12

回答

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

@Milde我知道,那里**必须是更好的方法。 – 2009-12-02 15:09:39

+1

谢谢你思南。只要($ canonperfname =〜/^$ canonname /)为真,你的代码就会工作:)。 不幸的是,我不能使用“DBD :: WMI”,但这不是问题。这个“简单”的任务让我发疯...... 希望得到更多的建议。 – Milde 2009-12-02 15:11:31

+0

@Milde查看http://www.google.com/search?q=Win32_PerfRawData_Tcpip_NetworkInterface返回的页面我发现这是一个经常出现的问题,并且*名称的某种规范化似乎是唯一的解决方案。在规范化和剥离' - Packet Scheduler Miniport'时,你可以使用一些不太可能出现的字符作为名称的一部分,如'chr(254)'而不是'_',这样你就可以使用'eq'。 – 2009-12-02 15:25:22

3

我只是看着我的机器枝条的WMI的工具,因为我认为,这一定很容易...... ;-)
但它不是...

但是我在我的机器上发现的是,一个concatenantion的“ 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

+0

这并不总是奏效,因为interfaceindex并不总是与即插即用设备名称相匹配 – 2014-11-13 22:22:40

1

唯一的办法我能找到是使用Win32_PnPEntity类来获得网络适配器的设备名称,然后将其转换成InstanceName。这可以让你发现,你可以在其他WMI表使用(我用InterfaceIndex,但也有在Win32_NetworkAdapter类其他选择的关键值

所以在较高的水平。

  1. 获取一个实例的Win32_NetworkAdapter
  2. 使用两个以下WMI WQL queries通过更换得到PnpEntity
  3. 转换的Win32_PNPEntity.Name到实例名称之一:
    1. (与[
    2. )用]
    3. #\ /所有_
  4. 使用实例名称来查询Win32_PerfFormattedData_Tcpip_NetworkInterface

这是很令人费解,但由于InstanceName是从PnPEntity名称derrived,这是我能找到准确映射的唯一途径。

这里有两种方法我能得到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'