Files
netcli/internal/net/nic.go
2025-12-03 23:29:51 +08:00

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
}