package net import ( "fmt" "net" "os" "os/exec" "github.com/AlecAivazis/survey/v2" "golang.org/x/sys/windows" ) type NetIfWrap struct { net.Interface } func (n NetIfWrap) GetName() string { return n.Interface.Name } // 选择网卡 func ChooseNic(nics []NetIfWrap, message string) (NetIfWrap, error) { var names []string for _, nic := range nics { names = append(names, nic.Name) } var choice string err := survey.AskOne(&survey.Select{ Message: message, Options: names, }, &choice) if err != nil { return NetIfWrap{}, err } for _, nic := range nics { if nic.Name == choice { return nic, nil } } return NetIfWrap{}, fmt.Errorf("未找到网卡: %s", choice) } // 设置静态IP func SetStaticIP(nic NetIfWrap, addr, mask, gateway string) error { cmd := exec.Command("netsh", "interface", "ip", "set", "address", fmt.Sprintf("name=%s", nic.Name), "static", addr, mask, gateway) out, err := cmd.CombinedOutput() if err != nil { return fmt.Errorf("netsh失败: %v, 输出: %s", err, string(out)) } return nil } // 设置 DHCP func SetDHCP(nic NetIfWrap) error { cmd := exec.Command("netsh", "interface", "ip", "set", "address", fmt.Sprintf("name=%s", nic.Name), "dhcp") out, err := cmd.CombinedOutput() if err != nil { return fmt.Errorf("netsh失败: %v, 输出: %s", err, string(out)) } return nil } // Windows 管理员检查 func IsAdmin() bool { sid, _ := windows.CreateWellKnownSid(windows.WinBuiltinAdministratorsSid) token := windows.Token(0) member, _ := token.IsMember(sid) return member } // 提升管理员权限 func RunAsAdmin() error { exe, _ := exec.LookPath(os.Args[0]) args := os.Args[1:] cmd := exec.Command("powershell", "-Command", fmt.Sprintf(`Start-Process -FilePath "%s" -ArgumentList %s -Verb RunAs`, exe, joinArgsArray(args)), ) cmd.Stdout = nil cmd.Stderr = nil return cmd.Run() } func joinArgsArray(args []string) string { res := "" for i, a := range args { if i > 0 { res += "," } res += fmt.Sprintf("'%s'", a) } return res }