2009-12-02 4 views
6

ho trovato Determining the network connection link speed e ora sto cercando di correlare i dati da Win32_PerfRawData_Tcpip_NetworkInterface con Win32_NetworkAdapter (o Win32_NetworkAdapterConfiguration).Get Link Speed ​​- Win32_PerfRawData_Tcpip_NetworkInterface

sulla classe Win32_PerfRawData_Tcpip_NetworkInterface non vedo alcun indice o chiave unica che posso usare per fare riferimento Win32_NetworkAdapterConfiguration o Win32_NetworkAdapter. I tried to use the Nome in Win32_PerfRawData_Tcpip_NetworkInterface and Win32_NetworkAdapter`, ma ancora hanno un aspetto diverso.

ad es.

Nome: Intel (R) PRO/1000 PL rete connessione

vs

Nome: Intel [R] PRO_1000 PL rete connessione

Qualsiasi suggerimenti?

Grazie in anticipo,

Milde

===

Forse quel pezzo di codice vi aiuterà mi aiuti ragazzi :)

# 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

di poter inviare un breve script Perl che mostra come ottenere le informazioni? Così com'è, ci sono pochissime informazioni utili nel tuo post in termini di aiutare gli altri che non stanno lavorando sullo stesso problema per iniziare. Non ci si dice nemmeno quale stringa dell'adattatore proviene da quale fonte ecc. Si potrebbe provare a normalizzare le stringhe convertendo tutti i caratteri non word in '_', ma questa sarebbe l'ultima risorsa. –

+0

Aggiunto un po 'di codice, spero che aiuti. Ho pensato anche ai caratteri jolly, ma mi sembra un po 'non sicuro. – Milde

+0

Credo, è un po 'tardi ... ma ci sono alcune note sulla convenzione di denominazione su http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.instancename(v=vs.110) .aspx - "Se il nome dell'istanza viene generato automaticamente e potrebbe contenere i caratteri" (",") "," # "," \ "o"/", utilizzare la mappatura dei caratteri nella seguente tabella." Tuttavia questo non aiuterà a mappare nomi pazzi come isatap. {GUID} o suffissi indice. – mikalai

risposta

4

OK. Grazie per aver pubblicato la sceneggiatura. Mentre stavi lavorando a questo, stavo seguendo una traccia diversa usando DBD::WMI e scavando attraverso i documenti per vedere se avevi perso qualcosa.

non ho potuto trovare un modo migliore (ci deve essere uno) rispetto canonicalizing i nomi:

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

uscita:

 
=== 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 lo so, ci ** deve ** essere un modo migliore. –

+1

grazie Sinan. Il tuo codice funzionerà fintanto che ($ canonperfname = ~/^ $ canonname /) è vero :). Sfortunatamente, non sarò in grado di usare "DBD :: WMI", ma non è questo il problema. Questo "semplice" compito mi fa impazzire ... Sperando in ulteriori suggerimenti. – Milde

+0

@Milde Guardando le pagine restituite da http://www.google.com/search?q=Win32_PerfRawData_Tcpip_NetworkInterface vedo che questo è un problema comune e ricorrente * * qualche sorta di canonica del nome sembra essere l'unica soluzione. Si potrebbe usare un po 'di carattere che è improbabile che si verifichi come parte del nome, come 'chr (254)' invece di '_' quando canonicalizing e togliere la' - Utilità di pianificazione pacchetti Miniport' in modo da poter usare 'eq'. –

3

Ho appena guardato alla mia macchina Withe le WMI-Tools, perché ho pensato, deve essere facile ... ;-)
ma non è ...

ma quello che ho trovato sulla mia macchina era, l'un concatenantion del " Win32_NetworkAdapter.Name "+" __ "+" Win32_NetworkAdapter.InterfaceIndex " risultati in" Win32_PerfFormattedData_Tcpip_NetworkInterface.Name = "NVIDIA nForce Networking Controller _2" [Riguarda anche lo spazio!].

Esempio dalla mia macchina:

 
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" 

spero, ho capito la tua domanda giusta e questo può aiutare ?!

br - Mabra

+0

Questo non sempre funziona, in quanto interfaceindex non corrisponde sempre al nome del dispositivo Plug and Play –

1

L'unico approccio sono stato in grado di trovare è stato quello di utilizzare la classe Win32_PnPEntity per ottenere il DeviceName per la scheda di rete, quindi convertirlo in InstanceName. Questo ti permette di trovare un valore chiave che è possibile utilizzare su altri tavoli WMI (io ho usato InterfaceIndex, ma ci sono altre scelte nella classe Win32_NetworkAdapter

Così a un livello elevato:.

  1. ottenere un'istanza di Win32_NetworkAdapter
  2. utilizzare uno dei due sotto WMI WQL queries per ottenere il PnpEntity
  3. Convertire il Win32_PNPEntity.Name nella InstanceName sostituendo:
    1. (con [
    2. ) con]
    3. # \/tutti con _
  4. Usa che InstanceName di interrogare la Win32_PerfFormattedData_Tcpip_NetworkInterface classe

E 'abbastanza contorto, ma dal momento che InstanceName è derrived dal nome PnPEntity, questo è l'unico modo che ho trovato per ottenere mappature accurate.

Qui ci sono i due modi sono stato in grado di ottenere l'istanza PnPEntity per un 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'