2009-12-02 23 views
6

encontré Determining the network connection link speed y ahora estoy tratando de correlacionar los datos de Win32_PerfRawData_Tcpip_NetworkInterface con Win32_NetworkAdapter (o Win32_NetworkAdapterConfiguration).Obtener vínculo velocidad - Win32_PerfRawData_Tcpip_NetworkInterface

En la clase Win32_PerfRawData_Tcpip_NetworkInterface no veo ningún índice o clave única que puedo usar para hacer referencia Win32_NetworkAdapterConfiguration o Win32_NetworkAdapter. I tried to use the Nombre in Win32_PerfRawData_Tcpip_NetworkInterface and Win32_NetworkAdapter`, pero todavía tienen un aspecto distinto.

p. Ej.

Nombre: Intel (R) PRO/1000 PL Red Conexión

vs

Nombre: Intel [R] PRO_1000 PL Red Conexión

Cualquier consejos?

gracias de antemano,

Milde

===

Tal vez ese trozo de código ayudará a que me ayudes chicos :)

# 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

Se puede publicar un pequeño script en Perl que muestra cómo se obtiene la información? Tal como está, hay muy poca información útil en su publicación en términos de ayudar a otros que no están trabajando en el mismo problema a comenzar. Ni siquiera nos dice qué cadena de adaptador proviene de qué fuente, etc. Podría intentar normalizar las cadenas convirtiendo todos los caracteres que no son palabras en '_', pero sería un último recurso. –

+0

Agregó un código, espero que ayude. Pensé en comodines también, pero parece un poco inseguro para mí. – Milde

+0

Creo que es un poco tarde ... pero hay algunas notas sobre cómo nombrar convenciones en http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.instancename(v=vs.110) .aspx - "Si el nombre de la instancia se genera automáticamente y puede contener los caracteres" (",") "," # "," \ "o"/", utilice la asignación de caracteres en la siguiente tabla." Sin embargo, esto no ayudará a mapear nombres locos como isatap. {GUID} o sufijos de índice. – mikalai

Respuesta

4

OK. Gracias por publicar el guion corto. Mientras trabajabas en eso, estaba siguiendo una pista diferente usando DBD::WMI y revisando los documentos para ver si te perdiste algo.

no pude encontrar una mejor manera (debe haber uno) que se canonizan los nombres:

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

Salida:

 
=== 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 sé, ** debe ** ser una mejor manera. –

+1

gracias Sinan. Su código funcionará siempre que ($ canonperfname = ~/^ $ canonname /) sea verdadero :). Lamentablemente, no podré usar "DBD :: WMI", pero ese no es el problema. Esta tarea "simple" me vuelve loco ... Esperando más sugerencias. – Milde

+0

@Milde Mirando las páginas devueltas por http://www.google.com/search?q=Win32_PerfRawData_Tcpip_NetworkInterface Veo que este es un problema recurrente y * algún tipo de canonización del nombre parece ser la única solución. Puede usar algún carácter que no sea probable que ocurra como parte del nombre, como 'chr (254)' en lugar de '_' al canonicalizar y quitarle el' - Packet Scheduler Miniport' para que pueda usar 'eq'. –

3

Yo miraba a mi máquina withe las WMI-Tools, porque pensé, debe ser fácil ... ;-)
pero no es ...

Pero lo que encontré en mi máquina fue, la concatenación de la " Win32_NetworkAdapter.Name "+" __ "+" Win32_NetworkAdapter.InterfaceIndex " resultados en el" Win32_PerfFormattedData_Tcpip_NetworkInterface.Name = "NVIDIA nForce Networking Controller _2" [¡Considere el espacio también!].

Ejemplo de mi máquina:

 
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" 

espero, he entendido su pregunta correcta y esto puede ayudar ?!

br - Mabra

+0

Esto no siempre funciona, ya que interfaceindex no siempre coincide con el nombre del dispositivo Plug and Play –

1

El único enfoque pude encontrar fue utilizar la clase Win32_PnPEntity para obtener el DeviceName para el adaptador de red, luego convertirlo en el InstanceName. Esto permite encontrar un valor de clave que se puede utilizar en otras mesas de WMI (utilicé InterfaceIndex, pero hay otras opciones en la clase Win32_NetworkAdapter

lo tanto a un alto nivel:.

  1. obtener una instancia de Win32_NetworkAdapter
  2. Utilice uno de los dos de abajo WMI WQL queries para obtener el PnpEntity
  3. Convertir el Win32_PNPEntity.Name en el nombreDeInstancia mediante la sustitución:
    1. (con [
    2. ) con]
    3. # \/todos con _
  4. uso que nombreDeInstancia para consultar la clase Win32_PerfFormattedData_Tcpip_NetworkInterface

Es bastante complicado, pero desde nombreDeInstancia se derrived del Nombre PnPEntity, esa es la única forma que pude encontrar para obtener asignaciones precisas.

Estas son las dos maneras que fue capaz de obtener la instancia PnPEntity para 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' 
Cuestiones relacionadas