获取链接速度 - Win32_PerfRawData_Tcpip_NetworkInterface
我发现Determining the network connection link speed ,现在我想将数据从Win32_PerfRawData_Tcpip_NetworkInterface与 Win32_NetworkAdapter(或Win32_NetworkAdapterConfiguration的)相关。获取链接速度 - 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网络 连接
VS
名称:英特尔[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
确定。感谢您发布简短的脚本。在您正在处理这些问题时,我正在使用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
@Milde我知道,那里**必须是更好的方法。 – 2009-12-02 15:09:39
谢谢你思南。只要($ canonperfname =〜/^$ canonname /)为真,你的代码就会工作:)。 不幸的是,我不能使用“DBD :: WMI”,但这不是问题。这个“简单”的任务让我发疯...... 希望得到更多的建议。 – Milde 2009-12-02 15:11:31
@Milde查看http://www.google.com/search?q=Win32_PerfRawData_Tcpip_NetworkInterface返回的页面我发现这是一个经常出现的问题,并且*名称的某种规范化似乎是唯一的解决方案。在规范化和剥离' - Packet Scheduler Miniport'时,你可以使用一些不太可能出现的字符作为名称的一部分,如'chr(254)'而不是'_',这样你就可以使用'eq'。 – 2009-12-02 15:25:22
我只是看着我的机器枝条的WMI的工具,因为我认为,这一定很容易...... ;-)
但它不是...
但是我在我的机器上发现的是,一个concatenantion的“ Win32_NetworkAdapter.Name“+”__“+”Win32_NetworkAdapter.InterfaceIndex“ 结果在”Win32_PerfFormattedData_Tcpip_NetworkInterface.Name =“NVIDIA nForce网络控制器_2”[注意太空间!]。从我的机器
例子:
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
这并不总是奏效,因为interfaceindex并不总是与即插即用设备名称相匹配 – 2014-11-13 22:22:40
唯一的办法我能找到是使用Win32_PnPEntity类来获得网络适配器的设备名称,然后将其转换成InstanceName。这可以让你发现,你可以在其他WMI表使用(我用InterfaceIndex,但也有在Win32_NetworkAdapter类其他选择的关键值
所以在较高的水平。
- 获取一个实例的Win32_NetworkAdapter
- 使用两个以下WMI WQL queries通过更换得到PnpEntity
- 转换的Win32_PNPEntity.Name到实例名称之一:
- (与[
- )用]
- #\ /所有_
- 使用实例名称来查询
Win32_PerfFormattedData_Tcpip_NetworkInterface
类
这是很令人费解,但由于InstanceName是从PnPEntity名称derrived,这是我能找到准确映射的唯一途径。
这里有两种方法我能得到PnPEntity例如用于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'
你可以发布短Perl脚本,告诉您如何得到这些信息?事实上,在帮助那些不在同一问题上工作的人开始工作时,你的帖子中很少有用的信息。您甚至不会告诉我们哪个适配器字符串来自哪个来源等等。您可以尝试通过将所有非单词字符转换为'_'来对字符串进行规范化,但这是最后的手段。 – 2009-12-02 13:33:51
添加了一些代码,希望它有帮助。我也想过通配符,但对我来说似乎有点不安全。 – Milde 2009-12-02 14:26:48
我相信,这有点晚...但是有关于命名约定的一些注意事项,请参见http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.instancename(v = vs.110 ).aspx - “如果实例名称是自动生成的并且可能包含字符”(“,”)“,”#“,”\“或”/“,请使用下表中的字符映射。但是,这无助于映射像isatap,{GUID}或索引后缀这样的疯狂名称。 – mikalai 2014-09-30 21:43:12