我发现确定networking连接的链接速度 ,现在我试图关联从Win32_PerfRawData_Tcpip_NetworkInterface与Win32_NetworkAdapter (或Win32_NetworkAdapterConfiguration )的数据。
在类Win32_PerfRawData_Tcpip_NetworkInterface
我看不到任何索引或唯一键,我可以用它来引用Win32_NetworkAdapterConfiguration
或Win32_NetworkAdapter. I tried to use the
Win32_NetworkAdapter. I tried to use the
Win32_PerfRawData_Tcpip_NetworkInterface and
Win32_NetworkAdapter中Win32_NetworkAdapter. I tried to use the
名称,但它们看起来不一样。
例如
名称:英特尔(R)PRO / 1000 PLnetworking连接
VS
名称:英特尔(R)PRO_1000 PLnetworking连接
任何提示?
先谢谢你,
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
好。 感谢张贴短脚本。 当您正在处理这个问题时,我正在使用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; } }
输出:
===从Win32_NetworkAdapter === 名称:英特尔(R)PRO /无线3945ABG网络连接 规范名称:Intel_R__PRO_Wireless_3945ABG_Network_Connection ===从Win32_PerfRawData_Tcpip_NetworkInterface === 名称:英特尔[R] PRO_Wireless 3945ABG网络连接 - 数据包计划程序微型端口 规范名称:Intel_R__PRO_Wireless_3945ABG_Network_Connection___Packet_Scheduler_Miniport 5400
我只是用WMI-Tools看我的机器,因为我认为它一定很容易… 😉
但不是…
但是我在我的机器上发现,“Win32_NetworkAdapter.Name”+“__”+“Win32_NetworkAdapter.InterfaceIndex”的结果在“Win32_PerfFormattedData_Tcpip_NetworkInterface.Name =”NVIDIA nForce网络控制器_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 – mabra
我能找到的唯一方法是使用Win32_PnPEntity类获取网络适配器的DeviceName,然后将其转换为InstanceName 。 这使您可以找到一个可用于其他WMI表的键值(我使用InterfaceIndex,但在Win32_NetworkAdapter类中还有其他选择。
所以在高层次上:
Win32_PerfFormattedData_Tcpip_NetworkInterface
类 这是相当复杂的,但是因为InstanceName是从PnPEntity Name中衍生出来的,所以这是唯一能找到准确映射的方法。
以下是我能够获得NetworkAdapter的PnPEntity实例的两种方法:
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'