Skip to main content

Spawning Processes into Interactive Sessions

Starting a Windows process using .NET is normally an easy thing.
You call Process.Start() with a little setup, and the process runs.

But, that starts a process in the same Windows session as the thread that calls Process.Start().

This, of course, doesn’t work for a Windows Service, since a service runs in a non-interactive Windows session (session 0).

For a Windows Session to spawn processes into interactive user sessions, a few steps are required.

Specifically, we have to:

  • Identify the target session

  • Retrieve the primary access token

  • Duplicate the primary token

  • Copy environment variables

  • Assign the working directory

  • Create the process

Here’s a library that I’ve pieced together, that abstracts the calls and ceremony needed to start a process in an arbitrary Window session, without handle leakage.

LeeWhite187/OGA.ProcessExtensions.Windows.Lib

It was adapted from ng-pe/cassia and murrayju/CreateProcessAsUser

See the repository page for example usage.