2009-12-02 109 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'