6

ネットワーク接続のリンク速度の決定が見つかりました。今、 Win32_PerfRawData_Tcpip_NetworkInterface からのデータを Win32_NetworkAdapter (またはWin32_NetworkAdapterConfiguration ) と関連付けようとしています。

クラスには、 Win32_PerfRawData_Tcpip_NetworkInterface Win32_NetworkAdapterWin32_PerfRawData_Tcpip_NetworkInterfaceを参照 Win32_NetworkAdapterConfigurationまたはWin32_NetworkAdapter. I tried to use the名前付けするために使用できるインデックスまたは一意のキーは表示されませんが、それでもそれらは異なって見えます。in and

例えば

名前: Intel(R) PRO/1000 PL ネットワーク コネクション

名前: Intel[R] PRO_1000 PL ネットワーク接続

ヒントはありますか?

前もって感謝します、

マイルド

===

たぶん、そのコードはあなたが私を助けるのに役立つでしょう:)

# 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
4

3 に答える 3

4

わかった。短いスクリプトを投稿していただきありがとうございます。あなたがそれに取り組んでいる間、私はDBD :: WMIを使用して別のトラックをたどり、ドキュメントを掘り下げて、何かを見逃していないかどうかを確認していました。

名前を正規化するよりも良い方法(1つあるはずです)を見つけることができませんでした:

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

出力:

===Win32_NetworkAdapterから===
名前:Intel(R)PRO /Wireless3945ABGネットワ​​ーク接続
正規名:Intel_R__PRO_Wireless_3945ABG_Network_Connection

===Win32_PerfRawData_Tcpip_NetworkInterfaceから===
名前:Intel [R]PRO_Wireless3945ABGネットワ​​ーク接続-パケットスケジューラミニポート
正規名:Intel_R__PRO_Wireless_3945ABG_Network_Connection ___ Packet_Scheduler_Miniport
54000000
于 2009-12-02T14:44:06.450 に答える
3

WMI-Tools を使って自分のマシンを調べたところ、簡単に違いないと思ったので... ;-)
しかし、そうではありません...

しかし、私が自分のマシンで見つけたのは、「Win32_NetworkAdapter.Name」+「__」+「Win32_NetworkAdapter.InterfaceIndex」の連結により、「Win32_PerfFormattedData_Tcpip_NetworkInterface.Name="NVIDIA nForce Networking Controller _2" [スペースも考慮してください! ]。

私のマシンからの例:

Win32_NetworkAdapter.DeviceID="13"
Win32_NetworkAdapter.NetConnectionID="ローカル エリア接続 2"
Win32_NetworkAdapter.InterfaceIndex="2"
Win32_NetworkAdapter.Name="NVIDIA nForce ネットワーク コントローラー"
Win32_PerfFormattedData_Tcpip_NetworkInterface="NVIDIA nForce ネットワーク コントローラー _2"

私はあなたの質問を正しく理解しているといいのですが、これが役立つかもしれません?!

br--マブラ

于 2009-12-19T14:51:29.333 に答える
1

私が見つけた唯一の方法は、Win32_PnPEntityクラスを使用してネットワーク アダプターの DeviceName を取得し、それをInstanceNameに変換することでした。これにより、他の WMI テーブルで使用できるキー値を見つけることができます (私は InterfaceIndex を使用しましたが、Win32_NetworkAdapterクラスには他の選択肢があります。

大まかに言えば、次のとおりです。

  1. Win32_NetworkAdapter のインスタンスを取得する
  2. 以下の 2 つのWMI WQL クエリのいずれかを使用して、PnpEntity を取得します。
  3. 以下を置き換えて、Win32_PNPEntity.Name を InstanceName に変換します。
    1. ( と [
    2. ) と ]
    3. # \ / すべて _ 付き
  4. その InstanceName を使用してWin32_PerfFormattedData_Tcpip_NetworkInterfaceクラスをクエリします

かなり複雑ですが、InstanceName は PnPEntity Name から派生しているため、正確なマッピングを取得する唯一の方法です。

NetworkAdapter の PnPEntity インスタンスを取得できた 2 つの方法を次に示します。

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'
于 2014-11-13T22:36:27.497 に答える