-
Notifications
You must be signed in to change notification settings - Fork 0
FAQ
It is a port: the same directory names, the same once/every split, the same ignored-users,
overrides and checksum concepts, the same trigger-file pattern. The execution model underneath is
entirely Windows — one LocalSystem service instead of a LaunchDaemon plus a LaunchAgent — and
that difference is where the behavioural divergences come from. See
Coming From Outset.
The project is StartSet; the shipped CLI binary is renamed to managedstatekeeper.exe at publish
time and the payload tree lives at C:\ProgramData\ManagedState. Only the binaries live under
C:\Program Files\StartSet. Anything that invokes the CLI by path must use
managedstatekeeper.exe.
Not directly. There is no shebang mechanism and the extension chooses the processor. Supported
extensions are .ps1, .cmd, .bat, .exe, .msi and .msix. Adding an extension to
allowed_extensions makes it discoverable but there is no processor for it, so it fails with
UnsupportedType. Wrap the thing you want to run in a .ps1 or .cmd.
Discovery is top level only — subdirectories are never walked, and nothing reports the file as missing. Put payloads flat in the directory.
No. StartSet watches logon events (Security 4624, types 2, 10 and 11). Unlock is type 7 and is not watched.
Yes — logon type 10 is watched. But user-context payloads are launched into the active console session, so on a machine with several sessions the payload goes to the console one. If nobody is at the console, a user-context payload is deferred rather than run in the wrong place.
Either it is in a privileged directory, or it is a package. login-privileged-*, boot-* and
on-demand-privileged payloads run as LocalSystem in session 0, where HKCU is SYSTEM's hive
and desktop APIs do nothing. .msi and .msix payloads are never routed into the user's session
either. Per-user work belongs in login-once, login-every or on-demand, as a script. See
Windows Session Model.
You cannot, and no configuration changes that. Split the work: a privileged payload computes and
stages what it needs into a readable location such as
C:\ProgramData\ManagedState\share, and a login-every payload consumes it as the user.
It means the payload did not run because the console user's session could not be reached — not
that it failed. In reports\items.json it appears as Pending. Treat it as a state to watch
rather than an incident: the next sign-in retries. Alert on a payload that stays Pending across
many sessions and many machines, not on a single occurrence.
Because it is tracked in runonce-system.json, not per user. StartSet uses a per-user ledger only
for login-once, login-every and on-demand. If you need per-user semantics, use login-once.
This is a real divergence from outset.
Edit it. The ledger stores the payload's SHA256 and a content change re-arms it. Failing that, add
it to overrides (runs every time, ledger untouched) or clear the ledger entry:
managedstatekeeper remove-override MyPayload.ps1 --clear-runonce --user jsmithOnly a successful run is recorded, so it will be retried at the next matching trigger. A boot-once
payload is deleted from disk only after success.
PowerShell 7 (pwsh.exe) if it is installed, otherwise Windows PowerShell 5.1. Arguments are
-NoProfile -NonInteractive -ExecutionPolicy Bypass -File, and the working directory is the
payload directory. Test your payload the same way or you will hit differences you did not expect.
No. Payloads are invoked with -ExecutionPolicy Bypass.
No. Payloads in elevated directories must be owned by SYSTEM, the built-in Administrator,
Administrators, or a service SID; anything else is skipped with Permission validation failed.
That said, the check is on ownership rather than ACLs, so the ACLs on
C:\ProgramData\ManagedState are still worth reviewing in a hostile environment.
No. It has no repository, no update mechanism and no network client beyond a connectivity check (interface state, IPv4 default gateway, and a WMI fallback). It executes what is already on disk.
For a specific payload type, from an elevated shell:
managedstatekeeper process boot-everyTo go through the service — which is what you want for user-context payloads:
New-Item -ItemType File 'C:\ProgramData\ManagedState\.startset.ondemand' -ForceTo re-run boot payloads the way the service does:
Restart-Service StartSetYes. BootWorker runs at service start, not at OS boot specifically. That is the supported way to
test boot payloads — and something to remember before restarting the service on a live machine.
No. parallel_execution exists in the config schema but is not implemented; setting it logs a
warning and execution stays sequential in case-insensitive alphabetical order.
Prefix filenames. 10-, 20-, 90- is the usual convention.
Per-run directories under C:\ProgramData\ManagedState\logs\YYYY-MM-DD\HHMM\, plus aggregated
reports\, plus Warning-and-above in the Windows Application event log under source StartSet.
Retention is 30 days. Anything a payload writes loose into the logs directory is also aged out at
30 days, so put payload output elsewhere. See Logging and Reporting.
It is registered as a global option but no handler reads it — the log level comes from
Config.yaml. Set log_level: debug and restart the service.
Either the service was not restarted (preferences load once at start-up) or the key is misspelled
(unknown keys are ignored silently). Watch for ignored_network_failure, which has the -ed.
Only partly. A non-zero exit means a payload ran and returned non-zero. Timeouts, deferrals,
skipped permission and checksum checks, and unsupported extensions all leave the exit code at 0.
Read reports\items.json for the real picture.
No. The release workflow builds unsigned binaries and publishes startset-x64.zip and
startset-arm64.zip only. Sign them with your own certificate before fleet deployment — the
release notes include the signtool commands, and so does Installation.
No. C:\ProgramData\ManagedState survives both the MSI uninstall and a manual removal, so a
reinstall does not re-run every once payload. Delete it explicitly for a clean slate.
Nothing prevents it — the manifests declare Windows 10/11 compatibility and the code uses no client-only APIs — but Server is not exercised by the repository's CI or tests. Session 0 constraints are, if anything, more pronounced in a server or container context, and user-context payloads need a console session that may never exist there.
StartSet — MIT licensed — windowsadmins/startset — a Windows port of macadmins/outset.
StartSet
How it works
Migrating
Operating
Contributing