2009-12-02 2 views
6

을 나는 Determining the network connection link speed 을 발견하고 지금은 에서는 Win32_NetworkAdapter (또는 에서는 Win32_NetworkAdapterConfiguration)와 Win32_PerfRawData_Tcpip_NetworkInterface에서 데이터의 상관 관계를 위해 노력하고 있어요. 링크 속도 얻기 - Win32_PerfRawData_Tcpip_NetworkInterface

클래스 Win32_PerfRawData_Tcpip_NetworkInterface에 나는 어떤 인덱스 또는 내가 Win32_NetworkAdapterConfiguration 또는 Win32_NetworkAdapter. I tried to use the 이름 in Win32_PerfRawData_Tcpip_NetworkInterface and Win32_NetworkAdapter`를 참조하는 데 사용할 수있는 고유 키가 표시되지 않습니다,하지만 여전히 서로 다른 모양.

이름 : 인텔 (R) PRO/1000 PL 네트워크 연결

대 이름 : 인텔 (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

당신이 정보를 얻을 방법을 보여줍니다 짧은 펄 스크립트를 게시 할 수 : 여기

내가 NetworkAdapter입니다에 대한 PnPEntity 인스턴스를 얻을 수 있었던 두 가지 방법이있다? 그대로, 같은 문제에 종사하지 않는 다른 사람들을 돕는 측면에서 게시물에 유용한 정보가 거의 없습니다. 어떤 어댑터 문자열이 어떤 소스에서 왔는지 알려주지 않습니다. 단어가 아닌 모든 문자를 '_'로 변환하여 문자열을 정규화 해 볼 수도 있지만 최후의 수단이 될 것입니다. –

+0

일부 코드가 추가되어 도움이 되었기를 바랍니다. 나는 와일드 카드에 대해서도 생각했다. 그러나 그것은 나를 위해 약간 안전하지 않은 것처럼 보인다. – Milde

+0

나는 약간 늦었다 고 믿는다. 그러나 http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.instancename(v=vs.110)에서 명명 규칙에 관한 몇 가지주의 사항이있다.) .aspx - "인스턴스 이름이 자동으로 생성되고"(",") ","# ","\ "또는"/ "문자가 포함될 수있는 경우 다음 표의 문자 매핑을 사용하십시오. 그러나 이것은 isatap. {GUID} 나 인덱스 접미사와 같은 미친 이름을 매핑하는 데 도움이되지 않습니다. – mikalai

답변

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 나는 더 나은 방법이되어야한다. –

+1

신안 감사합니다. 코드는 ($ canonperfname = ~/^ $ canonname /)이 참일 때만 작동합니다 :). 불행히도 "DBD :: WMI"를 사용할 수는 없지만 문제는 아닙니다. 이 "단순한"작업은 나를 미치게 만듭니다. 더 많은 제안을 원합니다. – Milde

+0

@Milde http://www.google.com/search?q=Win32_PerfRawData_Tcpip_NetworkInterface에 의해 반환 된 페이지를 보면 이것이 일반적으로 반복되는 문제이며 이름의 일부 정규화가 유일한 해결책 인 것으로 나타났습니다. '- 패킷 스케줄러 미니 포트 '를 표준화하고 제거 할 때'_' 대신'chr (254)'와 같은 이름의 일부로 나타날 가능성이없는 문자를 사용하여'eq'를 사용할 수 있습니다. –

3

는 WMI-도구를가는 가지, 생각했기 때문에 ...--)
그러나

하지만 내 컴퓨터에서 발견 한 것은 " Win32_NetworkAdapter.Name "+"__ "+"Win32_NetworkAdapter.InterfaceIndex " 결과는"Win32_PerfFormattedData_Tcpip_NetworkInterface.Name = "NVIDIA nForce Networking Controller _2"[공간에 대해서도!]입니다. 내 컴퓨터에서

예 : I 희망

 
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가 항상 플러그 앤 플레이 장치 이름과 일치하지 않기 때문에 항상 작동하지는 않습니다. –

1

내가 찾을 수 있었던 유일한 방법은 다음 InstanceName로 변환, 네트워크 어댑터의 장치 이름을 얻기 위해 Win32_PnPEntity 클래스를 사용하는 것이 었습니다. 이것은 당신이 (내가 InterfaceIndex을 사용하지만, Win32_NetworkAdapter 클래스의 다른 선택이 다른 WMI 테이블에 사용할 수있는 키 값을 찾을 수 있습니다

을 따라서 높은 수준에서 :.

  1. 인스턴스를 가져옵니다 에서는 Win32_NetworkAdapter
  2. 의 사용 대체하여 PnpEntity
  3. 인스턴스 이름으로 Win32_PNPEntity.Name 변환을 얻을 WMI WQL queries 아래 두 가지 중 하나를
    1. (과 [
    2. )
    3. # \/모든 사용
  4. _와]와 인스턴스 이름은 Win32_PerfFormattedData_Tcpip_NetworkInterface 클래스

그것은 꽤 복잡하지만, 인스턴스 이름이 PnPEntity 이름에서 derrived 때문에를 조회하는 그 그것은 정확한 매핑을 얻기 위해 찾을 수있는 유일한 방법입니다.

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'