2009-12-02 29 views
6

Ben Determining the network connection link speed buldum ve şimdi Win32_NetworkAdapter (veya Win32_NetworkAdapterConfiguration) ile Win32_PerfRawData_Tcpip_NetworkInterfaceveri ilişkilendirmek için çalışıyorum. Bağlantı Hızı al - Win32_PerfRawData_Tcpip_NetworkInterface

sınıfa Win32_PerfRawData_Tcpip_NetworkInterface ben herhangi endeksi ya da ben Win32_NetworkAdapterConfiguration veya Win32_NetworkAdapter. I tried to use the Adı in Win32_PerfRawData_Tcpip_NetworkInterface and Win32_NetworkAdapter` başvurmak için kullanabilirsiniz benzersiz bir anahtar görmüyorum, ama yine de farklı görünümdedir.

örn.

Adı: Intel (R) PRO/1000 PL Ağ Bağlantı

vs ismi: Intel [R] PRO_1000 PL Ağ Bağlantı

Herhangi ipuçları?

Belki o kod parçasının bana siz yardımcı yardımcı olacaktır, önceden

===

Milde teşekkür ederiz :)

# 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

Eğer bilgi almak gösterir kısa Perl gönderebilir miyim: Burada

Bir NetworkAdapter için PnPEntity örneğini elde edebildi iki yolu vardır? Olduğu gibi, aynı sorun üzerinde çalışmayan diğer kişilere yardımcı olmak açısından yayınınızda çok az yararlı bilgiler vardır. Hangi bağdaştırıcı dizgisinin hangi kaynaktan geldiğini bile söylemezsiniz. Tüm sözcük olmayan karakterleri "_" ile dizge haline getirerek dizeleri normalleştirmeyi deneyebilirsiniz, ancak bu son çare olur. –

+0

Bazı kodlar eklendi, umarım yardımcı olur. Ben de jokeyleri düşündüm ama benim için biraz güvensiz görünüyor. – Milde

+0

İnanıyorum, biraz geç oldu ... ama http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.instancename(v=vs.110 adresinden kongre adlandırma hakkında bazı notlar var.) .aspx - "Örnek adı otomatik olarak oluşturulursa ve" (",") "," # "," \ "veya"/"karakterlerini içerebilirse, aşağıdaki tablodaki karakter eşlemesini kullanın." Ancak bu, isatap. {GUID} veya dizin sonekleri gibi çılgın isimleri haritalamaya yardımcı olmaz. – mikalai

cevap

4

Tamam. Kısa senaryoyu gönderdiğiniz için teşekkürler. Üzerinde çalışırken, DBD::WMI'u kullanarak farklı bir yol izliyordum ve hiçbir şeyi kaçırıp kaçırmadığınızı görmek için dokümanlar arasında dolaşıyordum.

İsimleri standart hale daha (bir olmalı) daha iyi bir yol bulamadı:

Çıktı
#!/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; 
    } 
} 

: Sadece benim makineye baktım

 
=== 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 Biliyorum, orada ** daha iyi bir yol olmalı **. –

+1

Teşekkür ederim Sinan. Kodunuz ($ canonperfname = ~/^ $ canonname /) doğru olduğu sürece çalışacaktır :). Ne yazık ki, "DBD :: WMI" kullanamayacağım, ama sorun bu değil. Bu "basit" görev beni çıldırtıyor ... Daha fazla öneride bulunmak dileğiyle. – Milde

+0

@Milde http://www.google.com/search?q=Win32_PerfRawData_Tcpip_NetworkInterface tarafından döndürülen sayfalara baktığımın, bunun genel olarak yinelenen bir sorun olduğunu görüyorum ve * ismin bir tür kanonikleştirilmesi tek çözüm gibi görünüyor. "Eq" yi kullanabilmeniz için '- Packet Scheduler Miniport 'i kurarken ve kestikten sonra' _' yerine 'ch' (chrom) gibi ismin bir parçası olarak ortaya çıkması olası olmayan bazı karakterleri kullanabilirsiniz. –

3

WMI-Tools withe, çünkü düşündüm, kolay olmalı ... ;-)
ama bu ...

Ama makinemde bulduğum şey, " Win32_NetworkAdapter.Name "+" __ "+" Win32_NetworkAdapter.InterfaceIndex " ," Win32_PerfFormattedData_Tcpip_NetworkInterface.Name = "NVIDIA nForce Ağ Denetleyicisi _2" ile sonuçlanır [Boşluğa bakın!]. Benim makineden

Örnek: Umarım

 
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" 

, şu sorunuzu anladım ve bu yardımcı olabilir ?!

br - mabra

+0

Bu, her zaman işe yaramaz, çünkü interfaceindex her zaman Tak ve Kullan aygıt adıyla eşleşmiyor –

1

ben bulabildim sadece bir yaklaşım daha sonra InstanceName dönüştürmek, ağ adaptörü için DeviceName almak için Win32_PnPEntity sınıfını kullanmaktı. Bu size (ben InterfaceIndex kullanılır, ancak Win32_NetworkAdapter sınıftaki diğer seçenekler vardır diğer WMI tabloları kullanabileceğiniz bir anahtar değeri bulmanızı sağlar

Yani yüksek bir düzeyde.

  1. bir örneğini alın Win32_NetworkAdapter
  2. kullanımı değiştirerek PnpEntity
  3. InstanceName içine Win32_PNPEntity.Name dönüştürme almak için WMI WQL queries altında iki kişiden biri:
    1. (ile [
    2. )
    3. # \/tüm kullan
  4. _ ile] ile ınstancename, Win32_PerfFormattedData_Tcpip_NetworkInterface sınıf

Oldukça dolambaçlı, ama ınstancename PnPEntity Name derrived beri sorgulamak için bu doğru eşleştirmeler elde etmenin tek yolu budur.

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'