#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
MsgBox(0, "当前选择网卡索引", '[' & NICIndex() & ']')
Exit
Func NICIndex()
Local $aIfTable, $iNICIndex
$aIfTable = _GetNetInfo()
If $aIfTable[0][0] = 0 Then
MsgBox(0x10, "错误", "获取网络适配器设置失败,请检查网卡驱动。")
Exit 2
ElseIf $aIfTable[0][0] = 1 Then
$iNICIndex = $aIfTable[1][0]
Else
; 创建“网卡选择”窗口
Local $hNICWnd, $hOKButton, $hIfTable
$hNICWnd = GUICreate("测试" & " - 网卡选择", 284, 118)
GUICtrlCreateLabel("检测到本机安装有多个网络适配器,请选择用于更新的网卡。", 16, 16, 252, 24)
$hIfTable = GUICtrlCreateCombo("", 16, 48, 252, 12 * $aIfTable[0][0], BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
For $i = 1 To $aIfTable[0][0]
GUICtrlSetData(-1, $aIfTable[$i][0] & ". " & $aIfTable[$i][1])
Next
GUICtrlSetData(-1, $aIfTable[1][0] & ". " & $aIfTable[1][1])
$hOKButton = GUICtrlCreateButton("确定(&O)", 104, 80, 76, 22, $BS_DEFPUSHBUTTON)
; 窗口事件
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $hOKButton, $GUI_EVENT_CLOSE
$iNICIndex = GUICtrlRead($hIfTable)
ExitLoop
EndSwitch
WEnd
GUIDelete($hNICWnd)
$iNICIndex = StringLeft($iNICIndex, StringInStr($iNICIndex, ".") - 1)
EndIf
Return $iNICIndex
EndFunc ;==>NICIndex
;===============================================================================
; 说明: 获取网络适配器信息
; 语法: _GetNetInfo([$strComputer = "localhost"])
; 参数: $strComputer - [可选] 计算机名称
; 需要: WMI 服务
; 返回: 成功 - 二维数组, 结构:
; $array[0][0] - 网络适配器总数
; $array[1][0] - 第一网络适配器索引
; $array[1][1] - 第一网络适配器名称
; $array[1][2] - 第一网络适配器连接名
; $array[1][3] - 第一网络适配器连接状态
; $array[1][4] - 第一网络适配器MAC地址
; $array[1][5] - 第一网络适配器DHCP状态
; $array[1][6] - 第一网络适配器IP地址
; $array[1][7] - 第一网络适配器子网掩码
; $array[1][8] - 第一网络适配器默认网关
; $array[1][9] - 第一网络适配器首选 DNS
; $array[1][10] - 第一网络适配器备用 DNS
; ...
; [n][0] 至 [n][10] - 第 n 网络适配器信息
; 失败 - 空列表数组 [0][0] = 0, 并设置 @error 到
; 1 - 没有可用网络适配器
; 2 - 获取 COM 对象失败
; 备注: 无
;===============================================================================
Func _GetNetInfo($strComputer = "localhost")
Local $objWMIService, $colItems, $objItem, $iItem, $aNetInfo[1][11] = [[0]]
$objWMIService = ObjGet("winmgmts:\" & $strComputer & "\root\CIMV2")
If @error Then Return SetError(2, 0, $aNetInfo)
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 0x10 + 0x20)
If IsObj($colItems) Then
For $objItem In $colItems
$aNetInfo[0][0] += 1
$iItem = $aNetInfo[0][0]
ReDim $aNetInfo[$iItem + 1][11]
$aNetInfo[$iItem][0] = $objItem.Index
$aNetInfo[$iItem][1] = $objItem.Description
$aNetInfo[$iItem][4] = $objItem.MACAddress
$aNetInfo[$iItem][5] = $objItem.DHCPEnabled
$aNetInfo[$iItem][6] = $objItem.IPAddress(0)
$aNetInfo[$iItem][7] = $objItem.IPSubnet(0)
$aNetInfo[$iItem][8] = $objItem.DefaultIPGateway(0)
$aNetInfo[$iItem][9] = $objItem.DNSServerSearchOrder(0)
$aNetInfo[$iItem][10] = $objItem.DNSServerSearchOrder(1)
If NOT StringRegExp($aNetInfo[$iItem][4], "^([0-9A-F]{2}:){5}[0-9A-F]{2}$") _
Then $aNetInfo[$iItem][4] = ""
If $aNetInfo[$iItem][5] Then $aNetInfo[$iItem][5] = 1
If NOT StringRegExp($aNetInfo[$iItem][6], "^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)$") _
Then $aNetInfo[$iItem][6] = ""
If NOT StringRegExp($aNetInfo[$iItem][7], "^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)$") _
Then $aNetInfo[$iItem][7] = ""
If NOT StringRegExp($aNetInfo[$iItem][8], "^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)$") _
Then $aNetInfo[$iItem][8] = ""
If NOT StringRegExp($aNetInfo[$iItem][9], "^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)$") _
Then $aNetInfo[$iItem][9] = ""
If NOT StringRegExp($aNetInfo[$iItem][10], "^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)$") _
Then $aNetInfo[$iItem][10] = ""
Next
EndIf
If $aNetInfo[0][0] = 0 Then Return SetError(1, 0, $aNetInfo)
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE AdapterType = 'Ethernet 802.3'", "WQL", 0x10 + 0x20)
If IsObj($colItems) Then
For $objItem In $colItems
For $i = 1 To $aNetInfo[0][0]
If $aNetInfo[$i][0] = $objItem.Index Then
$aNetInfo[$i][1] = $objItem.Description
$aNetInfo[$i][2] = $objItem.NetConnectionID
$aNetInfo[$i][3] = $objItem.NetConnectionStatus
ExitLoop
EndIf
Next
Next
EndIf
Return $aNetInfo
EndFunc ;==>_GetNetInfo