Skip to content

fix(windows): stop console window flashes during scheduled scans#104

Merged
ashishkurmi merged 1 commit into
step-security:mainfrom
ashishkurmi:swarit/fix/windows
May 22, 2026
Merged

fix(windows): stop console window flashes during scheduled scans#104
ashishkurmi merged 1 commit into
step-security:mainfrom
ashishkurmi:swarit/fix/windows

Conversation

@ashishkurmi
Copy link
Copy Markdown
Member

The schtasks /create action used to invoke the agent via a cmd /c wrapper, which produced a visible cmd.exe flash on every scheduled fire. This change:

  • Drops the cmd /c wrapper; the task now invokes the agent (or the GUI-subsystem launcher) directly, with --install-dir / filelog handling moved into the binary.
  • Adds cmd/stepsecurity-dev-machine-guard-task — a small GUI-subsystem launcher .exe used by the MSI install layout so Windows does not allocate a console for the scheduled task.
  • Adds internal/winproc to suppress subprocess console flashes via CREATE_NO_WINDOW for child processes spawned by the agent.
  • Wires the launcher binary into the MSI WiX manifest, .goreleaser config, Makefile, and the msi-smoke / release workflows.
  • Adds Windows-side test coverage for schtasks, winproc, and the IDE detector.

What does this PR do?

Type of change

  • Bug fix
  • Enhancement
  • Documentation

Testing

  • Tested on macOS (version: ___)
  • Binary runs without errors: ./stepsecurity-dev-machine-guard --verbose
  • JSON output is valid: ./stepsecurity-dev-machine-guard --json | python3 -m json.tool
  • No secrets or credentials included
  • Lint passes: make lint
  • Tests pass: make test

Related Issues

The schtasks /create action used to invoke the agent via a cmd /c
wrapper, which produced a visible cmd.exe flash on every scheduled
fire. This change:

- Drops the cmd /c wrapper; the task now invokes the agent (or the
  GUI-subsystem launcher) directly, with --install-dir / filelog
  handling moved into the binary.
- Adds cmd/stepsecurity-dev-machine-guard-task — a small
  GUI-subsystem launcher .exe used by the MSI install layout so
  Windows does not allocate a console for the scheduled task.
- Adds internal/winproc to suppress subprocess console flashes via
  CREATE_NO_WINDOW for child processes spawned by the agent.
- Wires the launcher binary into the MSI WiX manifest, .goreleaser
  config, Makefile, and the msi-smoke / release workflows.
- Adds Windows-side test coverage for schtasks, winproc, and the IDE
  detector.
@ashishkurmi ashishkurmi merged commit 85f35b8 into step-security:main May 22, 2026
11 checks passed
ashishkurmi pushed a commit that referenced this pull request May 27, 2026
The launcher was hardcoded to spawn the sibling agent .exe, which is
exactly what the MSI install layout needs but doesn't work for the
PowerShell loader. The PS task action has to run
`powershell.exe -File loader.ps1 send-telemetry` on every tick (loader
owns auto-update), and powershell.exe is console-subsystem — Task
Scheduler firing it directly allocates a console and flashes a window
before -WindowStyle Hidden takes effect. Same root cause PR #104 fixed
for the agent, just at the powershell layer.

This adds an --exec mode so the PS loader's scheduled task can wrap
powershell.exe in the launcher's no-console envelope:

  task.exe --exec powershell.exe -ExecutionPolicy Bypass ...

When --exec is absent the launcher falls through to the existing
sibling-agent behaviour, so MSI installs see no change. Target
resolution lives in internal/launcher so it gets unit-test coverage on
the macOS CI runner (the launcher binary itself stays Windows-only).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants