golang获取windows系统有线活跃网卡及IP配置
package network
import (
"errors"
"fmt"
"github.com/StackExchange/wmi"
"golang.org/x/text/encoding/simplifiedchinese"
"log"
"net"
"os/exec"
"strings"
"time"
)
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
}
type EthernetInfo struct {
IP string
Mask string
Gateway string
Index uint32
Name string
DHCPEnabled bool
DNSServerSearchOrder []string
}
func QueryLocalActiveEthernet() (*EthernetInfo, error) {
s, err := wmi.InitializeSWbemServices(wmi.DefaultClient)
if err != nil {
return nil, err
}
var dst []Win32_NetworkAdapterConfiguration
q := wmi.CreateQuery(&dst, "WHERE IPEnabled=True")
errQuery := s.Query(q, &dst)
if errQuery != nil {
return nil, errQuery
}
res := make([]Win32_NetworkAdapterConfiguration, 0)
for _, adapter := range dst {
if !strings.Contains(adapter.Caption, "Wireless") {
res = append(res, adapter)
}
}
length := len(res)
if length == 0 {
return nil, errors.New("未匹配到可用的网卡")
} else if length > 1 {
return nil, errors.New("活跃的网卡不止一个,请检查确认")
} else {
// 通过网卡序号获取网卡基本信息
netInterface, err := net.InterfaceByIndex(int(res[0].InterfaceIndex))
if err != nil {
return nil, err
}
ethernet := EthernetInfo{
Index: res[0].InterfaceIndex,
Name: netInterface.Name,
DHCPEnabled: res[0].DHCPEnabled,
DNSServerSearchOrder: res[0].DNSServerSearchOrder,
}
if len(res[0].IPAddress) > 0 {
ethernet.IP = res[0].IPAddress[0]
}
if len(res[0].IPSubnet) > 0 {
ethernet.Mask = res[0].IPSubnet[0]
}
if len(res[0].DefaultIPGateway) > 0 {
ethernet.Gateway = res[0].DefaultIPGateway[0]
}
return ðernet, nil
}
}
// winCmd 输入执行函数
func winCmd(s string) error {
output, err := exec.Command("cmd", "/c", s).Output()
if err != nil {
log.Println(err.Error())
return errors.New(ConvertByte2String(output, "GB18030"))
}
return nil
}
// SetIpMaskGW 设置网卡ip/mask/gw
func SetIpMaskGW(name, ip, mask, gateway, gwMetric string) error {
// netsh interface ip set address "eth0" static 192.168.0.12 255.255.255.0 192.168.0.254 1
setIpMaskCommand := fmt.Sprintf(
"netsh interface ip set address \"%s\" static %s %s %s %s", name, ip, mask, gateway, gwMetric)
// 执行cmd命令
return winCmd(setIpMaskCommand)
}
// SetDNS 设置网卡DNS
func SetDNS(name string, dnsServerOrder []string) error {
// 主DNS netsh interface ip set dns "eth0" static 218.2.135.1 primary
// 辅DNS netsh interface ip add dns "eh0" 223.5.5.5
for idx, dns := range dnsServerOrder {
if idx == 0 {
err := winCmd(fmt.Sprintf("netsh interface ip set dns \"%s\" static %s primary", name, dns))
if err != nil {
return err
}
} else {
time.Sleep(time.Millisecond * 200) // 两条指令之间短暂延时
err := winCmd(fmt.Sprintf("netsh interface ip add dns \"%s\" %s", name, dns))
if err != nil {
return err
}
}
}
return nil
}
// SetDHCP 设置为DHCP模式
func SetDHCP(name string) error {
//返回用户需要设置的网卡名称
// netsh interface ip set address "本地连接" dhcp
// netsh interface ip set dns "本地连接" dhcp
newDHCP := make([]string, 2)
newDHCP[0] = fmt.Sprintf("netsh interface ip set address \"%s\" dhcp", name)
newDHCP[1] = fmt.Sprintf("netsh interface ip set dns \"%s\" dhcp", name)
//调用cmd输入
if err := winCmd(newDHCP[0]); err != nil {
return err
}
time.Sleep(time.Second * 1)
return winCmd(newDHCP[1])
}
type Charset string
const (
UTF8 = Charset("UTF-8")
GB18030 = Charset("GB18030")
)
func ConvertByte2String(byte []byte, charset Charset) string {
var str string
switch charset {
case GB18030:
var decodeBytes, _ = simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
str = string(decodeBytes)
case UTF8:
fallthrough
default:
str = string(byte)
}
return str
}