From 0f496a54e709e9b6ab7492d1984b30687dfd9caa Mon Sep 17 00:00:00 2001 From: cynfo3000 Date: Tue, 10 Mar 2026 02:22:06 +0100 Subject: [PATCH] fix: winget-Pfad dynamisch suchen (Service laeuft als SYSTEM ohne WindowsApps im PATH) --- agent-windows/ws/handler.go | 68 +++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/agent-windows/ws/handler.go b/agent-windows/ws/handler.go index 50ae2bc..87c1961 100644 --- a/agent-windows/ws/handler.go +++ b/agent-windows/ws/handler.go @@ -19,12 +19,40 @@ type Message struct { Data interface{} `json:"data,omitempty"` // Agent -> Backend (Response) } -type Handler struct{} +type Handler struct { + wingetPath string +} func NewHandler() *Handler { return &Handler{} } +// winget gibt den Pfad zu winget.exe zurueck (cached) +func (h *Handler) winget() string { + if h.wingetPath != "" { + return h.wingetPath + } + // Direkt im PATH? + if path, err := exec.LookPath("winget"); err == nil { + h.wingetPath = path + return path + } + // WindowsApps durchsuchen + script := `Get-ChildItem "C:\Program Files\WindowsApps" -Filter winget.exe -Recurse -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty FullName` + cmd := exec.Command("powershell", "-NoProfile", "-NonInteractive", "-Command", script) + out, err := cmd.Output() + if err == nil { + path := strings.TrimSpace(string(out)) + if path != "" { + h.wingetPath = path + log.Printf("winget gefunden: %s", path) + return path + } + } + log.Printf("winget nicht gefunden") + return "" +} + func (h *Handler) Handle(raw []byte) []byte { var msg Message if err := json.Unmarshal(raw, &msg); err != nil { @@ -97,11 +125,13 @@ func (h *Handler) handleExec(msg Message) Message { // handleWingetList listet installierte Software auf func (h *Handler) handleWingetList(msg Message) Message { resp := Message{Type: "response", ID: msg.ID} - out, err := runPS("winget list --accept-source-agreements 2>&1") - if err != nil { - resp.Status = "error" - resp.Error = err.Error() - return resp + wp := h.winget() + if wp == "" { + resp.Status = "error"; resp.Error = "winget nicht gefunden"; return resp + } + out, err := runWithTimeout(fmt.Sprintf(`& "%s" list --accept-source-agreements 2>&1`, wp), 60) + if err != nil && out == "" { + resp.Status = "error"; resp.Error = err.Error(); return resp } resp.Status = "ok" resp.Data = map[string]interface{}{"output": out} @@ -115,11 +145,13 @@ func (h *Handler) handleWingetInstall(msg Message) Message { if data == nil { data, _ = msg.Data.(map[string]interface{}) } pkg, _ := data["package"].(string) if pkg == "" { - resp.Status = "error" - resp.Error = "Kein Paket angegeben" - return resp + resp.Status = "error"; resp.Error = "Kein Paket angegeben"; return resp } - cmd := fmt.Sprintf("winget install --id %s --silent --accept-package-agreements --accept-source-agreements 2>&1", sanitize(pkg)) + wp := h.winget() + if wp == "" { + resp.Status = "error"; resp.Error = "winget nicht gefunden"; return resp + } + cmd := fmt.Sprintf(`& "%s" install --id %s --silent --accept-package-agreements --accept-source-agreements 2>&1`, wp, sanitize(pkg)) out, err := runWithTimeout(cmd, 300) if err != nil { resp.Status = "error" @@ -139,11 +171,13 @@ func (h *Handler) handleWingetUpgrade(msg Message) Message { if data == nil { data, _ = msg.Data.(map[string]interface{}) } pkg, _ := data["package"].(string) if pkg == "" { - resp.Status = "error" - resp.Error = "Kein Paket angegeben" - return resp + resp.Status = "error"; resp.Error = "Kein Paket angegeben"; return resp } - cmd := fmt.Sprintf("winget upgrade --id %s --silent --accept-package-agreements --accept-source-agreements 2>&1", sanitize(pkg)) + wp := h.winget() + if wp == "" { + resp.Status = "error"; resp.Error = "winget nicht gefunden"; return resp + } + cmd := fmt.Sprintf(`& "%s" upgrade --id %s --silent --accept-package-agreements --accept-source-agreements 2>&1`, wp, sanitize(pkg)) out, err := runWithTimeout(cmd, 300) if err != nil { resp.Status = "error" @@ -158,7 +192,11 @@ func (h *Handler) handleWingetUpgrade(msg Message) Message { // handleWingetUpgradeAll aktualisiert alle Pakete func (h *Handler) handleWingetUpgradeAll(msg Message) Message { resp := Message{Type: "response", ID: msg.ID} - out, err := runWithTimeout("winget upgrade --all --silent --accept-package-agreements --accept-source-agreements 2>&1", 600) + wp := h.winget() + if wp == "" { + resp.Status = "error"; resp.Error = "winget nicht gefunden"; return resp + } + out, err := runWithTimeout(fmt.Sprintf(`& "%s" upgrade --all --silent --accept-package-agreements --accept-source-agreements 2>&1`, wp), 600) if err != nil { resp.Status = "error" resp.Error = err.Error()