从注册表获取的,测试了好几种网卡,都能正常判断。
_NetworkAdapterInfo() 这个UDF我稍微改了下。最后一项就是网卡实际的速度了。#Include <Array.au3>
$NetworkAdapterInfo = _NetworkAdapterInfo()
_ArrayDisplay($NetworkAdapterInfo, "NetworkAdapterInfo")
Func GetSpeed($ID)
$NetKey = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}"
$i = 1
While 1
$Idx = RegEnumKey($NetKey,$i)
If @error Then ExitLoop
$Sid = RegRead($NetKey&""&$Idx,"NetCfgInstanceId")
If $Sid = $ID Then
$P = 1
While 1
$Params = RegEnumKey($NetKey&""&$Idx&"\Ndi",$P)
If @error Then ExitLoop
If StringInStr($Params,"Params") > 0 Then
$C = 1
While 1
$IN = RegEnumKey($NetKey&""&$Idx&"\Ndi"&$Params,$C)
If @error Then ExitLoop
$Mode = RegRead($NetKey&""&$Idx&"\Ndi"&$Params&""&$IN,"ParamDesc")
If (StringInStr($Mode,"速度") > 0 And StringInStr($Mode,"双工") > 0) Or _
(StringInStr($Mode,"speed") > 0 And StringInStr($Mode,"duplex") > 0) Or _
(StringInStr($Mode,"Media") > 0 And StringInStr($Mode,"Type") > 0) Or _
(StringInStr($Mode,"Connection") > 0 And StringInStr($Mode,"Type") > 0) Then
Dim $aSpeed[1]
$aSpeed[0] = 0
$X = 1
While 1
$SP = RegEnumVal($NetKey&""&$Idx&"\Ndi\params"&$IN&"\enum",$X)
If @error then ExitLoop
$SPTEMP = RegRead($NetKey&""&$Idx&"\Ndi\params"&$IN&"\enum",$SP)
$Speed = GetNo($SPTEMP)
If $Speed <> "" then
_ArrayAdd($aSpeed, $Speed)
EndIf
$X = $X + 1
WEnd
Return _ArrayMax($aSpeed)
EndIf
$C = $C + 1
WEnd
EndIf
$P = $P + 1
WEnd
EndIf
$i = $i + 1
WEnd
Return 0
EndFunc
Func GetNo($ZHI)
$Exp = StringRegExp($ZHI, "\d+.\d+|\d+", 1)
If Not @error Then
If StringInStr($Exp[0],".") > 0 then
Return $Exp[0] * 1000
Else
Return $Exp[0]
EndIf
Else
Return ""
EndIf
EndFunc
Func _NetworkAdapterInfo()
;======================================================
;
; 函数名称: _NetworkAdapterInfo()
; 详细信息: 获取系统所有网卡信息
; 返回值说明:
; 以二维数组方式返回.例如 $info=_NetworkAdapterInfo()
; $info[0][0] 网卡数量
; $info[1][0] 第一块网卡的标志1
; $info[1][1] 第一块网卡的状态
; 状态说明:7为网卡未插网线,2为网卡连接正常
; $info[1][2] 第一块网卡的网卡名称
; $info[1][3] 第一块网卡的连接名称
; $info[1][4] 第一块网卡的MAC地址
; $info[1][5] 第一块网卡的IP地址
; $info[1][6] 第一块网卡的最高速度
; 第二块网卡:
; $info[2][0] 第二块网卡的标志1
; $info[2][6] 第二块网卡的最高速度
; 其他网卡信息依次类推。。。
; 注意,此UDF不会获取已经禁用的网卡。
; 作者: Sanhen (gxbeiliu@163.com)
; 网站: www.lunhui.net.cn www.autoitx.com
;======================================================
Local $colItem
Local $objItem
Local $colItems
Local $objItems
Local $objWMIService
Local $Adapters[1][8]
$Adapters[0][0] = 0
$objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
$colItem = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus >0", "WQL", 0x30)
If IsObj($colItem) Then
For $objItem In $colItem
If $objItem.MACAddress = "00:00:00:00:00:00" Then ContinueLoop
$Adapters[0][0] += 1
ReDim $Adapters[UBound($Adapters) + 1][8]
$Adapters[$Adapters[0][0]][0] += $Adapters[0][0]
$Adapters[$Adapters[0][0]][1] = $objItem.NetConnectionStatus
$Adapters[$Adapters[0][0]][2] = $objItem.Description
$Adapters[$Adapters[0][0]][3] = $objItem.NetConnectionID
$Adapters[$Adapters[0][0]][4] = $objItem.MACAddress
$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress = "' & $Adapters[$Adapters[0][0]][4] & '" And IPEnabled = True ', "WQL", 0x30)
If IsObj($colItems) Then
For $objItems In $colItems
;if $objItem1.IPAddress(0) = "0.0.0.0" Then ContinueLoop
$Adapters[$Adapters[0][0]][5] = $objItems.IPAddress(0)
$Adapters[$Adapters[0][0]][6] = $objItems.SettingID
$Adapters[$Adapters[0][0]][7] = GetSpeed($objItems.SettingID)
Next
EndIf
Next
EndIf
Return $Adapters
EndFunc ;==>_NetworkAdapterInfo
|