97 lines
2.0 KiB
Go
97 lines
2.0 KiB
Go
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
|
|
}
|