功能:獲取windows平臺(tái)下跋破、獲取本機(jī)的物理網(wǎng)卡、包括虛擬網(wǎng)卡和USB外置網(wǎng)卡
實(shí)現(xiàn)
package main
// 獲取本機(jī)pci接口的網(wǎng)卡信息调煎、去除了虛擬網(wǎng)卡和usb網(wǎng)卡等信息
// 可獲取到的網(wǎng)卡信息:網(wǎng)卡ID、網(wǎng)卡IPV4地址、網(wǎng)卡IPV6地址、MAC地址
import (
"fmt"
"github.com/StackExchange/wmi"
"golang.org/x/sys/windows/registry"
"log"
"strings"
"time"
)
const (
PCI = iota
USB
)
// Win32_NetworkAdapterConfiguration 網(wǎng)絡(luò)適配器類名耿眉、名稱不可更改
type Win32_NetworkAdapterConfiguration struct {
Caption string
Description string
SettingID string
ArpAlwaysSourceRoute bool
ArpUseEtherSNAP bool
DatabasePath string
DeadGWDetectEnabled bool
DefaultIPGateway []string
DefaultTOS uint8
DefaultTTL uint8
DHCPEnabled bool
DHCPLeaseExpires *time.Time
DHCPLeaseObtained *time.Time
DHCPServer string
DNSDomain string
DNSDomainSuffixSearchOrder []string
DNSEnabledForWINSResolution bool
DNSHostName string
DNSServerSearchOrder []string
DomainDNSRegistrationEnabled bool
ForwardBufferMemory uint32
FullDNSRegistrationEnabled bool
GatewayCostMetric []int32
IGMPLevel uint8
Index uint32
InterfaceIndex uint32
IPAddress []string
IPConnectionMetric uint32
IPEnabled bool
IPFilterSecurityEnabled bool
IPPortSecurityEnabled bool
IPSecPermitIPProtocols []string
IPSecPermitTCPPorts []string
IPSecPermitUDPPorts []string
IPSubnet []string
IPUseZeroBroadcast bool
IPXAddress string
IPXEnabled bool
IPXFrameType []uint32
IPXMediaType uint32
IPXNetworkNumber []string
IPXVirtualNetNumber string
KeepAliveInterval uint32
KeepAliveTime uint32
MACAddress string
MTU uint32
NumForwardPackets uint32
PMTUBHDetectEnabled bool
PMTUDiscoveryEnabled bool
ServiceName string
TcpipNetbiosOptions uint32
TcpMaxConnectRetransmissions uint32
TcpMaxDataRetransmissions uint32
TcpNumConnections uint32
TcpUseRFC1122UrgentPointer bool
TcpWindowSize uint16
WINSEnableLMHostsLookup bool
WINSHostLookupFile string
WINSPrimaryServer string
WINSScopeID string
WINSSecondaryServer string
}
// NetWorkInterface 對(duì)外輸出網(wǎng)絡(luò)接口
type NetWorkInterface struct {
Type uint64
TypeId int
Name string
PnPInstanceId string
IP4Addr string
IP6Addr string
MACAddr string
}
// WbemQuery 通過(guò)wmi接口獲取ip網(wǎng)卡信息
func WbemQuery() []NetWorkInterface {
s, err := wmi.InitializeSWbemServices(wmi.DefaultClient)
if err != nil {
log.Fatalf("InitializeSWbemServices: %s", err)
}
var dst []Win32_NetworkAdapterConfiguration
q := wmi.CreateQuery(&dst, "WHERE IPEnabled=True")
errQuery := s.Query(q, &dst)
if errQuery != nil {
log.Fatalf("Query1: %s", errQuery)
}
var netInterface []NetWorkInterface
for _, value := range dst {
netInfo, flag := ReadRegedit(value.SettingID)
if flag {
result := NetWorkInterface{
Type: netInfo.Type,
Name: netInfo.Name,
PnPInstanceId: netInfo.PnPInstanceId,
IP4Addr: value.IPAddress[0],
IP6Addr: value.IPAddress[1],
MACAddr: value.MACAddress,
}
netInterface = append(netInterface, result)
}
}
return netInterface
}
// ReadRegedit 讀取注冊(cè)表、獲取網(wǎng)卡類型、判斷PCI標(biāo)識(shí)
func ReadRegedit(netId string) (NetWorkInterface, bool) {
var result NetWorkInterface
key, err := registry.OpenKey(registry.LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\"+netId+"\\Connection", registry.READ)
if err != nil {
log.Fatal(err)
}
defer key.Close()
value, _, err := key.GetStringValue("PnPInstanceId")
Type, _, err := key.GetIntegerValue("MediaSubType")
Name, _, err := key.GetStringValue("Name")
if err != nil {
return result, false
}
// 獲取pnpId中含有PCI(內(nèi)置網(wǎng)卡)或USB(外掛網(wǎng)卡)
if strings.Count(value, "PCI") > 0 {
result.Type = Type
result.TypeId = PCI
result.Name = Name
result.PnPInstanceId = value
return result, true
} else {
if strings.Count(value, "USB") > 0 {
result.Type = Type
result.TypeId = USB
result.Name = Name
result.PnPInstanceId = value
return result, true
}
}
return result, false
}
func main() {
fmt.Println(WbemQuery())
}